Hex Artifact Content

Artifact c1293987234926900b4fa52a17de04f9bb7bd180:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f  .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20  _CODE.#  define 
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30  VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66   GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20  initions */./** 
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66  Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20  ISO7816         
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47    0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38  L_PLATFORM   0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69  0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  ons **/.#define 
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78  RESPONSE      0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41  _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64  RY       0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20  R_UPDATE_BINARY 
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65      0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30  ECT            0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c  S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23  _AUTH     0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45  TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e       0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e  e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52  STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69  ENCE  0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65  8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43  STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a  ENAUTH  0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69  ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a  on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20  TAG_CERTIFICATE 
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65          0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20  ERT_ISSUE_DATE  
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20     0x71.#define 
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78  XPIRE_DATE    0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49  72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20  SCIS_AID_CCC    
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41               0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c  x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49   0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30  _AID        0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20  03, 0x08, 0x00, 
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30  0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a  , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20   PIV IDs */./** 
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20  Key Identifiers 
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d  (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f  3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69  UTH   0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20  3_KEY_SIGNATURE 
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23  KEYMGT    0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55  _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c  TH  0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69  gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32  -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f  TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23  _RSA1024  0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62  48  0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73  ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33   (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65  -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20   2) **/.#define 
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35  ID_PIVAUTH   0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64  F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30  EYMGT    0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e  xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30  _OID_CARDAUTH  0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a  x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65  ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e   of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a   of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73   Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23   above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50  define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20  DU_MTU          
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52       250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e  _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31  e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a  ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49  #  ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64  ME_H.#    includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69  e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f  c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73   = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63  void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63  time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72  ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61  (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73  _time);.}.#  els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45  d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64  BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64  }.#  endif..#  d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20  UG_PRINTF(x...) 
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72  { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20   buf_user[4096] 
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e  = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a  tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78  eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e  ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e  GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62  c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78  UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66  096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 3b 20 5c 0a 09 75 6e 73 69  _user_p; \..unsi
1990: 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 73  gned long buf_us
19a0: 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 69  er_size; \..unsi
19b0: 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55  gned char *TMPBU
19c0: 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c  F; \..unsigned l
19d0: 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 20  ong idx; \..int 
19e0: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
19f0: 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 67  .TMPBUF = (unsig
1a00: 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 3b  ned char *) (x);
1a10: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d 20   \..buf_user[0] 
1a20: 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  = 0; \..buf_user
1a30: 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c  _p = buf_user; \
1a40: 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1a50: 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  = sizeof(buf_use
1a60: 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20  r); \..for (idx 
1a70: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1a80: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1a90: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1aa0: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1ab0: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1ac0: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1ad0: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1ae0: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1af0: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1b00: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1b10: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1b20: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1b30: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1b40: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1b50: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1b60: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1b70: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1b80: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1b90: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1ba0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
1bb0: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1bc0: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1bd0: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1be0: 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78 25 73  %s/%lu = {%02x%s
1bf0: 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  })\n", CACKEY_DE
1c00: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1c10: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1c20: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1c30: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1c40: 4d 50 42 55 46 5b 30 5d 2c 20 62 75 66 5f 75 73  MPBUF[0], buf_us
1c50: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
1c60: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1c70: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
1c80: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1c90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ca0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
1cb0: 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b  (void *) x, #x);
1cc0: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1cd0: 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79  tic FILE *cackey
1ce0: 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20  _debug_fd(void) 
1cf0: 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a  {..static FILE *
1d00: 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  fd = NULL;..char
1d10: 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20   *logfile;...if 
1d20: 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fd != NULL) {..
1d30: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1d40: 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20  ../*.. * Log to 
1d50: 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79  stderr initially
1d60: 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64   so we can use d
1d70: 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a  ebugging within.
1d80: 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  . * this functio
1d90: 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e  n without gettin
1da0: 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69  g into an infini
1db0: 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64  te loop.. */..fd
1dc0: 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67   = stderr;...log
1dd0: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1de0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1df0: 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66  ILE");..if (logf
1e00: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
1e10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e20: 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69  INTF("Found envi
1e30: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e40: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
1e50: 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74  ....logfile = st
1e60: 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d  rchr(logfile, '=
1e70: 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c  ');...if (logfil
1e80: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1e90: 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  logfile = getenv
1ea0: 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  ("CACKEY_DEBUG_L
1eb0: 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c  OGFILE");...} el
1ec0: 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b  se {....logfile+
1ed0: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  +;...}..}..#ifde
1ee0: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  f CACKEY_DEBUG_L
1ef0: 4f 47 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66  OGFILE..if (logf
1f00: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
1f10: 09 6c 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45  .logfile = CACKE
1f20: 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b  Y_DEBUG_LOGFILE;
1f30: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1f40: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1f50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f60: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1f70: 20 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20   log file: %s", 
1f80: 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20  logfile);....fd 
1f90: 3d 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c  = fopen(logfile,
1fa0: 20 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28   "a");..}...if (
1fb0: 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
1fc0: 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a  fd = stderr;..}.
1fd0: 0a 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65  ..if (fd == stde
1fe0: 72 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  rr) {...CACKEY_D
1ff0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2000: 75 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b  urning stderr");
2010: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
2020: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2030: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c  ("Returning %p",
2040: 20 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09   (void *) fd);..
2050: 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  }...return(fd);.
2060: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
2070: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2080: 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20  C_MALLOC(size_t 
2090: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
20a0: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65   *func, int line
20b0: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61  ) {..void *retva
20c0: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  l;...retval = ma
20d0: 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70  lloc(size);...fp
20e0: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
20f0: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2100: 20 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43   %s():%i: MALLOC
2110: 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b  () = %p\n", CACK
2120: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
2130: 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20  (), func, line, 
2140: 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68  retval);..fflush
2150: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2160: 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  ());...return(re
2170: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
2180: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
2190: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
21a0: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
21b0: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
21c0: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
21d0: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
21e0: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
21f0: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
2200: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
2210: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
2220: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2230: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2240: 20 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f   %s():%i: REALLO
2250: 43 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43  C(%p) = %p\n", C
2260: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
2270: 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e  IME(), func, lin
2280: 65 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b  e, ptr, retval);
2290: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
22a0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
22b0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
22c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
22d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22e0: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
22f0: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2300: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2310: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2320: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2330: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2340: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
2350: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2360: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
2370: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
2380: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
2390: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
23a0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
23b0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
23c0: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
23d0: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c  debug_fd(), "[%l
23e0: 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52  u]: %s():%i: STR
23f0: 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  DUP_MALLOC() = %
2400: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2410: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2420: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
2430: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
2440: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
2450: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
2460: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
2470: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2480: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
2490: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
24a0: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
24b0: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
24c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
24d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
24e0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
24f0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2500: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
2510: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2520: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
2530: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
2540: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
2550: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
2560: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2570: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
2580: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2590: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
25a0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
25b0: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
25c0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
25d0: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
25e0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
25f0: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
2600: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
2610: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
2620: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2630: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
2640: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2650: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2670: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2690: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
26b0: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
26c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
26d0: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
26e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
26f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2700: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
2710: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
2720: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2730: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
2740: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
2750: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
2770: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
2780: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
2790: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
27a0: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
27c0: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
27d0: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
27e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
27f0: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
2800: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2810: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
2820: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
2830: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2840: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
2850: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2860: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
2870: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2880: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
2890: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
28a0: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
28b0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
28c0: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
28d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
28e0: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
28f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
2900: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
2910: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
2920: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
2930: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
2940: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
2960: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2970: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
2980: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2990: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
29a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
29b0: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
29c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
29d0: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
29e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
29f0: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
2a00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2a10: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
2a20: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a30: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2a40: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
2a50: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2a60: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2a80: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
2a90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
2aa0: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
2ab0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2ac0: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
2ad0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2ae0: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
2af0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2b00: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
2b10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b20: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
2b30: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b40: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
2b50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2b60: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2b70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2b90: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
2ba0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2bb0: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
2bc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2bd0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
2be0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bf0: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
2c00: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c10: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2c20: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c30: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2c40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2c50: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2c60: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2c70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2c80: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2c90: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2ca0: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
2cb0: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2cc0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
2cd0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
2ce0: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
2cf0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d00: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d20: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2d30: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2d40: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2d50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2d60: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2d70: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2d80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2d90: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2da0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
2db0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2dc0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
2dd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2de0: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
2df0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2e00: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2e20: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2e30: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2e40: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2e50: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2e60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2e70: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2e80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2e90: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2ea0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2eb0: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
2ec0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
2ed0: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
2ee0: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
2ef0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f00: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2f10: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f20: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2f30: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f40: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2f50: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2f60: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2f70: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f80: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2f90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2fa0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2fc0: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
2fd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fe0: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
2ff0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
3000: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3010: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
3020: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
3030: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
3040: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
3050: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
3060: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
3070: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
3080: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
3090: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
30a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
30b0: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
30c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
30d0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
30e0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
30f0: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
3100: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
3110: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3120: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
3130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
3140: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
3150: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
3160: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
3170: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
3180: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
3190: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
31a0: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
31b0: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
31c0: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
31d0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
31e0: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
31f0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3200: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
3210: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3220: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
3230: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3240: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
3250: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
3260: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
3270: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
3280: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3290: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
32a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
32b0: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
32c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
32d0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
32e0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
32f0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
3300: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3310: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
3320: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
3330: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3340: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
3350: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3360: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
3370: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3380: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
3390: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
33a0: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
33b0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
33c0: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
33d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33e0: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3400: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
3410: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3420: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
3430: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3440: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
3450: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3460: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
3470: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
3480: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
3490: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
34a0: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
34b0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
34c0: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
34d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34e0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
34f0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3500: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
3510: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3520: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
3530: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3540: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
3550: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3560: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
3570: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3580: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
3590: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
35a0: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
35b0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
35c0: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
35d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
35e0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
35f0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3600: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
3610: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
3620: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
3630: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
3640: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
3650: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
3660: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
3670: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
3680: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3690: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
36a0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
36b0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
36c0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
36d0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
36e0: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
36f0: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
3700: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
3710: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3720: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
3730: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3740: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
3750: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
3760: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
3770: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
3780: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
3790: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
37a0: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
37b0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
37c0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
37d0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37e0: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
37f0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3800: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3810: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
3820: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
3830: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
3840: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
3850: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
3860: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3870: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
3880: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3890: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
38a0: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
38b0: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
38c0: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
38d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
38e0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
38f0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3900: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
3910: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3920: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
3930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3940: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
3950: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3960: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
3970: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3980: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
3990: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
39a0: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52  SCARD_E_UNSUPPOR
39b0: 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09  TED_FEATURE:....
39c0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
39d0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54  UNSUPPORTED_FEAT
39e0: 55 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43  URE");.#ifdef SC
39f0: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
3a00: 41 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44  ARD...case SCARD
3a10: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a30: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
3a40: 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  RD");.#endif.#if
3a50: 64 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  def SCARD_E_NO_R
3a60: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
3a70: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3a80: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3a90: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
3aa0: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44  "SCARD_E_NO_READ
3ab0: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b  ERS_AVAILABLE");
3ac0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74  .#endif..}...ret
3ad0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3ae0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3af0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3b00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
3b10: 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62  _STR(uint16_t ob
3b20: 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28  jid) {..switch (
3b30: 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20  objid) {...case 
3b40: 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x2000:....retur
3b50: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3b60: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22  JID_GENERALINFO"
3b70: 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30  );...case 0x2100
3b80: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3b90: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
3ba0: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b  OPERSONALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a  ...case 0x3000:.
3bc0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3bd0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
3be0: 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63  SSCONTROL");...c
3bf0: 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72  ase 0x4000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b  V_OBJID_LOGIN");
3c20: 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a  ...case 0x5000:.
3c30: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c40: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
3c50: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3c60: 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x6000:....return
3c70: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3c80: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b  ID_BIOMETRICS");
3c90: 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a  ...case 0x7000:.
3ca0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3cb0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
3cc0: 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09  TALSIGCERT");...
3cd0: 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09  case 0x0200:....
3ce0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cf0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d00: 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SON");...case 0x
3d10: 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  0202:....return(
3d20: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d30: 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29  D_CAC_BENEFITS")
3d40: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a  ;...case 0x0203:
3d50: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3d60: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3d70: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29  _OTHERBENEFITS")
3d80: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a  ;...case 0x0201:
3d90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3da0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3db0: 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09  _PERSONNEL");...
3dc0: 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09  case 0x02FE:....
3dd0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3de0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
3df0: 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65  CERT");..}....re
3e00: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3e10: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3e20: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
3e30: 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45  BUG_FUNC_APPTYPE
3e40: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20  _TO_STR(uint8_t 
3e50: 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74  apptype) {..swit
3e60: 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09  ch (apptype) {..
3e70: 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72  .case 0x00:....r
3e80: 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09  eturn("NONE");..
3e90: 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72  .case 0x01:....r
3ea0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3eb0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b  V_APP_GENERIC");
3ec0: 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
3ed0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3ee0: 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09  TLV_APP_SKI");..
3ef0: 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72  .case 0x03:....r
3f00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f10: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3f20: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3f30: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3f40: 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  4:....return("CA
3f50: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
3f60: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a  ");...case 0x05:
3f70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3f80: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3f90: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
3fa0: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
3fb0: 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72  e 0x06:....retur
3fc0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3fd0: 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54  P_SKI | CACKEY_T
3fe0: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3ff0: 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65  case 0x07:....re
4000: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
4010: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
4020: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
4030: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
4040: 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72  PP_PKI");..}...r
4050: 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29  eturn("INVALID")
4060: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
4070: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
4080: 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42  EBUG_FUNC_ATTRIB
4090: 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54  UTE_TO_STR(CK_AT
40a0: 54 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74  TRIBUTE_TYPE att
40b0: 72 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74  r) {..switch (at
40c0: 74 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41  tr) {...case CKA
40d0: 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72  _CLASS:....retur
40e0: 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a  n("CKA_CLASS");.
40f0: 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
4100: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4110: 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65  _TOKEN");...case
4120: 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
4130: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4140: 56 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43  VATE");...case C
4150: 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74  KA_LABEL:....ret
4160: 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29  urn("CKA_LABEL")
4170: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50  ;...case CKA_APP
4180: 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74  LICATION:....ret
4190: 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41  urn("CKA_APPLICA
41a0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  TION");...case C
41b0: 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74  KA_VALUE:....ret
41c0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29  urn("CKA_VALUE")
41d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a  ;...case CKA_OBJ
41e0: 45 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72  ECT_ID:....retur
41f0: 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  n("CKA_OBJECT_ID
4200: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ");...case CKA_C
4210: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
4220: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4230: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
4240: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
4250: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
4260: 28 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a  ("CKA_ISSUER");.
4270: 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
4280: 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74  L_NUMBER:....ret
4290: 75 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f  urn("CKA_SERIAL_
42a0: 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65  NUMBER");...case
42b0: 20 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a   CKA_AC_ISSUER:.
42c0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
42d0: 43 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  C_ISSUER");...ca
42e0: 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09  se CKA_OWNER:...
42f0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e  .return("CKA_OWN
4300: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4310: 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09  _ATTR_TYPES:....
4320: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52  return("CKA_ATTR
4330: 5f 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65  _TYPES");...case
4340: 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
4350: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55  .return("CKA_TRU
4360: 53 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43  STED");...case C
4370: 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
4380: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f  return("CKA_KEY_
4390: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TYPE");...case C
43a0: 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72  KA_SUBJECT:....r
43b0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45  eturn("CKA_SUBJE
43c0: 43 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  CT");...case CKA
43d0: 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ID:....return("
43e0: 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65  CKA_ID");...case
43f0: 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
4400: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4410: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4420: 73 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a  se CKA_ENCRYPT:.
4430: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4440: 4e 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65  NCRYPT");...case
4450: 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
4460: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43  .return("CKA_DEC
4470: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
4480: 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75  KA_WRAP:....retu
4490: 72 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a  rn("CKA_WRAP");.
44a0: 09 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41  ..case CKA_UNWRA
44b0: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
44c0: 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61  A_UNWRAP");...ca
44d0: 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
44e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
44f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4500: 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
4510: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4520: 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61  _RECOVER");...ca
4530: 73 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09  se CKA_VERIFY:..
4540: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
4550: 52 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43  RIFY");...case C
4560: 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45  KA_VERIFY_RECOVE
4570: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
4580: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
4590: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
45a0: 45 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ERIVE:....return
45b0: 28 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a  ("CKA_DERIVE");.
45c0: 09 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54  ..case CKA_START
45d0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
45e0: 28 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45  ("CKA_START_DATE
45f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4600: 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  ND_DATE:....retu
4610: 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45  rn("CKA_END_DATE
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ");...case CKA_M
4630: 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72  ODULUS:....retur
4640: 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29  n("CKA_MODULUS")
4650: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
4660: 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65  ULUS_BITS:....re
4670: 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55  turn("CKA_MODULU
4680: 53 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65  S_BITS");...case
4690: 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
46a0: 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  NENT:....return(
46b0: 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f  "CKA_PUBLIC_EXPO
46c0: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
46d0: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
46e0: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
46f0: 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f  CKA_PRIVATE_EXPO
4700: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4710: 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72  KA_PRIME_1:....r
4720: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45  eturn("CKA_PRIME
4730: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
4740: 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74  _PRIME_2:....ret
4750: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32  urn("CKA_PRIME_2
4760: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4770: 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65  XPONENT_1:....re
4780: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
4790: 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_1");...case C
47a0: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09  KA_EXPONENT_2:..
47b0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58  ..return("CKA_EX
47c0: 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61  PONENT_2");...ca
47d0: 73 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45  se CKA_COEFFICIE
47e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
47f0: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29  KA_COEFFICIENT")
4800: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4810: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ME:....return("C
4820: 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  KA_PRIME");...ca
4830: 73 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a  se CKA_SUBPRIME:
4840: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4850: 53 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  SUBPRIME");...ca
4860: 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09  se CKA_BASE:....
4870: 72 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45  return("CKA_BASE
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4890: 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  RIME_BITS:....re
48a0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
48b0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
48c0: 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54  KA_SUB_PRIME_BIT
48d0: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
48e0: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
48f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4900: 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  ALUE_BITS:....re
4910: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f  turn("CKA_VALUE_
4920: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4930: 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09  KA_VALUE_LEN:...
4940: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
4950: 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65  UE_LEN");...case
4960: 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
4970: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4980: 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a  _EXTRACTABLE");.
4990: 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c  ..case CKA_LOCAL
49a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49b0: 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65  _LOCAL");...case
49c0: 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41   CKA_NEVER_EXTRA
49d0: 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  CTABLE:....retur
49e0: 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54  n("CKA_NEVER_EXT
49f0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
4a00: 73 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  se CKA_ALWAYS_SE
4a10: 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75  NSITIVE:....retu
4a20: 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53  rn("CKA_ALWAYS_S
4a30: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4a40: 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  se CKA_KEY_GEN_M
4a50: 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74  ECHANISM:....ret
4a60: 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e  urn("CKA_KEY_GEN
4a70: 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09  _MECHANISM");...
4a80: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  case CKA_MODIFIA
4a90: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4aa0: 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29  CKA_MODIFIABLE")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44  ;...case CKA_ECD
4ac0: 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65  SA_PARAMS:....re
4ad0: 74 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f  turn("CKA_ECDSA_
4ae0: 50 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65  PARAMS");...case
4af0: 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09   CKA_EC_POINT:..
4b00: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43  ..return("CKA_EC
4b10: 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65  _POINT");...case
4b20: 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41   CKA_SECONDARY_A
4b30: 55 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UTH:....return("
4b40: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4b50: 54 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TH");...case CKA
4b60: 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a  _AUTH_PIN_FLAGS:
4b70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4b80: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29  AUTH_PIN_FLAGS")
4b90: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f  ;...case CKA_HW_
4ba0: 46 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09  FEATURE_TYPE:...
4bb0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f  .return("CKA_HW_
4bc0: 46 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a  FEATURE_TYPE");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54  ..case CKA_RESET
4be0: 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74  _ON_INIT:....ret
4bf0: 75 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f  urn("CKA_RESET_O
4c00: 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65  N_INIT");...case
4c10: 20 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a   CKA_HAS_RESET:.
4c20: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48  ...return("CKA_H
4c30: 41 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61  AS_RESET");...ca
4c40: 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45  se CKA_VENDOR_DE
4c50: 46 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  FINED:....return
4c60: 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  ("CKA_VENDOR_DEF
4c70: 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  INED");..}...ret
4c80: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
4c90: 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c  }..#  define mal
4ca0: 6c 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45  loc(x) CACKEY_DE
4cb0: 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28  BUG_FUNC_MALLOC(
4cc0: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  x, __func__, __L
4cd0: 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65  INE__).#  define
4ce0: 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43   realloc(x, y) C
4cf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4d00: 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f  _REALLOC(x, y, _
4d10: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4d20: 5f 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64  _).#  ifdef strd
4d30: 75 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74  up.#    undef st
4d40: 72 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20  rdup.#  endif.# 
4d50: 20 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78   define strdup(x
4d60: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
4d70: 55 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f  UNC_STRDUP(x, __
4d80: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4d90: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
4da0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
4db0: 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f  RINTF(x...) /**/
4dc0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4dd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
4de0: 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23  (f, x, y) /**/.#
4df0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e00: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
4e10: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e20: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e30: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e40: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4e50: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e60: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e70: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e80: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
4e90: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4ea0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4eb0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4ec0: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
4ed0: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4ee0: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4ef0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4f00: 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
4f10: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4f20: 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f  ABLED".#endif../
4f30: 2a 0a 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65  *. * Include the
4f40: 73 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20  se source files 
4f50: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74  in this translat
4f60: 69 6f 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74  ion unit so that
4f70: 20 77 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a   we can bind to.
4f80: 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64   * functions and
4f90: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79   not include any
4fa0: 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20   symbols in the 
4fb0: 6f 75 74 70 75 74 20 73 68 61 72 65 64 20 6f 62  output shared ob
4fc0: 6a 65 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75  ject.. */.#inclu
4fd0: 64 65 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22  de "asn1-x509.c"
4fe0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e  .#include "sha1.
4ff0: 63 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35  c".#include "md5
5000: 2e 63 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .c"..typedef enu
5010: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54  m {..CACKEY_ID_T
5020: 59 50 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59  YPE_CAC,..CACKEY
5030: 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43  _ID_TYPE_PIV,..C
5040: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
5050: 52 54 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79  RT_ONLY.} cackey
5060: 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a  _pcsc_id_type;..
5070: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
5080: 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63  sc_identity {..c
5090: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
50a0: 70 65 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69  pe id_type;...si
50b0: 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65  ze_t certificate
50c0: 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  _len;..unsigned 
50d0: 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74  char *certificat
50e0: 65 3b 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79  e;...ssize_t key
50f0: 73 69 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a  size;...union {.
5100: 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e  ..struct {....un
5110: 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c  signed char appl
5120: 65 74 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36  et[7];....uint16
5130: 5f 74 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63  _t file;...} cac
5140: 3b 0a 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09  ;....struct {...
5150: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b  .unsigned char k
5160: 65 79 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c  ey_id;....char l
5170: 61 62 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69  abel[32];...} pi
5180: 76 3b 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a  v;..} card;.};..
5190: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
51a0: 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74  entity {..struct
51b0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
51c0: 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
51d0: 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49  tity;...CK_ATTRI
51e0: 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65 73  BUTE *attributes
51f0: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72  ;..CK_ULONG attr
5200: 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b  ibutes_count;.};
5210: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5220: 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61  session {..int a
5230: 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54  ctive;...CK_SLOT
5240: 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b  _ID slotID;...CK
5250: 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43  _STATE state;..C
5260: 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09  K_FLAGS flags;..
5270: 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63  CK_ULONG ulDevic
5280: 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44  eError;..CK_VOID
5290: 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
52a0: 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f  n;..CK_NOTIFY No
52b0: 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63  tify;...struct c
52c0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
52d0: 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
52e0: 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
52f0: 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69  ities_count;...i
5300: 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76 65  nt search_active
5310: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ;..CK_ATTRIBUTE_
5320: 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72 79  PTR search_query
5330: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72  ;..CK_ULONG sear
5340: 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a  ch_query_count;.
5350: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
5360: 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a  earch_curr_id;..
5370: 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65  .int sign_active
5380: 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  ;..CK_MECHANISM_
5390: 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e  TYPE sign_mechan
53a0: 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54  ism;..CK_BYTE_PT
53b0: 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73  R sign_buf;..uns
53c0: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f  igned long sign_
53d0: 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65  buflen;..unsigne
53e0: 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75  d long sign_bufu
53f0: 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63  sed;..struct cac
5400: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69  key_identity *si
5410: 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69  gn_identity;...i
5420: 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 69 76  nt decrypt_activ
5430: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  e;..CK_MECHANISM
5440: 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65  _TYPE decrypt_me
5450: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49  chanism;..CK_VOI
5460: 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65  D_PTR decrypt_me
5470: 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f  ch_parm;..CK_ULO
5480: 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  NG decrypt_mech_
5490: 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74  parmlen;..struct
54a0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
54b0: 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69   *decrypt_identi
54c0: 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  ty;.};..struct c
54d0: 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e  ackey_slot {..in
54e0: 74 20 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69  t active;..int i
54f0: 6e 74 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20  nternal;...char 
5500: 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09  *pcsc_reader;...
5510: 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f  int pcsc_card_co
5520: 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48  nnected;..SCARDH
5530: 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b  ANDLE pcsc_card;
5540: 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69  ...int transacti
5550: 6f 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74  on_depth;..int t
5560: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
5570: 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73  hw_lock;...int s
5580: 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f  lot_reset;...CK_
5590: 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67  FLAGS token_flag
55a0: 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  s;...unsigned ch
55b0: 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f  ar *label;...DWO
55c0: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75  RD protocol;...u
55d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68  nsigned int cach
55e0: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
55f0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
5600: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
5610: 63 68 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a  ched_certs;.};..
5620: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09  typedef enum {..
5630: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
5640: 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09  ENERIC = 0x01,..
5650: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
5660: 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09  KI     = 0x02,..
5670: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
5680: 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20  KI     = 0x04.} 
5690: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
56a0: 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  pe;..typedef enu
56b0: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
56c0: 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46  OBJID_GENERALINF
56d0: 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30  O       = 0x2000
56e0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
56f0: 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49  JID_PROPERSONALI
5700: 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a  NFO   = 0x2100,.
5710: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5720: 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20  D_ACCESSCONTROL 
5730: 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43      = 0x3000,..C
5740: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5750: 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20  LOGIN           
5760: 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43    = 0x4000,..CAC
5770: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5780: 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20  RDINFO          
5790: 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x5000,..CACKE
57a0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d  Y_TLV_OBJID_BIOM
57b0: 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20  ETRICS        = 
57c0: 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x6000,..CACKEY_
57d0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
57e0: 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78  LSIGCERT    = 0x
57f0: 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  7000,..CACKEY_TL
5800: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
5810: 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32  ON        = 0x02
5820: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5830: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49  OBJID_CAC_BENEFI
5840: 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32  TS      = 0x0202
5850: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5860: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
5870: 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a  EFITS = 0x0203,.
5880: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5890: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20  D_CAC_PERSONNEL 
58a0: 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43      = 0x0201,..C
58b0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
58c0: 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20  CAC_PKICERT     
58d0: 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63    = 0x02FE.} cac
58e0: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
58f0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
5900: 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  {..CACKEY_PCSC_S
5910: 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20  _TOKENPRESENT   
5920: 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43   = 1,..CACKEY_PC
5930: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5940: 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45       = 0,..CACKE
5950: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5960: 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09           = -1,..
5970: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
5980: 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20  DPIN          = 
5990: 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -2,..CACKEY_PCSC
59a0: 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20  _E_LOCKED       
59b0: 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59     = -3,..CACKEY
59c0: 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
59d0: 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43  N       = -4,..C
59e0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
59f0: 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d  ENABSENT     = -
5a00: 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  6,..CACKEY_PCSC_
5a10: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 20  E_RETRY         
5a20: 20 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f    = -7.} cackey_
5a30: 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ret;..struct cac
5a40: 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20  key_tlv_cardurl 
5a50: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
5a60: 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a          rid[5];.
5a70: 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74  .cackey_tlv_appt
5a80: 79 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09  ype   apptype;..
5a90: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5aa0: 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09  tid  objectid;..
5ab0: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5ac0: 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73  tid  appid;..uns
5ad0: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
5ae0: 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72    pinid;.};..str
5af0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
5b00: 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61  ntity;.struct ca
5b10: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
5b20: 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a  {..uint8_t tag;.
5b30: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
5b40: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64  ..union {...void
5b50: 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63   *value;...struc
5b60: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
5b70: 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64  durl *value_card
5b80: 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76  url;...uint8_t v
5b90: 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a  alue_byte;..};..
5ba0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5bb0: 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74  lv_entity *_next
5bc0: 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20  ;.};../* CACKEY 
5bd0: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
5be0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
5bf0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20  ackey_biglock = 
5c00: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72  NULL;.static str
5c10: 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uct cackey_sessi
5c20: 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  on cackey_sessio
5c30: 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ns[128];.static 
5c40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5c50: 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ot cackey_slots[
5c60: 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  128];.static int
5c70: 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69   cackey_initiali
5c80: 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  zed = 0;.static 
5c90: 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f  int cackey_biglo
5ca0: 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f  ck_init = 0;.CK_
5cb0: 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
5cc0: 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a  S cackey_args;..
5cd0: 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66  /** Extra certif
5ce0: 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64  icates to includ
5cf0: 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73  e in token **/.s
5d00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5d10: 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61  c_identity extra
5d20: 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e  _certs[] = {.#in
5d30: 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75  clude "cackey_bu
5d40: 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d  iltin_certs.h".}
5d50: 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  ;..#define CACKE
5d60: 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f  Y_MACRO_DEFAULT_
5d70: 58 53 54 52 28 73 74 72 29 20 43 41 43 4b 45 59  XSTR(str) CACKEY
5d80: 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53  _MACRO_DEFAULT_S
5d90: 54 52 28 73 74 72 29 0a 23 64 65 66 69 6e 65 20  TR(str).#define 
5da0: 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
5db0: 41 55 4c 54 5f 53 54 52 28 73 74 72 29 20 23 73  AULT_STR(str) #s
5dc0: 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64  tr../* Protected
5dd0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
5de0: 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  Path command */.
5df0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5e00: 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
5e10: 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 65 61 64  = NULL;../* Read
5e20: 65 72 20 45 78 63 6c 75 73 69 6f 6e 20 6f 72 20  er Exclusion or 
5e30: 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 2a 2f 0a  Include-only */.
5e40: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5e50: 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
5e60: 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b  ude_only = NULL;
5e70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61  .static char *ca
5e80: 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
5e90: 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  lude = NULL;../*
5ea0: 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e   PCSC Global Han
5eb0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c  dles */.static L
5ec0: 50 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61  PSCARDCONTEXT ca
5ed0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5ee0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63   = NULL;..static
5ef0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63   unsigned long c
5f00: 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
5f10: 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63  (void) {..static
5f20: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72   unsigned long r
5f30: 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e  etval = 255;..un
5f40: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f  signed long majo
5f50: 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64  r = 0;..unsigned
5f60: 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b   long minor = 0;
5f70: 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74  ..char *major_st
5f80: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20  r = NULL;..char 
5f90: 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c  *minor_str = NUL
5fa0: 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  L;...CACKEY_DEBU
5fb0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
5fc0: 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  .");...if (retva
5fd0: 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41  l != 255) {...CA
5fe0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5ff0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
6000: 6c 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72  lx (cached).", r
6010: 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72  etval);....retur
6020: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  n(retval);..}...
6030: 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66  retval = 0;..#if
6040: 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
6050: 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f  ION.        majo
6060: 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f  r_str = PACKAGE_
6070: 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61  VERSION;..if (ma
6080: 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20  jor_str) {..    
6090: 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74      major = strt
60a0: 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26  oul(major_str, &
60b0: 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a  minor_str, 10);.
60c0: 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72  ...if (minor_str
60d0: 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73  ) {....minor = s
60e0: 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72  trtoul(minor_str
60f0: 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b   + 1, NULL, 10);
6100: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  ...}..}...retval
6110: 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29   = (major << 16)
6120: 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b   | (minor << 8);
6130: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
6140: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
6150: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c  eturning 0x%lx",
6160: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
6170: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
6180: 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20  * PC/SC Related 
6190: 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a  Functions */./*.
61a0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
61b0: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73     void cackey_s
61c0: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
61d0: 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  all(void);. *. *
61e0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
61f0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6200: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6210: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
6220: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6230: 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63  nction disconnec
6240: 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64  ts from all card
6250: 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  s.. *. */.static
6260: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
6270: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6280: 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33  l(void) {..uint3
6290: 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
62a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
62b0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72  Called.");...for
62c0: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
62d0: 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
62e0: 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
62f0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
6300: 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
6310: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
6320: 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  dx].internal) {.
6330: 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72  .../* Skip inter
6340: 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09  nal slots */....
6350: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
6360: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
6370: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
6380: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
6390: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
63a0: 49 4e 54 46 28 22 53 43 61 72 64 44 69 73 63 6f  INTF("SCardDisco
63b0: 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c 65  nnect(%lu) calle
63c0: 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d", (unsigned lo
63d0: 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53 43  ng) idx);.....SC
63e0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63 61  ardDisconnect(ca
63f0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
6400: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
6410: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
6420: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
6430: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
6440: 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
6450: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
6460: 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  bel);.....cackey
6470: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
6480: 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
6490: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
64a0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
64b0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61  nected = 0;...ca
64c0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
64d0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
64e0: 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
64f0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
6500: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
6510: 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28  ock = 0;....if (
6520: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6530: 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
6540: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6550: 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69  TF("Marking acti
6560: 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62  ve slot %lu as b
6570: 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e  eing reset", (un
6580: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78  signed long) idx
6590: 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
65a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
65b0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a  _reset = 1;..}..
65c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
65d0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22  INTF("Returning"
65e0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
65f0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
6600: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
6610: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
6620: 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  nect(void);. *. 
6630: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6640: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
6650: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6660: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
6670: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
6680: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
6690: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
66a0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
66b0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
66c0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
66d0: 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20  connects to the 
66e0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
66f0: 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64   Manager and upd
6700: 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20  ates the. *     
6710: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20  global handle.. 
6720: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
6730: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
6740: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64  csc_connect(void
6750: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
6760: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b  est_context_ret;
6770: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
6780: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
6790: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76  ..LONG scard_isv
67a0: 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66  alid_ret;.#endif
67b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
67c0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
67d0: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
67e0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
67f0: 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
6800: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61  pcsc_handle = ma
6810: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63  lloc(sizeof(*cac
6820: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6830: 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
6840: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
6850: 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ULL) {....CACKEY
6860: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6870: 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20  all to malloc() 
6880: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
6890: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
68a0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
68b0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
68c0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
68d0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
68e0: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  RIC);...}....CAC
68f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6900: 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  ("SCardEstablish
6910: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64  Context() called
6920: 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f  ");...scard_est_
6930: 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43  context_ret = SC
6940: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6950: 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f  ext(SCARD_SCOPE_
6960: 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55  SYSTEM, NULL, NU
6970: 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  LL, cackey_pcsc_
6980: 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73  handle);...if (s
6990: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
69a0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
69b0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41  SUCCESS) {....CA
69c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
69d0: 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64  F("Call to SCard
69e0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
69f0: 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65   failed (returne
6a00: 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72  d %s/%li), retur
6a10: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6a20: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
6a30: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
6a40: 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  STR(scard_est_co
6a50: 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  ntext_ret), (lon
6a60: 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  g) scard_est_con
6a70: 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66  text_ret);.....f
6a80: 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  ree(cackey_pcsc_
6a90: 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b  handle);....cack
6aa0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
6ab0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65   NULL;.....cacke
6ac0: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
6ad0: 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65  ct_all();.....re
6ae0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6af0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
6b00: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ..}..#ifdef HAVE
6b10: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
6b20: 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42  TEXT..CACKEY_DEB
6b30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
6b40: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29  IsValidContext()
6b50: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72   called");..scar
6b60: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20  d_isvalid_ret = 
6b70: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
6b80: 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ext(*cackey_pcsc
6b90: 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73  _handle);..if (s
6ba0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
6bb0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6bc0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
6bd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
6be0: 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20  ndle has become 
6bf0: 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49 73  invalid (SCardIs
6c00: 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25  ValidContext = %
6c10: 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74  s/%li), trying t
6c20: 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e  o re-establish..
6c30: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
6c40: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
6c50: 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76 61  O_STR(scard_isva
6c60: 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  lid_ret), (long)
6c70: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
6c80: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
6c90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
6ca0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6cb0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
6cc0: 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  .scard_est_conte
6cd0: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73  xt_ret = SCardEs
6ce0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53  tablishContext(S
6cf0: 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45  CARD_SCOPE_SYSTE
6d00: 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63  M, NULL, NULL, c
6d10: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6d20: 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f  e);...if (scard_
6d30: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6d40: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6d50: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
6d60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6d70: 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62  ll to SCardEstab
6d80: 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c  lishContext fail
6d90: 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f  ed (returned %s/
6da0: 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  %li), returning 
6db0: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43  in failure", CAC
6dc0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
6dd0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
6de0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6df0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
6e00: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6e10: 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63  ret);.....free(c
6e20: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6e30: 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  e);....cackey_pc
6e40: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
6e50: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
6e60: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6e70: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
6e80: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6e90: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43  NERIC);...}....C
6ea0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6eb0: 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62  TF("Handle has b
6ec0: 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68  een re-establish
6ed0: 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  ed");..}.#endif.
6ee0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6ef0: 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c  RINTF("Sucessful
6f00: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ly connected to 
6f10: 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67  PC/SC, returning
6f20: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a   in success");..
6f30: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6f40: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6f50: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6f60: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
6f70: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
6f80: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
6f90: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
6fa0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
6fb0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
6fc0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
6fd0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
6fe0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
6ff0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7000: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
7010: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
7020: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
7030: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
7040: 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  m the PC/SC Conn
7050: 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61  ection manager a
7060: 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20  nd updates. *   
7070: 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e    the global han
7080: 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  dle.. *. */.stat
7090: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
70a0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
70b0: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f  nect(void) {..LO
70c0: 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  NG scard_rel_con
70d0: 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  text_ret;...CACK
70e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
70f0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7100: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
7110: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
7120: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7130: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
7140: 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65  .scard_rel_conte
7150: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  xt_ret = SCardRe
7160: 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61  leaseContext(*ca
7170: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7180: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
7190: 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09  pcsc_handle) {..
71a0: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
71b0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63  c_handle);.....c
71c0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
71d0: 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69  e = NULL;..}...i
71e0: 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  f (scard_rel_con
71f0: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
7200: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
7210: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7220: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7230: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
7240: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
7250: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
7260: 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63  . *     void cac
7270: 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
7280: 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  set(struct cacke
7290: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
72a0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
72b0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
72c0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
72d0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
72e0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
72f0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73  s function marks
7300: 20 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76 69   a slot has havi
7310: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20 74  ng been reset, t
7320: 6f 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61 6e  o later be clean
7330: 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c  ed up.. *     Cl
7340: 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70 65  eanup only happe
7350: 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23 31  ns when a PKCS#1
7360: 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43  1 client calls C
7370: 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
7380: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
7390: 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b  void cackey_mark
73a0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75  _slot_reset(stru
73b0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
73c0: 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f  slot) {..if (slo
73d0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
73e0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b  eturn;..}...CACK
73f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7400: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7410: 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   (slot->pcsc_car
7420: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
7430: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
7440: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7450: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
7460: 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  RD);..}...slot->
7470: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
7480: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
7490: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
74a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
74b0: 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
74c0: 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   {...slot->token
74d0: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
74e0: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20  IN_REQUIRED;..} 
74f0: 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74  else {...slot->t
7500: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
7510: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
7520: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
7530: 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ing.");...return
7540: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7550: 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20  SIS. *     LONG 
7560: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
7570: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
7580: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
7590: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
75a0: 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41  otocol);. *. * A
75b0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
75c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
75d0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
75e0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
75f0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
7600: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
7610: 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20  otocol. *       
7620: 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74    Protocol to at
7630: 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20  tempt first. *. 
7640: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7650: 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e  *     The return
7660: 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72   value from SCar
7670: 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a  dReconnect(). *.
7680: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
7690: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
76a0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
76b0: 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  d SCardReconnect
76c0: 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65  (). *. *     The
76d0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
76e0: 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  ) function call 
76f0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66  will be called f
7700: 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a  irst with the. *
7710: 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64       dwPreferred
7720: 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65  Protocols of "de
7730: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e  fault_protocol".
7740: 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72    If that call r
7750: 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43  eturns. *     SC
7760: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7770: 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77  ATCH try again w
7780: 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f  ith a protocol o
7790: 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69  f T=0, and faili
77a0: 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54  ng. *     that T
77b0: 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  =1.. *. */.stati
77c0: 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65  c LONG cackey_re
77d0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
77e0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
77f0: 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66  *slot, DWORD def
7800: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b  ault_protocol) {
7810: 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64  ..DWORD selected
7820: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47  _protocol;..LONG
7830: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
7840: 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  ...selected_prot
7850: 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72  ocol = 0;...scar
7860: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7870: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
7880: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7890: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
78a0: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
78b0: 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  l, SCARD_RESET_C
78c0: 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70  ARD, &selected_p
78d0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28  rotocol);...if (
78e0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
78f0: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7900: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41  MISMATCH) {...CA
7910: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7920: 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  F("SCardReconnec
7930: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7940: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7950: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
7960: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63   just T=0")...sc
7970: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7980: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7990: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
79a0: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
79b0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
79c0: 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T0, SCARD_RESE
79d0: 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65  T_CARD, &selecte
79e0: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09  d_protocol);....
79f0: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7a00: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
7a10: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
7a20: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7a30: 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63  PRINTF("SCardRec
7a40: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7a50: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7a60: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7a70: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
7a80: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7a90: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7aa0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7ab0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7ac0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7ad0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52  ROTOCOL_T1, SCAR
7ae0: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73  D_RESET_CARD, &s
7af0: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7b00: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
7b10: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7b20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7b30: 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f  S) {...slot->pro
7b40: 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64  tocol = selected
7b50: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09  _protocol;..}...
7b60: 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e  return(scard_con
7b70: 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n_ret);.}../*. *
7b80: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
7b90: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7ba0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
7bb0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7bc0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
7bd0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
7be0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
7bf0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
7c00: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
7c10: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
7c20: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7c30: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
7c40: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7c50: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7c60: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7c70: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7c80: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7c90: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
7ca0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
7cb0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7cc0: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7cd0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
7ce0: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
7cf0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
7d00: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
7d10: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
7d20: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
7d30: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
7d40: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
7d50: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
7d60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
7d70: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
7d80: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
7d90: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
7da0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7db0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7dc0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
7dd0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
7de0: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
7df0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
7e00: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
7e10: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
7e20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7e30: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
7e40: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
7e50: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7e60: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
7e70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7e80: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
7e90: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
7ea0: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
7eb0: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
7ec0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
7ed0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7ee0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7ef0: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
7f00: 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20  d for slot %p", 
7f10: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
7f20: 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72  r, slot);...scar
7f30: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7f40: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
7f50: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
7f60: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7f70: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7f80: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7f90: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
7fa0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
7fb0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
7fc0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66  protocol);....if
7fd0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
7fe0: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
7ff0: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8000: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8010: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
8020: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
8030: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
8040: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
8050: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09  h just T=0")....
8060: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8070: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
8080: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
8090: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
80a0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
80b0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
80c0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c  PROTOCOL_T0, &sl
80d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
80e0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
80f0: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8100: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
8110: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
8120: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8130: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8140: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8150: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8160: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
8170: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
8180: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8190: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
81a0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
81b0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
81c0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
81d0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
81e0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
81f0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8200: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
8210: 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  .}...}....if (sc
8220: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
8230: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
8240: 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  D_CARD) {....CAC
8250: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8260: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
8270: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
8280: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
8290: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63  , trying to re-c
82a0: 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09  onnect...");....
82b0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
82c0: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
82d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
82e0: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
82f0: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8300: 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44  RE_DIRECT, SCARD
8310: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
8320: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
8330: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
8340: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
8350: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8360: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
8370: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
8380: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
8390: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
83a0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
83b0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
83c0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
83d0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
83e0: 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f  0").....scard_co
83f0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
8400: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
8410: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
8420: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
8430: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
8440: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8450: 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T0, &slot->pcsc
8460: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
8470: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
8480: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
8490: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
84a0: 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43  ATCH) {......CAC
84b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
84c0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
84d0: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
84e0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
84f0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
8500: 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63  st T=1")......sc
8510: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
8520: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
8530: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
8540: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8550: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
8560: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
8570: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
8580: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
8590: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09  otocol);.....}..
85a0: 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f  ..}.....scard_co
85b0: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
85c0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
85d0: 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a  lot, protocol);.
85e0: 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
85f0: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41  _conn_ret != SCA
8600: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
8610: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8620: 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
8630: 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65  on to card faile
8640: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
8650: 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f  failure (SCardCo
8660: 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69  nnect() = %s/%li
8670: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
8680: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
8690: 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e  O_STR(scard_conn
86a0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
86b0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a  ard_conn_ret);..
86c0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
86d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
86e0: 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70  ;...}....slot->p
86f0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
8700: 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e  ed = 1;...slot->
8710: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8720: 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74  h = 0;...slot->t
8730: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
8740: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73  hw_lock = 0;...s
8750: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
8760: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43  protocol;..}...C
8770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8780: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8790: 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65   success");...re
87a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
87b0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
87c0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
87d0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
87e0: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
87f0: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
8800: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
8810: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
8820: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
8830: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
8840: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
8850: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
8860: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
8870: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8880: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
8890: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
88a0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
88b0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
88c0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
88d0: 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73   *     The trans
88e0: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
88f0: 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e   terminated usin
8900: 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  g "cackey_end_tr
8910: 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a  ansaction". *. *
8920: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
8930: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
8940: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
8950: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
8960: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
8970: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
8980: 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _ret;..LONG scar
8990: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43  d_trans_ret;...C
89a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
89b0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
89c0: 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  .cackey_conn_ret
89d0: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
89e0: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
89f0: 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  f (cackey_conn_r
8a00: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
8a10: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
8a20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8a30: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
8a40: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
8a50: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
8a60: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8a70: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8a80: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
8a90: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8aa0: 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ++;...if (slot->
8ab0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8ac0: 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e  h > 1 && !slot->
8ad0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
8ae0: 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41  _hw_lock) {...CA
8af0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8b00: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20  F("Already in a 
8b10: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72  transaction, per
8b20: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f  forming no actio
8b30: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25  n (new depth = %
8b40: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
8b50: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
8b60: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8b70: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
8b80: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8b90: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8ba0: 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61  = 0;...scard_tra
8bb0: 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65  ns_ret = SCardBe
8bc0: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  ginTransaction(s
8bd0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b  lot->pcsc_card);
8be0: 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e  ..if (scard_tran
8bf0: 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  s_ret != SCARD_S
8c00: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41  _SUCCESS) {...CA
8c10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8c20: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67  F("Unable to beg
8c30: 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  in transaction, 
8c40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
8c50: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
8c60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8c70: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
8c80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8c90: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65  ("Sucessfully be
8ca0: 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gan transaction 
8cb0: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
8cc0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8cd0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8ce0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
8cf0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
8d00: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
8d10: 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  et cackey_end_tr
8d20: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8d30: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8d40: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
8d50: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
8d60: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
8d70: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
8d80: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
8d90: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
8da0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
8db0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
8dc0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
8dd0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8de0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
8df0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
8e00: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
8e10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72   function requir
8e20: 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e  es "cackey_begin
8e30: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f  _transaction" to
8e40: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
8e50: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
8e60: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8e70: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8e80: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8e90: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f  lot *slot) {..LO
8ea0: 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  NG scard_trans_r
8eb0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8ec0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
8ed0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
8ee0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
8ef0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b  nected) {...CACK
8f00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8f10: 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e  "Card is not con
8f20: 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74  nected, unable t
8f30: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
8f40: 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09  n on card");....
8f50: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
8f60: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
8f70: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8f80: 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65  UG_PRINTF("Decre
8f90: 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  asing transactio
8fa0: 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69  n depth and aski
8fb0: 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72  ng for a hardwar
8fc0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65  e lock on the ne
8fd0: 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63  xt begin transac
8fe0: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
8ff0: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
9000: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
9010: 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e  pth);.....slot->
9020: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
9030: 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f  h--;.....if (slo
9040: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9050: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
9060: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9070: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
9080: 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09   1;....}...}....
9090: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
90a0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
90b0: 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  }...if (slot->tr
90c0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
90d0: 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
90e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
90f0: 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61  erminating a tra
9100: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nsaction that ha
9110: 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a  s not begun!");.
9120: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9130: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9140: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61  ;..}...slot->tra
9150: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
9160: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ;...if (slot->tr
9170: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
9180: 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  > 0) {...CACKEY_
9190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
91a0: 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
91b0: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f   in progress, no
91c0: 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e  t terminating on
91d0: 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  -card Transactio
91e0: 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68  n (current depth
91f0: 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74   = %i)", slot->t
9200: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9210: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9220: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9230: 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73  .}...scard_trans
9240: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54  _ret = SCardEndT
9250: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d  ransaction(slot-
9260: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
9270: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
9280: 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f  if (scard_trans_
9290: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
92a0: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
92b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
92c0: 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74  "Unable to end t
92d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
92e0: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
92f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9300: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9310: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
9320: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
9330: 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e  cessfully termin
9340: 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ated transaction
9350: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
9360: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
9370: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
9380: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9390: 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74  }../* APDU Relat
93a0: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
93b0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
93c0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
93d0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
93e0: 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  u(struct cackey_
93f0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
9400: 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c  gned char class,
9410: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
9420: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69  nstruction, unsi
9430: 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e  gned char p1, un
9440: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20  signed char p2, 
9450: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63  unsigned char lc
9460: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9470: 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20  *data, unsigned 
9480: 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f  char le, uint16_
9490: 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73  t *respcode, uns
94a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
94b0: 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65  data, size_t *re
94c0: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a  spdata_len);. *.
94d0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
94e0: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
94f0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
9500: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
9510: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
9520: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9530: 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20  r class. *      
9540: 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47     APDU Class (G
9550: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
9560: 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53  16 or GSCIS_CLAS
9570: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
9580: 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75  M. *         usu
9590: 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a  ally), (CLA). *.
95a0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
95b0: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
95c0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
95d0: 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e   Instruction (IN
95e0: 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  S). *. *     uns
95f0: 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a  igned char p1. *
9600: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
9610: 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20  rameter 1 (P1). 
9620: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9630: 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20  d char p2. *    
9640: 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65       APDU Parame
9650: 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a  ter 2 (P2). *. *
9660: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9670: 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20  ar lc. *        
9680: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
9690: 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20  Content (Lc) -- 
96a0: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
96b0: 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20  th of "data". * 
96c0: 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65          paramete
96d0: 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73  r.  If "data" is
96e0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
96f0: 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  LL, this paramet
9700: 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20  er will. *      
9710: 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20     be ignored.. 
9720: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9730: 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20  d char *data. * 
9740: 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20          Pointer 
9750: 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e  to buffer to sen
9760: 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65  d.  It should be
9770: 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67   "Lc" bytes long
9780: 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20  .  If. *        
9790: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
97a0: 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f  LL, "Lc" will no
97b0: 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74  t be sent, and t
97c0: 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20  his buffer will 
97d0: 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67  be. *         ig
97e0: 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  nored.. *. *    
97f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9800: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  e. *         APD
9810: 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65  U Length of Expe
9820: 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20  ctation (Le) -- 
9830: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
9840: 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20  th of the. *    
9850: 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65       expected re
9860: 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73  ply.  If this is
9870: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20   specified as 0 
9880: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
9890: 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73  . *         be s
98a0: 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  ent.. *. *     u
98b0: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
98c0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  e. *         [OU
98d0: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
98e0: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
98f0: 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66  sponse code.  If
9900: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
9910: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
9920: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
9930: 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  nse code will be
9940: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
9950: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9960: 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a  har *respdata. *
9970: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50           [OUT] P
9980: 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67  ointer to storag
9990: 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e  e of APDU respon
99a0: 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69  se data.  If thi
99b0: 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  s is. *         
99c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
99d0: 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20  L, the response 
99e0: 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73  data will be dis
99f0: 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20  carded.  If. *  
9a00: 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70         the "resp
9a10: 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65  data_len" parame
9a20: 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64  ter is specified
9a30: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62   as NULL, this b
9a40: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
9a50: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
9a60: 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ated.. *. *     
9a70: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
9a80: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
9a90: 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65  [IN, OUT] Pointe
9aa0: 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e  r initialing con
9ab0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65  taining the size
9ac0: 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74   of the "respdat
9ad0: 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75  a". *         bu
9ae0: 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65  ffer.  Before re
9af0: 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69  turning, the poi
9b00: 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73  nted to value is
9b10: 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a   updated to the.
9b20: 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65   *         numbe
9b30: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
9b40: 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  en to the buffer
9b50: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70  .  If this is sp
9b60: 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20  ecified as. *   
9b70: 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77        NULL, it w
9b80: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
9b90: 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74  ed, and "respdat
9ba0: 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  a" will be ignor
9bb0: 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20  ed causing. *   
9bc0: 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e        the respon
9bd0: 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69  se data to be di
9be0: 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52  scarded.. *. * R
9bf0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
9c00: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
9c10: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e  _OK           On
9c20: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
9c30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9c40: 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72  NERIC      On er
9c50: 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ror. *     CACKE
9c60: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
9c70: 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e  SENT  If the sen
9c80: 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61  ding failed beca
9c90: 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73  use the token is
9ca0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 61 62 73 65 6e 74 0a 20 2a 20 20 20 20     absent. *    
9cd0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
9ce0: 45 54 52 59 20 20 20 20 20 20 20 20 49 66 20 73  ETRY        If s
9cf0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 6c 6f  omething that lo
9d00: 6f 6b 73 20 72 65 74 72 79 27 61 62 6c 65 20 77  oks retry'able w
9d10: 65 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ent. *          
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 20 20 20 77 72 6f 6e 67 20 2d 2d 20 74        wrong -- t
9d40: 72 79 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ry the whole tra
9d50: 6e 73 61 63 74 69 6f 6e 20 6f 76 65 72 0a 20 2a  nsaction over. *
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 61 67 61 69 6e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  again. *. * NOTE
9d90: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
9da0: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e  nction will conn
9db0: 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43  ect to the PC/SC
9dc0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61   Connection Mana
9dd0: 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63  ger via. *     c
9de0: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
9df0: 63 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a  ct() if needed..
9e00: 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c   *. *     It wil
9e10: 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  l connect to the
9e20: 20 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61   card in the rea
9e30: 64 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20  der attached to 
9e40: 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20  the slot. *     
9e50: 73 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77  specified.  It w
9e60: 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f  ill reconnect to
9e70: 20 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65   the card if the
9e80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20   connection. *  
9e90: 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a     goes away.. *
9ea0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
9eb0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
9ec0: 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63  nd_apdu(struct c
9ed0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
9ee0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9ef0: 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20  class, unsigned 
9f00: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
9f10: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9f20: 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p1, unsigned cha
9f30: 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 69  r p2, unsigned i
9f40: 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20  nt lc, unsigned 
9f50: 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69  char *data, unsi
9f60: 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20 75 69 6e  gned int le, uin
9f70: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
9f80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9f90: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
9fa0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   *respdata_len) 
9fb0: 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72  {..uint8_t major
9fc0: 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  _rc, minor_rc;..
9fd0: 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f  size_t bytes_to_
9fe0: 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61  copy, tmp_respda
9ff0: 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52  ta_len;..LPCSCAR
a000: 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69 6f  D_IO_REQUEST pio
a010: 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44 20  SendPci;..DWORD 
a020: 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c  xmit_len, recv_l
a030: 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
a040: 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f  xmit_ret, scard_
a050: 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54  reconn_ret;..BYT
a060: 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d  E xmit_buf[1024]
a070: 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d  , recv_buf[1024]
a080: 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
a090: 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65  ect_ret, pcsc_ge
a0a0: 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20  tresp_ret;..int 
a0b0: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
a0c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
a0d0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
a0e0: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
a0f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
a100: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
a110: 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ied.");....retur
a120: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
a130: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70  GENERIC);..}...p
a140: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
a150: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
a160: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
a170: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
a180: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
a190: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
a1a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a1b0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
a1c0: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
a1d0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
a1e0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
a1f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
a200: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RIC);..}.../* De
a210: 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72  termine which pr
a220: 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75  otocol to send u
a230: 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20  sing */..switch 
a240: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29  (slot->protocol)
a250: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
a260: 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09  PROTOCOL_T0:....
a270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a280: 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f  NTF("Protocol to
a290: 20 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69   send datagram i
a2a0: 73 20 54 3d 30 22 29 3b 0a 0a 09 09 09 70 69 6f  s T=0");.....pio
a2b0: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
a2c0: 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61  PCI_T0;.....brea
a2d0: 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  k;...case SCARD_
a2e0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09  PROTOCOL_T1:....
a2f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a300: 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f  NTF("Protocol to
a310: 20 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69   send datagram i
a320: 73 20 54 3d 31 22 29 3b 0a 0a 09 09 09 70 69 6f  s T=1");.....pio
a330: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
a340: 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65 61  PCI_T1;.....brea
a350: 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  k;...default:...
a360: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a370: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72  INTF("Invalid pr
a380: 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61 62  otocol found, ab
a390: 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 72  orting.");.....r
a3a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
a3b0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
a3c0: 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a  .../* Transmit *
a3d0: 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b  /..xmit_len = 0;
a3e0: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a3f0: 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a  len++] = class;.
a400: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a410: 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74  en++] = instruct
a420: 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ion;..xmit_buf[x
a430: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b  mit_len++] = p1;
a440: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a450: 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66  len++] = p2;..if
a460: 20 28 64 61 74 61 29 20 7b 0a 09 09 69 66 20 28   (data) {...if (
a470: 6c 63 20 3e 20 32 35 35 29 20 7b 0a 09 09 09 43  lc > 255) {....C
a480: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a490: 54 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73  TF("CAUTION!  Us
a4a0: 69 6e 67 20 61 6e 20 4c 63 20 67 72 65 61 74 65  ing an Lc greate
a4b0: 72 20 74 68 61 6e 20 32 35 35 20 69 73 20 75 6e  r than 255 is un
a4c0: 74 65 73 74 65 64 2e 20 20 4c 63 20 3d 20 25 75  tested.  Lc = %u
a4d0: 22 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 6d 69 74  ", lc);.....xmit
a4e0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a4f0: 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20   = 0x82; /* XXX 
a500: 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78  UNTESTED */....x
a510: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a520: 2b 2b 5d 20 3d 20 28 6c 63 20 26 20 30 78 66 66  ++] = (lc & 0xff
a530: 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69  00) >> 8;....xmi
a540: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a550: 5d 20 3d 20 6c 63 20 26 20 30 78 66 66 3b 0a 09  ] = lc & 0xff;..
a560: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69  .} else {....xmi
a570: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a580: 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f  ] = lc;...}...fo
a590: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
a5a0: 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  < lc; idx++) {..
a5b0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a5c0: 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64  len++] = data[id
a5d0: 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  x];...}..}...if 
a5e0: 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09  (le != 0x00) {..
a5f0: 09 69 66 20 28 6c 65 20 3e 20 32 35 36 29 20 7b  .if (le > 256) {
a600: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a610: 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e  _PRINTF("CAUTION
a620: 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 65 20 67  !  Using an Le g
a630: 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 36 20  reater than 256 
a640: 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 65  is untested.  Le
a650: 20 3d 20 25 75 22 2c 20 6c 65 29 3b 0a 0a 09 09   = %u", le);....
a660: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a670: 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a  en++] = 0x82; /*
a680: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
a690: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a6a0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26  t_len++] = (le &
a6b0: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
a6c0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a6d0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78  len++] = le & 0x
a6e0: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  ff;...} else if 
a6f0: 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09  (le == 256) {...
a700: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a710: 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09  en++] = 0x00;...
a720: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74  } else {....xmit
a730: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a740: 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   = le;...}..}...
a750: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
a760: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
a770: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
a780: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
a790: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d  );...if (class =
a7a0: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
a7b0: 4f 37 38 31 36 20 26 26 20 28 69 6e 73 74 72 75  O7816 && (instru
a7c0: 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49  ction == GSCIS_I
a7d0: 4e 53 54 52 5f 56 45 52 49 46 59 20 7c 7c 20 69  NSTR_VERIFY || i
a7e0: 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53  nstruction == GS
a7f0: 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45  CIS_INSTR_CHANGE
a800: 5f 52 45 46 45 52 45 4e 43 45 29 20 26 26 20 70  _REFERENCE) && p
a810: 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43  1 == 0x00) {...C
a820: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a830: 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  TF("Sending APDU
a840: 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29  : <<censored>>")
a850: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41  ;..} else {...CA
a860: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a870: 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  BUF("Sending APD
a880: 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  U:", xmit_buf, x
a890: 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  mit_len);..}...r
a8a0: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
a8b0: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61  (recv_buf);..sca
a8c0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43  rd_xmit_ret = SC
a8d0: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74  ardTransmit(slot
a8e0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f  ->pcsc_card, pio
a8f0: 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75  SendPci, xmit_bu
a900: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c  f, xmit_len, NUL
a910: 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  L, recv_buf, &re
a920: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73  cv_len);...if (s
a930: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
a940: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41   SCARD_E_NOT_TRA
a950: 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43  NSACTED) {...CAC
a960: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a970: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
a980: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
a990: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
a9a0: 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61   %s/%lx), will a
a9b0: 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  sk calling funct
a9c0: 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f  ion to retry (no
a9d0: 74 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64  t resetting card
a9e0: 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  )...", CACKEY_DE
a9f0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
aa00: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
aa10: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
aa20: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
aa30: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a  xmit_ret);..../*
aa40: 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64   Begin Smartcard
aa50: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
aa60: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
aa70: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
aa80: 0a 09 09 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e  ...cackey_reconn
aa90: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 73  ect_card(slot, s
aaa0: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 3b 0a  lot->protocol);.
aab0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
aac0: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a  _PCSC_E_RETRY);.
aad0: 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78  .}...if (scard_x
aae0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
aaf0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
ab00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ab10: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
ab20: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
ab30: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
ab40: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41  ) = %s/%lx)", CA
ab50: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
ab60: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
ab70: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
ab80: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ab90: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
aba0: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
abb0: 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e  G_PRINTF("Markin
abc0: 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67  g slot as having
abd0: 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09   been reset");..
abe0: 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
abf0: 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
ac00: 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
ac10: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f  _ret == SCARD_W_
ac20: 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09  RESET_CARD) {...
ac30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ac40: 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75  INTF("Reset requ
ac50: 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c  ired, please hol
ac60: 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  d...");.....scar
ac70: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  d_reconn_ret = c
ac80: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
ac90: 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44  card(slot, SCARD
aca0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
acb0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
acc0: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
acd0: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
ace0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
acf0: 7b 0a 09 09 09 09 73 77 69 74 63 68 20 28 73 6c  {.....switch (sl
ad00: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ot->protocol) {.
ad10: 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f  .....case SCARD_
ad20: 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09  PROTOCOL_T0:....
ad30: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
ad40: 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09  SCARD_PCI_T0;...
ad50: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
ad60: 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54  .case SCARD_PROT
ad70: 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70  OCOL_T1:.......p
ad80: 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52  ioSendPci = SCAR
ad90: 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09  D_PCI_T1;.......
ada0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66  .break;......def
adb0: 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b  ault:.......CACK
adc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
add0: 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f  "Invalid protoco
ade0: 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f  l found, but too
adf0: 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74   late to do anyt
ae00: 68 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f  hing about it no
ae10: 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77  w -- trying anyw
ae20: 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72  ay.");........br
ae30: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
ae40: 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20  /* Re-establish 
ae50: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
ae60: 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a  it was present *
ae70: 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  /.....if (slot->
ae80: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
ae90: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  h > 0) {......sl
aea0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
aeb0: 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c  depth--;......sl
aec0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
aed0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31  need_hw_lock = 1
aee0: 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65  ;......cackey_be
aef0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
af00: 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  slot);.....}....
af10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
af20: 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63  RINTF("Reset suc
af30: 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73  cessful, retrans
af40: 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09  mitting");......
af50: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  recv_len = sizeo
af60: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09  f(recv_buf);....
af70: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
af80: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
af90: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
afa0: 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69   pioSendPci, xmi
afb0: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c  t_buf, xmit_len,
afc0: 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c   NULL, recv_buf,
afd0: 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09   &recv_len);....
afe0: 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
aff0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
b000: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09  SUCCESS) {......
b010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b020: 4e 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20  NTF("Retransmit 
b030: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
b040: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74  g in failure aft
b050: 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67  er disconnecting
b060: 20 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64   the card (SCard
b070: 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c  Transmit = %s/%l
b080: 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  i)", CACKEY_DEBU
b090: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
b0a0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69  TO_STR(scard_xmi
b0b0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
b0c0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a  card_xmit_ret);.
b0d0: 0a 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f  ......SCardDisco
b0e0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
b0f0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
b100: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73  VE_CARD);......s
b110: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
b120: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
b130: 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
b140: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
b150: 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74   */......slot->t
b160: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
b170: 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
b180: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
b190: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72  n(slot);.......r
b1a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
b1b0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
b1c0: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
b1d0: 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
b1e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73  EBUG_PRINTF("Dis
b1f0: 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22  connecting card"
b200: 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73  );......SCardDis
b210: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
b220: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
b230: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09  EAVE_CARD);.....
b240: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
b250: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
b260: 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
b270: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
b280: 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72   */.....slot->tr
b290: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
b2a0: 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f  = 1;.....cackey_
b2b0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b2c0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b  slot);......CACK
b2d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b2e0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61  "Returning in fa
b2f0: 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74  ilure");.....ret
b300: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b310: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
b320: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
b330: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b340: 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65  PRINTF("Disconne
b350: 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09  cting card");...
b360: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
b370: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
b380: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
b390: 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70  ARD);....slot->p
b3a0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
b3b0: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45  ed = 0;...../* E
b3c0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
b3d0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73  nsaction */....s
b3e0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
b3f0: 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63  _depth = 1;....c
b400: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b410: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b420: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b430: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
b440: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09  in failure");...
b450: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b460: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
b470: 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  T);...}..}...CAC
b480: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
b490: 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c  UF("Returned Val
b4a0: 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20  ue:", recv_buf, 
b4b0: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  recv_len);...if 
b4c0: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b  (recv_len < 2) {
b4d0: 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65  .../* Minimal re
b4e0: 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73  sponse length is
b4f0: 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e   2 bytes, return
b500: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  ing in failure *
b510: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
b520: 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
b530: 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74  e too small, ret
b540: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b550: 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c  e (recv_len = %l
b560: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
b570: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
b580: 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b590: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b5a0: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
b5b0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b5c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
b5d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
b5e0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
b5f0: 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f  ermine result co
b600: 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20  de */..major_rc 
b610: 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f  = recv_buf[recv_
b620: 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72  len - 2];..minor
b630: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
b640: 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69  ecv_len - 1];..i
b650: 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09  f (respcode) {..
b660: 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61  .*respcode = (ma
b670: 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d  jor_rc << 8) | m
b680: 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a  inor_rc;..}.../*
b690: 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20   Adjust message 
b6a0: 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f  buffer */..recv_
b6b0: 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41  len -= 2;.../* A
b6c0: 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75  dd bytes to retu
b6d0: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70  rn value */..tmp
b6e0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  _respdata_len = 
b6f0: 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61  0;..if (respdata
b700: 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e   && respdata_len
b710: 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61  ) {...tmp_respda
b720: 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61  ta_len = *respda
b730: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73  ta_len;....bytes
b740: 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70  _to_copy = *resp
b750: 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20  data_len;....if 
b760: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65  (recv_len < byte
b770: 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09  s_to_copy) {....
b780: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
b790: 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  recv_len;...}...
b7a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b7b0: 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c  INTF("Copying %l
b7c0: 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62  u bytes to the b
b7d0: 75 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c  uffer (recv'd %l
b7e0: 75 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c  u bytes, but onl
b7f0: 79 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74  y %lu bytes left
b800: 20 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22   in our buffer)"
b810: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b820: 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c  ) bytes_to_copy,
b830: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b840: 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69   recv_len, (unsi
b850: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70  gned long) *resp
b860: 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65  data_len);....me
b870: 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72  mcpy(respdata, r
b880: 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74  ecv_buf, bytes_t
b890: 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64  o_copy);...respd
b8a0: 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  ata += bytes_to_
b8b0: 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61  copy;....*respda
b8c0: 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74  ta_len = bytes_t
b8d0: 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65  o_copy;...tmp_re
b8e0: 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79  spdata_len -= by
b8f0: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20  tes_to_copy;..} 
b900: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63  else {...if (rec
b910: 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  v_len != 0) {...
b920: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b930: 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61  INTF("Throwing a
b940: 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e  way %lu bytes, n
b950: 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68  owhere to put th
b960: 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  em!", (unsigned 
b970: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
b980: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61  ...}..}...if (ma
b990: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20  jor_rc == 0x61) 
b9a0: 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74  {.../* We need t
b9b0: 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b  o READ */...CACK
b9c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b9d0: 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71  "Buffer read req
b9e0: 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28  uired");....if (
b9f0: 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30  minor_rc == 0x00
ba00: 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20  ) {....minor_rc 
ba10: 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  = CACKEY_APDU_MT
ba20: 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67  U;...}....pcsc_g
ba30: 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63  etresp_ret = cac
ba40: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
ba50: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
ba60: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
ba70: 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53  NSTR_GET_RESPONS
ba80: 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  E, 0x00, 0x00, 0
ba90: 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63  , NULL, minor_rc
baa0: 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70  , respcode, resp
bab0: 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64  data, &tmp_respd
bac0: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20  ata_len);....if 
bad0: 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65  (pcsc_getresp_re
bae0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
baf0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
bb00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bb10: 22 42 75 66 66 65 72 20 72 65 61 64 20 66 61 69  "Buffer read fai
bb20: 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20  led!  Returning 
bb30: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
bb40: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
bb50: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
bb60: 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  /....cackey_end_
bb70: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
bb80: 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f  );.....if (pcsc_
bb90: 67 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43  getresp_ret == C
bba0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
bbb0: 52 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e  RY) {.....return
bbc0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52  (CACKEY_PCSC_E_R
bbd0: 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ETRY);....}.....
bbe0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bbf0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
bc00: 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61  .}....if (respda
bc10: 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65  ta_len) {....*re
bc20: 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d  spdata_len += tm
bc30: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a  p_respdata_len;.
bc40: 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  ..}..../* End Sm
bc50: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
bc60: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
bc70: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
bc80: 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  slot);....CACKEY
bc90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
bca0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
bcb0: 65 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64  ess (buffer read
bcc0: 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09   complete)");...
bcd0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bce0: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f  SC_S_OK);..}.../
bcf0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
bd00: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
bd10: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
bd20: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
bd30: 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20  if (major_rc == 
bd40: 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63  0x90) {.../* Suc
bd50: 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59  cess */...CACKEY
bd60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
bd70: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
bd80: 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20  ess (major_rc = 
bd90: 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75  0x90)");....retu
bda0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
bdb0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b  _OK);..}....CACK
bdc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bdd0: 22 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61  "APDU Returned a
bde0: 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69  n error, returni
bdf0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
be00: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
be10: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
be20: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  ;.}..static unsi
be30: 67 6e 65 64 20 63 68 61 72 20 2a 63 61 63 6b 65  gned char *cacke
be40: 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61  y_read_bertlv_ta
be50: 67 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  g(unsigned char 
be60: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
be70: 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75  *buffer_len_p, u
be80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67  nsigned char tag
be90: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
bea0: 2a 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65  *outbuffer, size
beb0: 5f 74 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65  _t *outbuffer_le
bec0: 6e 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  n_p) {..unsigned
bed0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b   char *buffer_p;
bee0: 0a 09 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 66  ..size_t outbuff
bef0: 65 72 5f 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c  er_len, buffer_l
bf00: 65 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65  en;..size_t size
bf10: 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41  ;..int idx;...CA
bf20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bf30: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
bf40: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70  if (buffer_len_p
bf50: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
bf60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bf70: 46 28 22 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  F("buffer_len_p 
bf80: 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  is NULL.  Return
bf90: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22  ing in failure."
bfa0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
bfb0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  L);..}...if (out
bfc0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20  buffer_len_p == 
bfd0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
bfe0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 6f  _DEBUG_PRINTF("o
bff0: 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69  utbuffer_len_p i
c000: 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69  s NULL.  Returni
c010: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29  ng in failure.")
c020: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c030: 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c  );..}...buffer_l
c040: 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f  en = *outbuffer_
c050: 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65  len_p;..outbuffe
c060: 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66  r_len = *outbuff
c070: 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 66 20 28  er_len_p;...if (
c080: 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20  buffer_len < 2) 
c090: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c0a0: 5f 50 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f  _PRINTF("buffer_
c0b0: 6c 65 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  len is less than
c0c0: 20 32 2c 20 73 6f 20 77 65 20 63 61 6e 27 74 20   2, so we can't 
c0d0: 72 65 61 64 20 61 6e 79 20 74 61 67 2e 20 20 52  read any tag.  R
c0e0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
c0f0: 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ure.");....retur
c100: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75  n(NULL);..}...bu
c110: 66 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b  ffer_p = buffer;
c120: 0a 09 69 66 20 28 62 75 66 66 65 72 5f 70 5b 30  ..if (buffer_p[0
c130: 5d 20 21 3d 20 74 61 67 29 20 7b 0a 09 09 43 41  ] != tag) {...CA
c140: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c150: 46 28 22 54 61 67 20 66 6f 75 6e 64 20 77 61 73  F("Tag found was
c160: 20 6e 6f 74 20 74 61 67 20 65 78 70 65 63 74 65   not tag expecte
c170: 64 2e 20 20 54 61 67 20 3d 20 25 30 32 78 2c 20  d.  Tag = %02x, 
c180: 45 78 70 65 63 74 65 64 20 3d 20 25 30 32 78 2e  Expected = %02x.
c190: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66    Returning in f
c1a0: 61 69 6c 75 72 65 2e 22 2c 20 28 75 6e 73 69 67  ailure.", (unsig
c1b0: 6e 65 64 20 69 6e 74 29 20 62 75 66 66 65 72 5f  ned int) buffer_
c1c0: 70 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a 09 09 72  p[0], tag);....r
c1d0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c1e0: 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62  ..buffer_p++;..b
c1f0: 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69  uffer_len--;...i
c200: 66 20 28 28 62 75 66 66 65 72 5f 70 5b 30 5d 20  f ((buffer_p[0] 
c210: 26 20 30 78 38 30 29 20 3d 3d 20 30 78 38 30 29  & 0x80) == 0x80)
c220: 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30 3b 0a 09   {...size = 0;..
c230: 09 69 64 78 20 3d 20 28 62 75 66 66 65 72 5f 70  .idx = (buffer_p
c240: 5b 30 5d 20 26 20 30 78 37 66 29 3b 0a 0a 09 09  [0] & 0x7f);....
c250: 69 66 20 28 69 64 78 20 3e 20 62 75 66 66 65 72  if (idx > buffer
c260: 5f 6c 65 6e 29 20 7b 0a 09 09 09 43 41 43 4b 45  _len) {....CACKE
c270: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c280: 4d 61 6c 66 6f 72 6d 65 64 20 42 45 52 20 76 61  Malformed BER va
c290: 6c 75 65 20 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67  lue -- not enoug
c2a0: 68 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c  h bytes availabl
c2b0: 65 20 74 6f 20 72 65 61 64 20 6c 65 6e 67 74 68  e to read length
c2c0: 20 28 69 64 78 20 3d 20 25 69 2c 20 62 75 66 66   (idx = %i, buff
c2d0: 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20  er_len = %lu)", 
c2e0: 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  idx, (unsigned l
c2f0: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29  ong) buffer_len)
c300: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c  ;.....return(NUL
c310: 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28  L);...}....for (
c320: 3b 20 69 64 78 20 3e 20 30 3b 20 69 64 78 2d 2d  ; idx > 0; idx--
c330: 29 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 70 2b  ) {....buffer_p+
c340: 2b 3b 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e  +;....buffer_len
c350: 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 3c 3c 3d  --;.....size <<=
c360: 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c 3d 20 62   8;....size |= b
c370: 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a  uffer_p[0];...}.
c380: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 69 7a 65  .} else {...size
c390: 20 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a   = buffer_p[0];.
c3a0: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b  .}...buffer_p++;
c3b0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a  ..buffer_len--;.
c3c0: 0a 09 69 66 20 28 73 69 7a 65 20 3e 20 6f 75 74  ..if (size > out
c3d0: 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09  buffer_len) {...
c3e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c3f0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
c400: 6f 70 79 20 76 61 6c 75 65 20 62 75 66 66 65 72  opy value buffer
c410: 20 74 6f 20 6f 75 74 62 75 66 66 65 72 2c 20 6e   to outbuffer, n
c420: 6f 74 20 65 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20  ot enough room. 
c430: 20 56 61 6c 75 65 20 62 75 66 66 65 72 20 6c 65   Value buffer le
c440: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6f 75 74 20  ngth = %lu, out 
c450: 62 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d 20  buffer length = 
c460: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
c470: 6c 6f 6e 67 29 20 73 69 7a 65 2c 20 28 75 6e 73  long) size, (uns
c480: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62  igned long) outb
c490: 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72  uffer_len);....r
c4a0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c4b0: 0a 09 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  ..*outbuffer_len
c4c0: 5f 70 20 3d 20 73 69 7a 65 3b 0a 09 69 66 20 28  _p = size;..if (
c4d0: 6f 75 74 62 75 66 66 65 72 29 20 7b 0a 09 09 6d  outbuffer) {...m
c4e0: 65 6d 63 70 79 28 6f 75 74 62 75 66 66 65 72 2c  emcpy(outbuffer,
c4f0: 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29   buffer_p, size)
c500: 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 2b 3d 20  ;...buffer_p += 
c510: 73 69 7a 65 3b 0a 09 09 62 75 66 66 65 72 5f 6c  size;...buffer_l
c520: 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a  en -= size;....*
c530: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 62  buffer_len_p = b
c540: 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41  uffer_len;....CA
c550: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c560: 42 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73  BUF("BER-TLV res
c570: 75 6c 74 73 3a 22 2c 20 6f 75 74 62 75 66 66 65  ults:", outbuffe
c580: 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 65 6c 73  r, size);..} els
c590: 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 28 62 75  e {...memmove(bu
c5a0: 66 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20  ffer, buffer_p, 
c5b0: 73 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f  size);...buffer_
c5c0: 70 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 09 43  p = buffer;....C
c5d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c5e0: 54 42 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65  TBUF("BER-TLV re
c5f0: 73 75 6c 74 73 3a 22 2c 20 62 75 66 66 65 72 2c  sults:", buffer,
c600: 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 43 41 43   size);..}...CAC
c610: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c620: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
c630: 75 63 63 65 73 73 2e 20 20 53 69 7a 65 20 6f 66  uccess.  Size of
c640: 20 63 6f 6e 74 65 6e 74 73 20 66 6f 72 20 74 61   contents for ta
c650: 67 20 25 30 32 78 20 69 73 20 25 6c 75 22 2c 20  g %02x is %lu", 
c660: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74  (unsigned int) t
c670: 61 67 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ag, (unsigned lo
c680: 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74  ng) size);...ret
c690: 75 72 6e 28 62 75 66 66 65 72 5f 70 29 3b 0a 7d  urn(buffer_p);.}
c6a0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
c6b0: 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20  . *     ssize_t 
c6c0: 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28  cackey_get_data(
c6d0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c6e0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
c6f0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
c700: 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c   size_t buffer_l
c710: 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  en, unsigned cha
c720: 72 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a  r oid[3]);. *. *
c730: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
c740: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
c750: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
c760: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
c770: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
c780: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
c790: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20  d char *buffer. 
c7a0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
c7b0: 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20  Buffer. *. *    
c7c0: 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c   size_t buffer_l
c7d0: 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  en. *         Nu
c7e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
c7f0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
c800: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
c810: 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a  ned char oid[3].
c820: 20 2a 20 20 20 20 20 20 20 20 20 33 2d 62 79 74   *         3-byt
c830: 65 20 4f 49 44 20 74 6f 20 72 65 61 64 0a 20 2a  e OID to read. *
c840: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
c850: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
c860: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
c870: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c880: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
c890: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
c8a0: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
c8b0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
c8c0: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
c8d0: 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  t cackey_get_dat
c8e0: 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  a(struct cackey_
c8f0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
c900: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c910: 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72  r, size_t buffer
c920: 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  _len, unsigned c
c930: 68 61 72 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75  har oid[3]) {..u
c940: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64  nsigned char cmd
c950: 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30 78 30 33  [] = {0x5C, 0x03
c960: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c970: 30 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  00};..unsigned c
c980: 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09  har *buffer_p;..
c990: 73 69 7a 65 5f 74 20 69 6e 69 74 5f 62 75 66 66  size_t init_buff
c9a0: 65 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b 0a 09 75  er_len, size;..u
c9b0: 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
c9c0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
c9d0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c9e0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
c9f0: 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72  );...init_buffer
ca00: 5f 6c 65 6e 20 3d 20 62 75 66 66 65 72 5f 6c 65  _len = buffer_le
ca10: 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d 20 6f 69  n;...cmd[2] = oi
ca20: 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20  d[0];..cmd[3] = 
ca30: 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20  oid[1];..cmd[4] 
ca40: 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32  = oid[2];.../* 2
ca50: 35 36 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  56 to indicate t
ca60: 68 65 20 6c 61 72 67 65 73 74 20 6d 65 73 73 61  he largest messa
ca70: 67 65 20 73 69 7a 65 20 2d 2d 20 6e 6f 74 20 63  ge size -- not c
ca80: 6c 65 61 72 20 69 66 20 74 68 69 73 20 77 69 6c  lear if this wil
ca90: 6c 20 77 6f 72 6b 20 77 69 74 68 20 61 6c 6c 20  l work with all 
caa0: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 09 73 65 6e  messages */..sen
cab0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
cac0: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
cad0: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
cae0: 31 36 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33  16, NISTSP800_73
caf0: 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54  _3_INSTR_GET_DAT
cb00: 41 2c 20 30 78 33 46 2c 20 30 78 46 46 2c 20 73  A, 0x3F, 0xFF, s
cb10: 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c  izeof(cmd), cmd,
cb20: 20 32 35 36 2c 20 26 72 65 73 70 63 6f 64 65 2c   256, &respcode,
cb30: 20 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72   buffer, &buffer
cb40: 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 65 6e  _len);...if (sen
cb50: 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  d_ret == CACKEY_
cb60: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
cb70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cb80: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
cb90: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72  ing failed, retr
cba0: 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72  ying read buffer
cbb0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61  ");....return(ca
cbc0: 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c  ckey_get_data(sl
cbd0: 6f 74 2c 20 62 75 66 66 65 72 2c 20 69 6e 69 74  ot, buffer, init
cbe0: 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20 6f 69 64  _buffer_len, oid
cbf0: 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e  ));..}...if (sen
cc00: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
cc10: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
cc20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cc30: 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f  TF("cackey_send_
cc40: 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72  apdu() failed, r
cc50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
cc60: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
cc70: 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66  (-1);..}..#ifdef
cc80: 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
cc90: 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
cca0: 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
ccb0: 62 75 66 66 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f  buffer_len > _PO
ccc0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
ccd0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cce0: 50 52 49 4e 54 46 28 22 52 65 61 64 20 62 79 74  PRINTF("Read byt
ccf0: 65 73 20 28 62 75 66 66 65 72 5f 6c 65 6e 29 20  es (buffer_len) 
cd00: 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
cd10: 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
cd20: 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
cd30: 78 20 3d 20 25 6c 69 2c 20 62 75 66 66 65 72 5f  x = %li, buffer_
cd40: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  len = %lu)", (lo
cd50: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
cd60: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
cd70: 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e  long) buffer_len
cd80: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
cd90: 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
cda0: 6e 64 69 66 0a 0a 09 69 66 20 28 62 75 66 66 65  ndif...if (buffe
cdb0: 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 43  r_len < 2) {...C
cdc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cdd0: 54 46 28 22 41 50 44 55 20 47 45 54 20 44 41 54  TF("APDU GET DAT
cde0: 41 20 72 65 74 75 72 6e 65 64 20 25 6c 75 20 62  A returned %lu b
cdf0: 79 74 65 73 2c 20 77 68 69 63 68 20 69 73 20 74  ytes, which is t
ce00: 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20 61 20 42  oo short for a B
ce10: 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73 65 22  ER-TLV response"
ce20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
ce30: 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a  ) buffer_len);..
ce40: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
ce50: 0a 0a 09 73 69 7a 65 20 3d 20 62 75 66 66 65 72  ...size = buffer
ce60: 5f 6c 65 6e 3b 0a 09 62 75 66 66 65 72 5f 70 20  _len;..buffer_p 
ce70: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
ce80: 72 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72 2c  rtlv_tag(buffer,
ce90: 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78   &buffer_len, 0x
cea0: 35 33 2c 20 4e 55 4c 4c 2c 20 26 73 69 7a 65 29  53, NULL, &size)
ceb0: 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 70  ;...if (buffer_p
cec0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
ced0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cee0: 46 28 22 54 61 67 20 64 65 63 6f 64 69 6e 67 20  F("Tag decoding 
cef0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
cf00: 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a  g in error.");..
cf10: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
cf20: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cf30: 50 52 49 4e 54 42 55 46 28 22 47 45 54 20 44 41  PRINTBUF("GET DA
cf40: 54 41 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66  TA result", buff
cf50: 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43  er, size);...CAC
cf60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cf70: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
cf80: 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75  uccess, read %lu
cf90: 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e   bytes", (unsign
cfa0: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a  ed long) size);.
cfb0: 0a 09 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a  ..return(size);.
cfc0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
cfd0: 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74  S. *     ssize_t
cfe0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
cff0: 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65  fer(struct cacke
d000: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
d010: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
d020: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
d030: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
d040: 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20   t_or_v, size_t 
d050: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b  initial_offset);
d060: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
d070: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
d080: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
d090: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
d0a0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
d0b0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
d0c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
d0d0: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
d0e0: 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a  [OUT] Buffer. *.
d0f0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f   *     size_t co
d100: 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e  unt. *         N
d110: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
d120: 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  o attempt to rea
d130: 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  d. *. *     unsi
d140: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
d150: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65  . *         Sele
d160: 63 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20  ct the T-buffer 
d170: 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72  (01) or V-buffer
d180: 20 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72   (02) to read fr
d190: 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20  om.  . *. *     
d1a0: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
d1b0: 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20  ffset. *        
d1c0: 20 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66   Specify the off
d1d0: 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65  set to begin the
d1e0: 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a   read from. *. *
d1f0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
d200: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
d210: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
d220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
d230: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c  s actually read,
d240: 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e   or -1 on error.
d250: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
d260: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
d270: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
d280: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
d290: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  r(struct cackey_
d2a0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
d2b0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
d2c0: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
d2d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
d2e0: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e  _or_v, size_t in
d2f0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a  itial_offset) {.
d300: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
d310: 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69  init_buffer;..si
d320: 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b  ze_t init_count;
d330: 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e  ..size_t init_in
d340: 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09  itial_offset;...
d350: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20  size_t offset = 
d360: 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d  0, max_offset, m
d370: 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ax_count;..unsig
d380: 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b  ned char cmd[2];
d390: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63  ..uint16_t respc
d3a0: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ode;..int send_r
d3b0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
d3c0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
d3d0: 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66  d.");...init_buf
d3e0: 66 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69  fer = buffer;..i
d3f0: 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e  nit_count = coun
d400: 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c  t;..init_initial
d410: 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61  _offset = initia
d420: 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f  l_offset;...max_
d430: 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a  offset = count;.
d440: 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43  .max_count = CAC
d450: 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09  KEY_APDU_MTU;...
d460: 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20  if (t_or_v != 1 
d470: 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20  && t_or_v != 2) 
d480: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
d490: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
d4a0: 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65   T or V paramete
d4b0: 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74  r specified, ret
d4c0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d4d0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  e");....return(-
d4e0: 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20  1);..}...cmd[0] 
d4f0: 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c  = t_or_v;...whil
d500: 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66  e (1) {...if (of
d510: 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73  fset >= max_offs
d520: 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
d530: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
d540: 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  ffer too small, 
d550: 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77  returning what w
d560: 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  e got...");.....
d570: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f  break;...}....co
d580: 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74  unt = max_offset
d590: 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20   - offset;...if 
d5a0: 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75  (count > max_cou
d5b0: 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d  nt) {....count =
d5c0: 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a   max_count;...}.
d5d0: 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e  ...cmd[1] = coun
d5e0: 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d  t;....send_ret =
d5f0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
d600: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
d610: 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
d620: 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
d630: 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28  _READ_BUFFER, ((
d640: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
d650: 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26   offset) >> 8) &
d660: 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f   0xff, (initial_
d670: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
d680: 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28   & 0xff, sizeof(
d690: 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c  cmd), cmd, 0x00,
d6a0: 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66   &respcode, buff
d6b0: 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f  er + offset, &co
d6c0: 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e  unt);....if (sen
d6d0: 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  d_ret == CACKEY_
d6e0: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
d6f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d700: 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e  PRINTF("ADPU Sen
d710: 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74  ding failed, ret
d720: 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65  rying read buffe
d730: 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  r");.....return(
d740: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
d750: 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75  er(slot, init_bu
d760: 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74  ffer, init_count
d770: 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69  , t_or_v, init_i
d780: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b  nitial_offset));
d790: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64  ...}....if (send
d7a0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
d7b0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69  CSC_S_OK) {....i
d7c0: 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
d7d0: 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20  x6A86) {.....if 
d7e0: 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29  (max_count == 1)
d7f0: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
d800: 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f  ...}......max_co
d810: 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20  unt = max_count 
d820: 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  / 2;......contin
d830: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  ue;....}.....CAC
d840: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d850: 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  ("cackey_send_ap
d860: 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74  du() failed, ret
d870: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d880: 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  e");.....return(
d890: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73  -1);...}....offs
d8a0: 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09  et += count;....
d8b0: 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f  if (count < max_
d8c0: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
d8d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d8e0: 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63  "Short read -- c
d8f0: 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31  ount = %i, cmd[1
d900: 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63  ] = %i", (int) c
d910: 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b  ount, (int) cmd[
d920: 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  1]);.....break;.
d930: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
d940: 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
d950: 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
d960: 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66  SIZE_MAX..if (of
d970: 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53  fset > _POSIX_SS
d980: 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
d990: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d9a0: 28 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 73  ("Offset exceeds
d9b0: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
d9c0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
d9d0: 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
d9e0: 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22  , offset = %lu)"
d9f0: 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
da00: 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
da10: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65  gned long) offse
da20: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
da30: 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
da40: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
da50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
da60: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
da70: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
da80: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
da90: 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72  ng) offset);...r
daa0: 65 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d  eturn(offset);.}
dab0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
dac0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
dad0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
dae0: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
daf0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
db00: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
db10: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
db20: 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  _len);. *. * ARG
db30: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
db40: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
db50: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
db60: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
db70: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
db80: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
db90: 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20  ar *aid. *      
dba0: 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69     Buffer contai
dbb0: 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74  ning Applet ID t
dbc0: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20  o select. *. *  
dbd0: 20 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65     size_t aid_le
dbe0: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  n. *         Num
dbf0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
dc00: 74 68 65 20 22 61 69 64 22 20 28 41 70 70 6c 65  the "aid" (Apple
dc10: 74 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a  t ID) parameter.
dc20: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
dc30: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
dc40: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
dc50: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
dc60: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
dc70: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
dc80: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
dc90: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
dca0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
dcb0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
dcc0: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72  elect_applet(str
dcd0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
dce0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
dcf0: 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f  char *aid, size_
dd00: 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e  t aid_len) {..in
dd10: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
dd20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dd30: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
dd40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dd50: 4e 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67  NTBUF("Selecting
dd60: 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20   applet:", aid, 
dd70: 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64  aid_len);...send
dd80: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
dd90: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
dda0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
ddb0: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  6, GSCIS_INSTR_S
ddc0: 45 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52  ELECT, GSCIS_PAR
ddd0: 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54  AM_SELECT_APPLET
dde0: 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c  , 0x00, aid_len,
ddf0: 20 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c   aid, 0x00, NULL
de00: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a  , NULL, NULL);..
de10: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
de20: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
de30: 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59  ETRY) {...CACKEY
de40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
de50: 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c  DPU Sending fail
de60: 65 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c  ed, retrying sel
de70: 65 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09  ect applet");...
de80: 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73  .return(cackey_s
de90: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
dea0: 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29  t, aid, aid_len)
deb0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64  );..}...if (send
dec0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
ded0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
dee0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
def0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  F("Failed to ope
df00: 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  n applet, return
df10: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
df20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
df30: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
df40: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
df50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
df60: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
df70: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
df80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
df90: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
dfa0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
dfb0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
dfc0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
dfd0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
dfe0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
dff0: 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  t ef);. *. * ARG
e000: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
e010: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e020: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
e030: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
e040: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
e050: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66       uint16_t ef
e060: 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d  . *         Elem
e070: 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65  ental File to se
e080: 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52  lect. *. * RETUR
e090: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
e0a0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
e0b0: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
e0c0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
e0d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
e0e0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
e0f0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
e100: 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45  his selects an E
e110: 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28  lementary File (
e120: 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75  EF) under the cu
e130: 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64  rrently selected
e140: 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65  . *     Dedicate
e150: 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20  d File (DF). *. 
e160: 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20  *     Typically 
e170: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  this is called a
e180: 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74  fter selecting t
e190: 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65  he correct Apple
e1a0: 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20  t (using. *     
e1b0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
e1c0: 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72  plet) for VM car
e1d0: 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ds. *. */.static
e1e0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
e1f0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
e200: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
e210: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
e220: 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65  t ef) {..unsigne
e230: 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32  d char fid_buf[2
e240: 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  ];..int send_ret
e250: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e260: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
e270: 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68  ");.../* Open th
e280: 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c  e elementary fil
e290: 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d  e */..fid_buf[0]
e2a0: 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30   = (ef >> 8) & 0
e2b0: 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d  xff;..fid_buf[1]
e2c0: 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09   = ef & 0xff;...
e2d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e2e0: 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66  NTF("Selecting f
e2f0: 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e  ile: %04lx", (un
e300: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29  signed long) ef)
e310: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
e320: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
e330: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
e340: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
e350: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30  _INSTR_SELECT, 0
e360: 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f  x02, 0x0C, sizeo
e370: 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f  f(fid_buf), fid_
e380: 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  buf, 0x00, NULL,
e390: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
e3a0: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
e3b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
e3c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e3d0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
e3e0: 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72   to open file, r
e3f0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e400: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
e410: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
e420: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
e430: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e440: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
e450: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
e460: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
e470: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
e480: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
e490: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
e4a0: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
e4b0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e4c0: 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20  ity *root);. *. 
e4d0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
e4e0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
e4f0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
e500: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f  t. *         Roo
e510: 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73  t of the TLV lis
e520: 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69  t to start freei
e530: 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ng. *. * RETURN 
e540: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
e550: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
e560: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
e570: 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56  on frees the TLV
e580: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72   linked listed r
e590: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20  eturned from. * 
e5a0: 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64      "cackey_read
e5b0: 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  _tlv". *. */.sta
e5c0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
e5d0: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
e5e0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
e5f0: 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75  y *root) {..stru
e600: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
e610: 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78  tity *curr, *nex
e620: 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d  t;...if (root ==
e630: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
e640: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  n;..}...for (cur
e650: 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20  r = root; curr; 
e660: 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09  curr = next) {..
e670: 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e  .next = curr->_n
e680: 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ext;....switch (
e690: 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09  curr->tag) {....
e6a0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
e6b0: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73  CR_TABLE:....cas
e6c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
e6d0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20  IFICATE:.....if 
e6e0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a  (curr->value) {.
e6f0: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
e700: 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  value);.....}...
e710: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
e720: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
e730: 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  RL:.....if (curr
e740: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
e750: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
e760: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
e770: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
e780: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  ak;...}....free(
e790: 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  curr);..}...retu
e7a0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
e7b0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
e7c0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
e7d0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
e7e0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
e7f0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
e800: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
e810: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
e820: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e830: 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  _entity *cackey_
e840: 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20  read_tlv(struct 
e850: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
e860: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
e870: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
e880: 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f  curr_entity, *ro
e890: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74  ot = NULL, *last
e8a0: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e   = NULL;..unsign
e8b0: 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66  ed char tlen_buf
e8c0: 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30  [2], tval_buf[10
e8d0: 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73  24], *tval;..uns
e8e0: 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f  igned char vlen_
e8f0: 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66  buf[2], vval_buf
e900: 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09  [8192], *vval;..
e910: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
e920: 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64  mpbuf;..unsigned
e930: 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b   long tmpbuflen;
e940: 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20  ..ssize_t tlen, 
e950: 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72  vlen;..ssize_t r
e960: 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74  ead_ret;..size_t
e970: 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f   offset_t = 0, o
e980: 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e  ffset_v = 0;..un
e990: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b  signed char tag;
e9a0: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b  ..size_t length;
e9b0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42  .#ifdef HAVE_LIB
e9c0: 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73  Z..int uncompres
e9d0: 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  s_ret;.#endif...
e9e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e9f0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
ea00: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
ea10: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
ea20: 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20  slot, tlen_buf, 
ea30: 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29  sizeof(tlen_buf)
ea40: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
ea50: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ea60: 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66   sizeof(tlen_buf
ea70: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
ea80: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
ea90: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
eaa0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
eab0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
eac0: 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74  ;..}...tlen = (t
ead0: 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29  len_buf[1] << 8)
eae0: 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a   | tlen_buf[0];.
eaf0: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
eb00: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
eb10: 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20  slot, vlen_buf, 
eb20: 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29  sizeof(vlen_buf)
eb30: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
eb40: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
eb50: 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66   sizeof(vlen_buf
eb60: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
eb70: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
eb80: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
eb90: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
eba0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
ebb0: 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76  ;..}...vlen = (v
ebc0: 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29  len_buf[1] << 8)
ebd0: 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a   | vlen_buf[0];.
ebe0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ebf0: 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74  RINTF("Tag Lengt
ec00: 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c  h = %lu, Value L
ec10: 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75  ength = %lu", (u
ec20: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c  nsigned long) tl
ec30: 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
ec40: 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66  ng) vlen);...off
ec50: 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66  set_t += 2;..off
ec60: 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66  set_v += 2;...if
ec70: 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (tlen > sizeof(
ec80: 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  tval_buf)) {...C
ec90: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
eca0: 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69  TF("Tag length i
ecb0: 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74  s too large, ret
ecc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
ecd0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
ece0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76  ULL);..}...if (v
ecf0: 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61  len > sizeof(vva
ed00: 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  l_buf)) {...CACK
ed10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ed20: 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73  "Value length is
ed30: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
ed40: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ed50: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ed60: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72  LL);..}...read_r
ed70: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
ed80: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76  _buffer(slot, tv
ed90: 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c  al_buf, tlen, 1,
eda0: 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20   offset_t);..if 
edb0: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65  (read_ret != tle
edc0: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
edd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
ede0: 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72  le to read entir
edf0: 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75  e T-buffer, retu
ee00: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ee10: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ee20: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72  LL);..}...read_r
ee30: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
ee40: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76  _buffer(slot, vv
ee50: 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c  al_buf, vlen, 2,
ee60: 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20   offset_v);..if 
ee70: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65  (read_ret != vle
ee80: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
ee90: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
eea0: 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72  le to read entir
eeb0: 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75  e V-buffer, retu
eec0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
eed0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
eee0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d  LL);..}...tval =
eef0: 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c   tval_buf;..vval
ef00: 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68   = vval_buf;..wh
ef10: 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26  ile (tlen > 0 &&
ef20: 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74   vlen > 0) {...t
ef30: 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76  ag = *tval;...tv
ef40: 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a  al++;...tlen--;.
ef50: 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20  ...if (*tval == 
ef60: 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74  0xff) {....lengt
ef70: 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20  h = (tval[2] << 
ef80: 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09  8) | tval[1];...
ef90: 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74  .tval += 3;....t
efa0: 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c  len -= 3;...} el
efb0: 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d  se {....length =
efc0: 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b   *tval;....tval+
efd0: 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09  +;....tlen--;...
efe0: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
eff0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25  G_PRINTF("Tag: %
f000: 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45  s (%02x)", CACKE
f010: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
f020: 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75  _TO_STR(tag), (u
f030: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67  nsigned int) tag
f040: 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
f050: 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75  G_PRINTBUF("Valu
f060: 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  e:", vval, lengt
f070: 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69  h);....curr_enti
f080: 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69  ty = NULL;...swi
f090: 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63  tch (tag) {....c
f0a0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
f0b0: 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f  RDURL:.....curr_
f0c0: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
f0d0: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
f0e0: 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f  ity));.....curr_
f0f0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
f100: 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  rdurl = malloc(s
f110: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
f120: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
f130: 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79  l));......memcpy
f140: 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  (curr_entity->va
f150: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
f160: 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09  , vval, 5);.....
f170: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
f180: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
f190: 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09  ype = vval[5];..
f1a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f1b0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
f1c0: 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b  bjectid = (vval[
f1d0: 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b  6] << 8) | vval[
f1e0: 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  7];.....curr_ent
f1f0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
f200: 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61  rl->appid = (vva
f210: 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61  l[8] << 8) | vva
f220: 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f  l[9];......curr_
f230: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
f240: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
f250: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
f260: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f270: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
f280: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63  ACR_TABLE:.....c
f290: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
f2a0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
f2b0: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74  _entity));.....t
f2c0: 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c  mpbuf = malloc(l
f2d0: 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d  ength);......mem
f2e0: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
f2f0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  , length);......
f300: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
f310: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
f320: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
f330: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75  = length;.....cu
f340: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
f350: 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63   = tmpbuf;.....c
f360: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
f370: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
f380: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
f390: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
f3a0: 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  ATE:.....curr_en
f3b0: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
f3c0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
f3d0: 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56  y));..#ifdef HAV
f3e0: 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75  E_LIBZ.....tmpbu
f3f0: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20  flen = length * 
f400: 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  2;.....tmpbuf = 
f410: 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
f420: 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65  );......uncompre
f430: 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72  ss_ret = uncompr
f440: 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70  ess(tmpbuf, &tmp
f450: 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65  buflen, vval, le
f460: 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75  ngth);.....if (u
f470: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d  ncompress_ret !=
f480: 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41   Z_OK) {......CA
f490: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f4a0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63  F("Failed to dec
f4b0: 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72  ompress, uncompr
f4c0: 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25  ess() returned %
f4d0: 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74  i -- resorting t
f4e0: 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20  o direct copy", 
f4f0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b  uncompress_ret);
f500: 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  .......tmpbuflen
f510: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09   = length;......
f520: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
f530: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
f540: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
f550: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
f560: 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a  Decompressed to:
f570: 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ", tmpbuf, tmpbu
f580: 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09  flen);.#else....
f590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f5a0: 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c  INTF("Missing ZL
f5b0: 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73  IB Support, this
f5c0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
f5d0: 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e  likely useless..
f5e0: 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66  .");......tmpbuf
f5f0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
f600: 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c  ..memcpy(tmpbuf,
f610: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
f620: 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72  #endif......curr
f630: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
f640: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
f650: 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d  ity->length = tm
f660: 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72  pbuflen;.....cur
f670: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
f680: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
f690: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
f6a0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
f6b0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
f6c0: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
f6d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
f6e0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
f6f0: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a  curr_entity));..
f700: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f710: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
f720: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
f730: 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30  ue_byte = vval[0
f740: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
f750: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
f760: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f770: 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e  }....vval += len
f780: 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c  gth;...vlen -= l
f790: 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75  ength;....if (cu
f7a0: 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c  rr_entity != NUL
f7b0: 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74  L) {....if (root
f7c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
f7d0: 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  root = curr_enti
f7e0: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ty;....}.....if 
f7f0: 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  (last != NULL) {
f800: 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74  .....last->_next
f810: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
f820: 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20  ...}.....last = 
f830: 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d  curr_entity;...}
f840: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f  ..}...return(roo
f850: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
f860: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
f870: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
f880: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
f890: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
f8a0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
f8b0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
f8c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
f8d0: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
f8e0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
f8f0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f900: 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74  y *start, size_t
f910: 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65   count, int free
f920: 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f  _start) {..size_
f930: 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61  t idx;...if (sta
f940: 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
f950: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
f960: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
f970: 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b   count; idx++) {
f980: 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78  ...if (start[idx
f990: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b  ].certificate) {
f9a0: 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69  ....free(start[i
f9b0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29  dx].certificate)
f9c0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66  ;...}..}...if (f
f9d0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66  ree_start) {...f
f9e0: 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a  ree(start);..}..
f9f0: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
fa00: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
fa10: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
fa20: 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74  cackey_copy_cert
fa30: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
fa40: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64  pcsc_identity *d
fa50: 65 73 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  est, struct cack
fa60: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fa70: 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20   *start, size_t 
fa80: 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74  count) {..size_t
fa90: 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72   idx;...if (star
faa0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
fab0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
fac0: 0a 09 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55  ..if (dest == NU
fad0: 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d  LL) {...dest = m
fae0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65  alloc(sizeof(*de
faf0: 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d  st) * count);..}
fb00: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
fb10: 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64   idx < count; id
fb20: 78 2b 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69 64  x++) {...dest[id
fb30: 78 5d 2e 69 64 5f 74 79 70 65 20 3d 20 73 74 61  x].id_type = sta
fb40: 72 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 3b  rt[idx].id_type;
fb50: 0a 0a 09 09 73 77 69 74 63 68 20 28 64 65 73 74  ....switch (dest
fb60: 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 29 20 7b  [idx].id_type) {
fb70: 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
fb80: 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09  ID_TYPE_CAC:....
fb90: 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78  .memcpy(dest[idx
fba0: 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ].card.cac.apple
fbb0: 74 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61  t, start[idx].ca
fbc0: 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
fbd0: 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e  izeof(dest[idx].
fbe0: 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29  card.cac.applet)
fbf0: 29 3b 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d  );.....dest[idx]
fc00: 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d  .card.cac.file =
fc10: 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64   start[idx].card
fc20: 2e 63 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09 62  .cac.file;.....b
fc30: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41  reak;....case CA
fc40: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
fc50: 3a 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e  :.....dest[idx].
fc60: 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20  card.piv.key_id 
fc70: 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  = start[idx].car
fc80: 64 2e 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09 09  d.piv.key_id;...
fc90: 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64  ..memcpy(dest[id
fca0: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  x].card.piv.labe
fcb0: 6c 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61  l, start[idx].ca
fcc0: 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73 69  rd.piv.label, si
fcd0: 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63  zeof(dest[idx].c
fce0: 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 29 29 3b  ard.piv.label));
fcf0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
fd00: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
fd10: 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
fd20: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 64  ..break;...}...d
fd30: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
fd40: 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72 74  cate_len = start
fd50: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fd60: 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69 64  e_len;...dest[id
fd70: 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74 61  x].keysize = sta
fd80: 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 3b  rt[idx].keysize;
fd90: 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65  ....dest[idx].ce
fda0: 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
fdb0: 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  oc(dest[idx].cer
fdc0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
fdd0: 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78  .memcpy(dest[idx
fde0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 73  ].certificate, s
fdf0: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
fe00: 69 63 61 74 65 2c 20 64 65 73 74 5b 69 64 78 5d  icate, dest[idx]
fe10: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
fe20: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 64  );..}...return(d
fe30: 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  est);.}../*. * S
fe40: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
fe50: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
fe60: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
fe70: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
fe80: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
fe90: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
fea0: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
feb0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
fec0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
fed0: 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
fee0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
fef0: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
ff00: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
ff10: 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e  ntity *certs, un
ff20: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75  signed long *cou
ff30: 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nt) {..struct ca
ff40: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
ff50: 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74  ty *curr_id;..st
ff60: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
ff70: 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c  entity *ccc_tlv,
ff80: 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70   *ccc_curr, *app
ff90: 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b  _tlv, *app_curr;
ffa0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
ffb0: 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43  ccc_aid[] = {GSC
ffc0: 49 53 5f 41 49 44 5f 43 43 43 7d 2c 20 70 69 76  IS_AID_CCC}, piv
ffd0: 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  _aid[] = {NISTSP
ffe0: 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41 49 44  800_73_3_PIV_AID
fff0: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
10000 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70 69 76 5f  r *piv_oid, piv_
10010 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d 20 3d 20  oid_pivauth[] = 
10020 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f  {NISTSP800_73_3_
10030 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c 20 70 69  OID_PIVAUTH}, pi
10040 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 5b  v_oid_signature[
10050 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
10060 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52  3_3_OID_SIGNATUR
10070 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d  E}, piv_oid_keym
10080 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30  gt[] = {NISTSP80
10090 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47  0_73_3_OID_KEYMG
100a0 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  T};..unsigned ch
100b0 61 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a  ar curr_aid[7];.
100c0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
100d0 75 66 66 65 72 5b 38 31 39 32 5d 2c 20 2a 62 75  uffer[8192], *bu
100e0 66 66 65 72 5f 70 2c 20 2a 74 6d 70 62 75 66 3b  ffer_p, *tmpbuf;
100f0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
10100 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 68 61  outidx = 0;..cha
10110 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63  r *piv_label;..c
10120 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61  ackey_ret transa
10130 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a  ction_ret;..ssiz
10140 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73  e_t read_ret;..s
10150 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
10160 2c 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e  , tmpbuflen;..in
10170 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  t certs_resizabl
10180 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
10190 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69  , select_ret;..i
101a0 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20  nt piv_key, piv 
101b0 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 23  = 0;..int idx;.#
101c0 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
101d0 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
101e0 72 65 74 3b 0a 09 7a 5f 73 74 72 65 61 6d 20 67  ret;..z_stream g
101f0 7a 69 70 5f 73 74 72 65 61 6d 3b 0a 23 65 6e 64  zip_stream;.#end
10200 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
10210 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
10220 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74  .");...if (count
10230 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
10240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10250 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  F("count is NULL
10260 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
10270 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
10280 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
10290 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c  if (certs != NUL
102a0 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e  L) {...if (*coun
102b0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t == 0) {....CAC
102c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
102d0 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72  ("Requested we r
102e0 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c  eturn 0 objects,
102f0 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29   short-circuit")
10300 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72  ;.....return(cer
10310 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  ts);...}..}...if
10320 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65   (!slot->slot_re
10330 73 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f  set) {...if (slo
10340 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29  t->cached_certs)
10350 20 7b 0a 09 09 09 69 66 20 28 63 65 72 74 73 20   {....if (certs 
10360 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63  == NULL) {.....c
10370 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
10380 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73  zeof(*certs) * s
10390 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
103a0 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63  s_count);.....*c
103b0 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63  ount = slot->cac
103c0 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b  hed_certs_count;
103d0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
103e0 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c  .if (*count > sl
103f0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
10400 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a  _count) {......*
10410 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61  count = slot->ca
10420 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
10430 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
10440 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  .cackey_copy_cer
10450 74 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e  ts(certs, slot->
10460 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63  cached_certs, *c
10470 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  ount);.....retur
10480 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
10490 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63  ...if (slot->cac
104a0 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63  hed_certs) {...c
104b0 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
104c0 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
104d0 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65  rts, slot->cache
104e0 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31  d_certs_count, 1
104f0 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68  );....slot->cach
10500 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ed_certs = NULL;
10510 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61  ..}.../* Begin a
10520 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73   SmartCard trans
10530 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73  action */..trans
10540 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63  action_ret = cac
10550 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
10560 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66  ction(slot);..if
10570 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65   (transaction_re
10580 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
10590 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
105a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
105b0 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61  Unable begin tra
105c0 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
105d0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
105e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
105f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
10600 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
10610 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
10620 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
10630 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
10640 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
10650 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
10660 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
10670 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  ble = 0;..}.../*
10680 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20   Select the CCC 
10690 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f  Applet */..send_
106a0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
106b0 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
106c0 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66   ccc_aid, sizeof
106d0 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20  (ccc_aid));..if 
106e0 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
106f0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
10700 0a 09 09 2f 2a 20 54 72 79 20 50 49 56 20 61 70  .../* Try PIV ap
10710 70 6c 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73  plication */...s
10720 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10730 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10740 6c 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69  lot, piv_aid, si
10750 7a 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a  zeof(piv_aid));.
10760 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
10770 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
10780 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
10790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
107a0 20 68 61 76 65 20 61 20 50 49 56 20 63 61 72 64   have a PIV card
107b0 20 2d 2d 20 6e 6f 74 20 75 73 69 6e 67 20 74 68   -- not using th
107c0 65 20 43 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70  e CCC, pulling p
107d0 72 65 2d 73 65 6c 65 63 74 65 64 20 6b 65 79 73  re-selected keys
107e0 22 29 3b 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b  ");.....piv = 1;
107f0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
10800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10810 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
10820 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c  lect CCC Applet,
10830 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
10840 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20  ilure");...../* 
10850 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
10860 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
10870 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
10880 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
10890 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e  t);.....return(N
108a0 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ULL);...}..}...i
108b0 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20  f (piv) {...for 
108c0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
108d0 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73  3; idx++) {....s
108e0 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09  witch (idx) {...
108f0 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70  ..case 0:......p
10900 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64  iv_oid = piv_oid
10910 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70  _pivauth;......p
10920 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38  iv_key = NISTSP8
10930 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
10940 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61  UTH;......piv_la
10950 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 63  bel = "Authentic
10960 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65  ation";......bre
10970 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a  ak;.....case 1:.
10980 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70  .....piv_oid = p
10990 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65  iv_oid_signature
109a0 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d  ;......piv_key =
109b0 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
109c0 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09  KEY_SIGNATURE;..
109d0 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20  ....piv_label = 
109e0 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 09  "Signature";....
109f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
10a00 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69  e 2:......piv_oi
10a10 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d  d = piv_oid_keym
10a20 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79  gt;......piv_key
10a30 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f   = NISTSP800_78_
10a40 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09  3_KEY_KEYMGT;...
10a50 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22  ...piv_label = "
10a60 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b  Key Management";
10a70 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10a80 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 3d  }.....read_ret =
10a90 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
10aa0 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 73  (slot, buffer, s
10ab0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 70  izeof(buffer), p
10ac0 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20  iv_oid);.....if 
10ad0 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  (read_ret <= 0) 
10ae0 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
10af0 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64  ...}.....curr_id
10b00 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78   = &certs[outidx
10b10 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ];....outidx++;.
10b20 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79  ....curr_id->key
10b30 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75  size = -1;....cu
10b40 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d  rr_id->id_type =
10b50 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
10b60 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d  PIV;....curr_id-
10b70 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  >card.piv.key_id
10b80 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d   = piv_key;....m
10b90 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63  emcpy(curr_id->c
10ba0 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70  ard.piv.label, p
10bb0 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e  iv_label, strlen
10bc0 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29  (piv_label) + 1)
10bd0 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ;.....curr_id->c
10be0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
10bf0 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75   read_ret;....cu
10c00 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
10c10 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
10c20 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10c30 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65  _len);.....buffe
10c40 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62  r_len = sizeof(b
10c50 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66 65  uffer);....buffe
10c60 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
10c70 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
10c80 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
10c90 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 2d  , 0x70, curr_id-
10ca0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 26 63  >certificate, &c
10cb0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10cc0 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66  ate_len);.....if
10cd0 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55   (buffer_p == NU
10ce0 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  LL) {.....CACKEY
10cf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
10d00 65 61 64 69 6e 67 20 63 65 72 74 69 66 69 63 61  eading certifica
10d10 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20  te from BER-TLV 
10d20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c  response failed,
10d30 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 69   skipping key %i
10d40 22 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09 66 72  ", idx);......fr
10d50 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ee(curr_id->cert
10d60 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 63  ificate);......c
10d70 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10d80 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ate = NULL;.....
10d90 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09  .outidx--;......
10da0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
10db0 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a  #ifdef HAVE_LIBZ
10dc0 0a 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d  ....if (curr_id-
10dd0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
10de0 20 3e 20 34 29 20 7b 0a 09 09 09 09 69 66 20 28   > 4) {.....if (
10df0 6d 65 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d 3e  memcmp(curr_id->
10e00 63 65 72 74 69 66 69 63 61 74 65 2c 20 22 5c 78  certificate, "\x
10e10 31 66 5c 78 38 62 5c 78 30 38 5c 78 30 30 22 2c  1f\x8b\x08\x00",
10e20 20 34 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09   4) == 0) {.....
10e30 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63 75 72  .tmpbuflen = cur
10e40 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
10e50 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09 09 09  e_len * 2;......
10e60 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
10e70 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  tmpbuflen);.....
10e80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10e90 52 49 4e 54 42 55 46 28 22 41 74 74 65 6d 70 74  RINTBUF("Attempt
10ea0 69 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72 65 73  ing to decompres
10eb0 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  s:", curr_id->ce
10ec0 72 74 69 66 69 63 61 74 65 2c 20 63 75 72 72 5f  rtificate, curr_
10ed0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
10ee0 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a 69 70  len);.......gzip
10ef0 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d  _stream.zalloc =
10f00 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70   NULL;......gzip
10f10 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d 20  _stream.zfree = 
10f20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f  NULL;......gzip_
10f30 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20  stream.opaque = 
10f40 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a 69 70  NULL;.......gzip
10f50 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20  _stream.next_in 
10f60 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74   = curr_id->cert
10f70 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 67 7a  ificate;......gz
10f80 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  ip_stream.avail_
10f90 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65  in = curr_id->ce
10fa0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
10fb0 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
10fc0 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75  next_out = tmpbu
10fd0 66 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  f;......gzip_str
10fe0 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20  eam.avail_out = 
10ff0 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  tmpbuflen;......
11000 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  .uncompress_ret 
11010 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 28 26 67  = inflateInit(&g
11020 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09  zip_stream);....
11030 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
11040 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret == Z_OK) {.
11050 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73  ......uncompress
11060 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 52 65  _ret = inflateRe
11070 73 65 74 32 28 26 67 7a 69 70 5f 73 74 72 65 61  set2(&gzip_strea
11080 6d 2c 20 33 31 29 3b 0a 09 09 09 09 09 7d 0a 09  m, 31);......}..
11090 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65  ....if (uncompre
110a0 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20  ss_ret == Z_OK) 
110b0 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65  {.......uncompre
110c0 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65  ss_ret = inflate
110d0 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20 30  (&gzip_stream, 0
110e0 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 69  );......}......i
110f0 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
11100 74 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e  t == Z_STREAM_EN
11110 44 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d  D) {.......uncom
11120 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c  press_ret = infl
11130 61 74 65 45 6e 64 28 26 67 7a 69 70 5f 73 74 72  ateEnd(&gzip_str
11140 65 61 6d 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73  eam);......} els
11150 65 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70  e {.......uncomp
11160 72 65 73 73 5f 72 65 74 20 3d 20 5a 5f 44 41 54  ress_ret = Z_DAT
11170 41 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09 7d 0a  A_ERROR;......}.
11180 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72  .....if (uncompr
11190 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29  ess_ret == Z_OK)
111a0 20 7b 0a 09 09 09 09 09 09 74 6d 70 62 75 66 6c   {.......tmpbufl
111b0 65 6e 20 3d 20 67 7a 69 70 5f 73 74 72 65 61 6d  en = gzip_stream
111c0 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09 09  .total_out;.....
111d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
111e0 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d 70  PRINTBUF("Decomp
111f0 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70  ressed to:", tmp
11200 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b  buf, tmpbuflen);
11210 0a 0a 09 09 09 09 09 09 66 72 65 65 28 63 75 72  ........free(cur
11220 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
11230 65 29 3b 0a 0a 09 09 09 09 09 09 63 75 72 72 5f  e);........curr_
11240 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
11250 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 09 09  = tmpbuf;.......
11260 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11270 63 61 74 65 5f 6c 65 6e 20 3d 20 74 6d 70 62 75  cate_len = tmpbu
11280 66 6c 65 6e 3b 0a 09 09 09 09 09 7d 20 65 6c 73  flen;......} els
11290 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  e {.......CACKEY
112a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
112b0 65 63 6f 6d 70 72 65 73 73 69 6e 67 20 66 61 69  ecompressing fai
112c0 6c 65 64 21 20 75 6e 63 6f 6d 70 72 65 73 73 28  led! uncompress(
112d0 29 20 72 65 74 75 72 6e 65 64 20 25 69 22 2c 20  ) returned %i", 
112e0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b  uncompress_ret);
112f0 0a 0a 09 09 09 09 09 09 66 72 65 65 28 74 6d 70  ........free(tmp
11300 62 75 66 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09  buf);......}....
11310 09 7d 0a 09 09 09 7d 0a 23 65 6e 64 69 66 0a 09  .}....}.#endif..
11320 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f  .}..} else {.../
11330 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61  * Read all the a
11340 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20  pplets from the 
11350 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63  CCC's TLV */...c
11360 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  cc_tlv = cackey_
11370 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
11380 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43  .../* Look for C
11390 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f  ARDURLs that coo
113a0 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61  respond to PKI a
113b0 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20  pplets */...for 
113c0 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f  (ccc_curr = ccc_
113d0 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 63  tlv; ccc_curr; c
113e0 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 75  cc_curr = ccc_cu
113f0 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  rr->_next) {....
11400 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11410 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20  NTF("Found tag: 
11420 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59  %s ... ", CACKEY
11430 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
11440 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
11450 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20 28  >tag));.....if (
11460 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d  ccc_curr->tag !=
11470 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
11480 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  RL) {.....CACKEY
11490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
114a0 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74   ... skipping it
114b0 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61   (we only care a
114c0 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22 29  bout CARDURLs)")
114d0 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
114e0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28 63  ....}.....if ((c
114f0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
11500 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20  ardurl->apptype 
11510 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  & CACKEY_TLV_APP
11520 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f  _PKI) != CACKEY_
11530 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09  TLV_APP_PKI) {..
11540 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11550 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
11560 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
11570 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
11580 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
11590 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
115a0 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
115b0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
115c0 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
115d0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
115e0 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
115f0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
11600 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
11610 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
11620 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
11630 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
11640 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
11650 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72 72  "RID:", ccc_curr
11660 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11670 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63  >rid, sizeof(ccc
11680 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11690 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09  durl->rid));....
116a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
116b0 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f  NTF("AppID = %s/
116c0 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
116d0 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
116e0 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
116f0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
11700 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  appid), (unsigne
11710 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72  d long) ccc_curr
11720 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11730 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43 4b  >appid);....CACK
11740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11750 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25  "ObjectID = %s/%
11760 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45  04lx", CACKEY_DE
11770 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
11780 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
11790 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
117a0 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67  bjectid), (unsig
117b0 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
117c0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
117d0 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09  l->objectid);...
117e0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69  ..memcpy(curr_ai
117f0 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  d, ccc_curr->val
11800 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
11810 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72   sizeof(ccc_curr
11820 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11830 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72 5f  >rid));....curr_
11840 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f  aid[sizeof(curr_
11850 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63  aid) - 2] = (ccc
11860 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11870 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38  durl->appid >> 8
11880 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75 72  ) & 0xff;....cur
11890 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72  r_aid[sizeof(cur
118a0 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63  r_aid) - 1] = cc
118b0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
118c0 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30  rdurl->appid & 0
118d0 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65  xff;...../* Sele
118e0 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 20  ct found applet 
118f0 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74  ... */....select
11900 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
11910 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
11920 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65  , curr_aid, size
11930 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09  of(curr_aid));..
11940 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74  ..if (select_ret
11950 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
11960 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  S_OK) {.....CACK
11970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11980 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
11990 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69  t applet, skippi
119a0 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  ng processing of
119b0 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a   this object");.
119c0 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
119d0 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61  ..}...../* ... a
119e0 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29  nd object (file)
119f0 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65   */....select_re
11a00 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
11a10 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
11a20 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11a30 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
11a40 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ....if (select_r
11a50 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
11a60 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  C_S_OK) {.....CA
11a70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11a80 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c  F("Failed to sel
11a90 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69  ect file, skippi
11aa0 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  ng processing of
11ab0 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a   this object");.
11ac0 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
11ad0 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65  ..}...../* Proce
11ae0 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54  ss this file's T
11af0 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63  LV looking for c
11b00 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
11b10 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b  ..app_tlv = cack
11b20 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74  ey_read_tlv(slot
11b30 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70 70  );......for (app
11b40 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b  _curr = app_tlv;
11b50 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63   app_curr; app_c
11b60 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e  urr = app_curr->
11b70 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41 43  _next) {.....CAC
11b80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11b90 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 22  ("Found tag: %s"
11ba0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
11bb0 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61  UNC_TAG_TO_STR(a
11bc0 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a  pp_curr->tag));.
11bd0 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 72 72  ....if (app_curr
11be0 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54  ->tag != GSCIS_T
11bf0 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  AG_CERTIFICATE) 
11c00 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
11c10 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
11c20 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
11c30 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
11c40 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29 22  t CERTIFICATEs)"
11c50 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75  );.......continu
11c60 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 75  e;.....}......cu
11c70 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f  rr_id = &certs[o
11c80 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69  utidx];.....outi
11c90 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f  dx++;......curr_
11ca0 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41  id->id_type = CA
11cb0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
11cc0 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ;.....memcpy(cur
11cd0 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
11ce0 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c  pplet, curr_aid,
11cf0 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
11d00 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
11d10 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  ));.....curr_id-
11d20 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d  >card.cac.file =
11d30 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
11d40 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
11d50 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  id;.....curr_id-
11d60 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a  >keysize = -1;..
11d70 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11d80 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67  _PRINTF("Filling
11d90 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
11da0 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20 77  ac.applet (%p) w
11db0 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c  ith %lu bytes:",
11dc0 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
11dd0 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73 69  ac.applet, (unsi
11de0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f  gned long) sizeo
11df0 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11e00 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  cac.applet));...
11e10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11e20 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20  RINTBUF("VAL:", 
11e30 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61  curr_id->card.ca
11e40 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  c.applet, sizeof
11e50 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63  (curr_id->card.c
11e60 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09  ac.applet));....
11e70 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
11e80 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70  ficate_len = app
11e90 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a  _curr->length;..
11ea0 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
11eb0 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
11ec0 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  c(curr_id->certi
11ed0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
11ee0 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d  .memcpy(curr_id-
11ef0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61 70  >certificate, ap
11f00 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63  p_curr->value, c
11f10 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11f20 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ate_len);......i
11f30 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f  f (outidx >= *co
11f40 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20 28  unt) {......if (
11f50 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
11f60 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74 20   {.......*count 
11f70 2a 3d 20 32 3b 0a 09 09 09 09 09 09 69 66 20 28  *= 2;.......if (
11f80 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  *count != 0) {..
11f90 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65  ......certs = re
11fa0 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a  alloc(certs, siz
11fb0 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a  eof(*certs) * (*
11fc0 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 09 7d  count));.......}
11fd0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 63   else {........c
11fe0 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  erts = NULL;....
11ff0 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65  ...}......} else
12000 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
12010 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
12020 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65  }.....cackey_fre
12030 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a  e_tlv(app_tlv);.
12040 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e  ....if (outidx >
12050 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  = *count) {.....
12060 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  break;....}...}.
12070 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  ...cackey_free_t
12080 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a  lv(ccc_tlv);..}.
12090 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64  ..*count = outid
120a0 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72  x;...if (certs_r
120b0 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 69 66  esizable) {...if
120c0 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b   (*count != 0) {
120d0 0a 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c  ....certs = real
120e0 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f  loc(certs, sizeo
120f0 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f  f(*certs) * (*co
12100 75 6e 74 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20  unt));...} else 
12110 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 4e 55 4c  {....certs = NUL
12120 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73 6c 6f 74  L;...}..}...slot
12130 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d  ->cached_certs =
12140 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72   cackey_copy_cer
12150 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20  ts(NULL, certs, 
12160 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e  *count);..slot->
12170 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
12180 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f  nt = *count;.../
12190 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72  * Terminate Smar
121a0 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tCard Transactio
121b0 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
121c0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
121d0 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72  t);...return(cer
121e0 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ts);.}../*. * SY
121f0 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
12200 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
12210 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
12220 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
12230 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
12240 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
12250 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
12260 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73  ssize_t cackey_s
12270 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75 63  igndecrypt(struc
12280 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
12290 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
122a0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
122b0 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
122c0 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f  char *buf, size_
122d0 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e  t buflen, unsign
122e0 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c  ed char *outbuf,
122f0 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65   size_t outbufle
12300 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c  n, int padInput,
12310 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74   int unpadOutput
12320 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  ) {..cackey_pcsc
12330 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65  _id_type id_type
12340 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
12350 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61   dyn_auth_templa
12360 74 65 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61 75 74  te[10], *dyn_aut
12370 68 5f 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67  h_tmpbuf;..unsig
12380 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66  ned char *tmpbuf
12390 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75  , *tmpbuf_s, *ou
123a0 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f  tbuf_s, *outbuf_
123b0 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  p;..unsigned cha
123c0 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  r bytes_to_send,
123d0 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73   p1, class;..uns
123e0 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b  igned char block
123f0 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65  type;..cackey_re
12400 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e  t send_ret;..uin
12410 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
12420 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20  .ssize_t retval 
12430 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74  = 0, unpadoffset
12440 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66  ;..size_t tmpbuf
12450 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70  len, padlen, tmp
12460 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75  outbuflen, outbu
12470 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65  f_len;..int free
12480 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e  _tmpbuf = 0;..in
12490 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  t le;...CACKEY_D
124a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
124b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
124c0 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
124d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
124e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f  NTF("Error.  slo
124f0 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  t is NULL");....
12500 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
12510 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c  .if (buf == NULL
12520 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12530 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12540 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29  .  buf is NULL")
12550 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
12560 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66  ..}...if (outbuf
12570 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
12580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12590 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75  F("Error.  outbu
125a0 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  f is NULL");....
125b0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
125c0 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d  .if (identity ==
125d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
125e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
125f0 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
12600 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
12610 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
12620 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
12630 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  sc_identity == N
12640 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
12650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
12660 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
12670 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
12680 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
12690 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f  rn(-1);..}...id_
126a0 74 79 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  type = identity-
126b0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
126c0 69 64 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64  id_type;..if (id
126d0 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f  _type == CACKEY_
126e0 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
126f0 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  Y) {...CACKEY_DE
12700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12710 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
12720 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43  sc_identity is C
12730 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
12740 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63  RT_ONLY, which c
12750 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f  annot be used fo
12760 72 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29  r sign/decrypt")
12770 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
12780 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64  ..}...switch (id
12790 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
127a0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
127b0 49 56 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45  IV:...case CACKE
127c0 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09  Y_ID_TYPE_CAC:..
127d0 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75  ..break;...defau
127e0 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  lt:....CACKEY_DE
127f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12800 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
12810 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e  sc_identity is n
12820 6f 74 20 61 20 73 75 70 70 6f 72 74 65 64 20 76  ot a supported v
12830 61 6c 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30  alue. Type is: 0
12840 78 25 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c  x%lx (PIV = 0x%l
12850 78 2c 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22  x, CAC = 0x%lx)"
12860 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12870 29 20 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69  ) id_type, (unsi
12880 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45  gned long) CACKE
12890 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28  Y_ID_TYPE_PIV, (
128a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43  unsigned long) C
128b0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
128c0 43 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  C);.....return(-
128d0 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  1);..}.../* Dete
128e0 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b  rmine identity K
128f0 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28  ey size */..if (
12900 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12910 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
12920 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69   < 0) {...identi
12930 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12940 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30  y->keysize = x50
12950 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65  9_to_keysize(ide
12960 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12970 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
12980 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  e, identity->pcs
12990 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
129a0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d  ificate_len);..}
129b0 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67  .../* Pad messag
129c0 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f  e to key size */
129d0 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20  ..if (padInput) 
129e0 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79  {...if (identity
129f0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
12a00 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a  >keysize > 0) {.
12a10 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d  ...if (buflen !=
12a20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
12a30 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
12a40 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66  e) {.....if (buf
12a50 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d  len > (identity-
12a60 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12a70 6b 65 79 73 69 7a 65 20 2d 20 33 29 29 20 7b 0a  keysize - 3)) {.
12a80 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12a90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12aa0 20 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f    Message is too
12ab0 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64   large to sign/d
12ac0 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09  ecrypt");.......
12ad0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09  return(-1);.....
12ae0 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  }......tmpbuflen
12af0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73   = identity->pcs
12b00 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
12b10 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20  ize;.....tmpbuf 
12b20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c  = malloc(tmpbufl
12b30 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d  en);.....free_tm
12b40 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70  pbuf = 1;......p
12b50 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65  adlen = tmpbufle
12b60 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a  n - buflen - 3;.
12b70 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12b80 47 5f 50 52 49 4e 54 46 28 22 4e 65 65 64 20 74  G_PRINTF("Need t
12b90 6f 20 70 61 64 20 74 68 65 20 62 75 66 66 65 72  o pad the buffer
12ba0 20 77 69 74 68 20 25 6c 6c 75 20 62 79 74 65 73   with %llu bytes
12bb0 20 28 74 6d 70 62 75 66 6c 65 6e 20 3d 20 25 6c   (tmpbuflen = %l
12bc0 6c 75 2c 20 62 75 66 6c 65 6e 20 3d 20 25 6c 6c  lu, buflen = %ll
12bd0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
12be0 6f 6e 67 20 6c 6f 6e 67 29 20 70 61 64 6c 65 6e  ong long) padlen
12bf0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12c00 20 6c 6f 6e 67 29 20 74 6d 70 62 75 66 6c 65 6e   long) tmpbuflen
12c10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12c20 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 3b 0a   long) buflen);.
12c30 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53  ...../* RSA PKCS
12c40 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31  #1 EMSA-PKCS1-v1
12c50 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09  _5 Padding */...
12c60 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78  ..tmpbuf[0] = 0x
12c70 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31  00;.....tmpbuf[1
12c80 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65  ] = 0x01;.....me
12c90 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c  mset(&tmpbuf[2],
12ca0 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a   0xFF, padlen);.
12cb0 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65  ....tmpbuf[padle
12cc0 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09  n + 2]= 0x00;...
12cd0 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66  ..memcpy(&tmpbuf
12ce0 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75  [padlen + 3], bu
12cf0 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  f, buflen);.....
12d00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12d10 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64  INTBUF("Unpadded
12d20 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29  :", buf, buflen)
12d30 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
12d40 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64  UG_PRINTBUF("Pad
12d50 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74  ded:", tmpbuf, t
12d60 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20  mpbuflen);....} 
12d70 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75  else {.....tmpbu
12d80 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70  f = buf;.....tmp
12d90 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
12da0 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  .....free_tmpbuf
12db0 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e   = 0;.....padlen
12dc0 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65   = 0;....}...} e
12dd0 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
12de0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
12df0 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
12e00 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69  e key size, hopi
12e10 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69  ng the message i
12e20 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65  s properly padde
12e30 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66  d!");.....tmpbuf
12e40 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75   = buf;....tmpbu
12e50 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
12e60 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
12e70 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30  0;....padlen = 0
12e80 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
12e90 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
12ea0 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
12eb0 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70  flen;...free_tmp
12ec0 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65  buf = 0;...padle
12ed0 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42  n = 0;..}.../* B
12ee0 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
12ef0 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69   */..cackey_begi
12f00 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
12f10 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74  ot);.../* Select
12f20 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20   correct applet 
12f30 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74  */..switch (id_t
12f40 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41  ype) {...case CA
12f50 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
12f60 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
12f70 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74  G_PRINTF("Select
12f80 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64  ing applet found
12f90 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65   at %p ...", ide
12fa0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12fb0 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61  tity->card.cac.a
12fc0 70 70 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65  pplet);....cacke
12fd0 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
12fe0 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e  slot, identity->
12ff0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
13000 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20  ard.cac.applet, 
13010 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d  sizeof(identity-
13020 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
13030 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29  card.cac.applet)
13040 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74  );...../* Select
13050 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f   correct file */
13060 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  ....cackey_selec
13070 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65  t_file(slot, ide
13080 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
13090 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66  tity->card.cac.f
130a0 69 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  ile);....break;.
130b0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
130c0 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79  _TYPE_PIV:....dy
130d0 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
130e0 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79  0] = 0x7C;....dy
130f0 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
13100 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79  1] = 0x82;....dy
13110 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
13120 32 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e  2] = ((tmpbuflen
13130 20 2b 20 36 29 20 26 20 30 78 66 66 30 30 29 20   + 6) & 0xff00) 
13140 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74  >> 8;....dyn_aut
13150 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20  h_template[3] = 
13160 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20  (tmpbuflen + 6) 
13170 26 20 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e  & 0x00ff;....dyn
13180 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34  _auth_template[4
13190 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e  ] = 0x82;....dyn
131a0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35  _auth_template[5
131b0 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e  ] = 0x00;....dyn
131c0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36  _auth_template[6
131d0 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e  ] = 0x81;....dyn
131e0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37  _auth_template[7
131f0 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e  ] = 0x82;....dyn
13200 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38  _auth_template[8
13210 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26  ] = (tmpbuflen &
13220 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
13230 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
13240 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c  ate[9] = tmpbufl
13250 65 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09  en & 0x00ff;....
13260 09 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66  .dyn_auth_tmpbuf
13270 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
13280 6c 65 6e 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e  len + sizeof(dyn
13290 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 29  _auth_template))
132a0 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79 6e 5f  ;....memcpy(dyn_
132b0 61 75 74 68 5f 74 6d 70 62 75 66 2c 20 64 79 6e  auth_tmpbuf, dyn
132c0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20  _auth_template, 
132d0 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f  sizeof(dyn_auth_
132e0 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d  template));....m
132f0 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74  emcpy(dyn_auth_t
13300 6d 70 62 75 66 20 2b 20 73 69 7a 65 6f 66 28 64  mpbuf + sizeof(d
13310 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13320 29 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ), tmpbuf, tmpbu
13330 66 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 66  flen);.....if (f
13340 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
13350 09 09 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a  ..free(tmpbuf);.
13360 09 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75 66 6c  ...}.....tmpbufl
13370 65 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 64 79 6e  en += sizeof(dyn
13380 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 3b  _auth_template);
13390 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 64 79 6e  ....tmpbuf = dyn
133a0 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 09  _auth_tmpbuf;...
133b0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31  .free_tmpbuf = 1
133c0 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  ;.....break;...c
133d0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
133e0 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
133f0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70  .break;..}...tmp
13400 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a  buf_s = tmpbuf;.
13410 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62  .outbuf_s = outb
13420 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62  uf;..while (tmpb
13430 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75  uflen) {...tmpou
13440 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66  tbuflen = outbuf
13450 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62  len;....if (tmpb
13460 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41  uflen > CACKEY_A
13470 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79  PDU_MTU) {....by
13480 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41  tes_to_send = CA
13490 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09  CKEY_APDU_MTU;..
134a0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74  .} else {....byt
134b0 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70  es_to_send = tmp
134c0 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73  buflen;...}....s
134d0 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59  end_ret = CACKEY
134e0 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b  _PCSC_E_GENERIC;
134f0 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  ...switch (id_ty
13500 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41  pe) {....case CA
13510 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
13520 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  :.....if (tmpbuf
13530 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
13540 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31  U_MTU) {......p1
13550 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65   = 0x80;......le
13560 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65   = 0x00;.....} e
13570 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20  lse {......p1 = 
13580 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20  0x00;......le = 
13590 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  0x00;.....}.....
135a0 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
135b0 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
135c0 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
135d0 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
135e0 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e  GSCIS_INSTR_SIGN
135f0 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30  DECRYPT, p1, 0x0
13600 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  0, bytes_to_send
13610 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72  , tmpbuf, le, &r
13620 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c  espcode, outbuf,
13630 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b   &tmpoutbuflen);
13640 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
13650 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
13660 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28  PE_PIV:.....if (
13670 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b  tmpbuflen > CACK
13680 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09  EY_APDU_MTU) {..
13690 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30  ....class = 0x10
136a0 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30  ;......le = 0x00
136b0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
136c0 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49  ....class = GSCI
136d0 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b  S_CLASS_ISO7816;
136e0 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a  ......le = 256;.
136f0 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f  ....}......send_
13700 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
13710 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61  d_apdu(slot, cla
13720 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ss, NISTSP800_73
13730 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48  _3_INSTR_GENAUTH
13740 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  , NISTSP800_78_3
13750 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69  _ALGO_RSA2048, i
13760 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13770 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76  entity->card.piv
13780 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74  .key_id, bytes_t
13790 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20  o_send, tmpbuf, 
137a0 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f  le, &respcode, o
137b0 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75  utbuf, &tmpoutbu
137c0 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b  flen);.....break
137d0 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
137e0 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
137f0 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  LY:.....break;..
13800 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  .}....if (send_r
13810 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
13820 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20  C_S_OK) {....if 
13830 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a  (free_tmpbuf) {.
13840 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73  ....if (tmpbuf_s
13850 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d  ) {......free(tm
13860 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09  pbuf_s);.....}..
13870 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74  ..}...../* End t
13880 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
13890 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
138a0 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
138b0 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
138c0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
138d0 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 43 41  _RETRY) {.....CA
138e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
138f0 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
13900 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 72 79 69  Failed -- retryi
13910 6e 67 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ng.");......retu
13920 72 6e 28 63 61 63 6b 65 79 5f 73 69 67 6e 64 65  rn(cackey_signde
13930 63 72 79 70 74 28 73 6c 6f 74 2c 20 69 64 65 6e  crypt(slot, iden
13940 74 69 74 79 2c 20 62 75 66 2c 20 62 75 66 6c 65  tity, buf, bufle
13950 6e 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74 62 75  n, outbuf, outbu
13960 66 6c 65 6e 2c 20 70 61 64 49 6e 70 75 74 2c 20  flen, padInput, 
13970 75 6e 70 61 64 4f 75 74 70 75 74 29 29 3b 0a 09  unpadOutput));..
13980 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
13990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
139a0 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64  U Sending Failed
139b0 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e   -- returning in
139c0 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69   error.");.....i
139d0 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
139e0 78 36 39 38 32 20 7c 7c 20 72 65 73 70 63 6f 64  x6982 || respcod
139f0 65 20 3d 3d 20 30 78 36 65 30 30 29 20 7b 0a 09  e == 0x6e00) {..
13a00 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
13a10 3d 3d 20 30 78 36 45 30 30 29 20 7b 0a 09 09 09  == 0x6E00) {....
13a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13a30 52 49 4e 54 46 28 22 47 6f 74 20 5c 22 57 52 4f  RINTF("Got \"WRO
13a40 4e 47 20 43 4c 41 53 53 5c 22 2c 20 74 68 69 73  NG CLASS\", this
13a50 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 74 61   means we are ta
13a60 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77 72 6f  lking to the wro
13a70 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c  ng object (likel
13a80 79 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  y because the ca
13a90 72 64 20 77 65 6e 74 20 61 77 61 79 29 20 2d 2d  rd went away) --
13aa0 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a 09 09   resetting");...
13ab0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
13ac0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13ad0 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74  NTF("Security st
13ae0 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66  atus not satisif
13af0 69 65 64 20 28 72 65 73 70 63 6f 64 65 20 3d 20  ied (respcode = 
13b00 30 78 25 30 34 78 29 2e 20 20 52 65 74 75 72 6e  0x%04x).  Return
13b10 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 2c 20  ing NEEDLOGIN", 
13b20 28 69 6e 74 29 20 72 65 73 70 63 6f 64 65 29 3b  (int) respcode);
13b30 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b  .....}......cack
13b40 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
13b50 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 73  et(slot);......s
13b60 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot->token_flags
13b70 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
13b80 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75  UIRED;......retu
13b90 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
13ba0 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09  _NEEDLOGIN);....
13bb0 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72  }.....if (send_r
13bc0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
13bd0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
13be0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
13bf0 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65  BUG_PRINTF("Toke
13c00 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72  n absent.  Retur
13c10 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54  ning TOKENABSENT
13c20 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ");......cackey_
13c30 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
13c40 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75  slot);......retu
13c50 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
13c60 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
13c70 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
13c80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d  EBUG_PRINTF("Som
13c90 65 74 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e  ething went wron
13ca0 67 20 64 75 72 69 6e 67 20 73 69 67 6e 69 6e 67  g during signing
13cb0 2c 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  , resetting the 
13cc0 73 6c 6f 74 20 61 6e 64 20 68 6f 70 69 6e 67 20  slot and hoping 
13cd0 66 6f 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b  for the best.");
13ce0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
13cf0 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
13d00 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
13d10 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
13d20 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70  RIC);...}....tmp
13d30 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  buf += bytes_to_
13d40 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65  send;...tmpbufle
13d50 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  n -= bytes_to_se
13d60 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d  nd;....outbuf +=
13d70 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
13d80 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d  .outbuflen -= tm
13d90 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65  poutbuflen;...re
13da0 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tval += tmpoutbu
13db0 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  flen;..}...if (f
13dc0 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
13dd0 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
13de0 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
13df0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62  );...}..}...outb
13e00 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a  uf = outbuf_s;..
13e10 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
13e20 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
13e30 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
13e40 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41  lot);..#ifdef CA
13e50 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
13e60 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
13e70 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74  IZE_MAX..if (out
13e80 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  buflen > _POSIX_
13e90 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
13ea0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13eb0 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78  TF("Outbuflen ex
13ec0 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
13ed0 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
13ee0 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
13ef0 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e  = %li, outbuflen
13f00 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
13f10 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
13f20 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
13f30 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a  g) outbuflen);..
13f40 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
13f50 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
13f60 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65  .../* We must re
13f70 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 74 61  move the "7C" ta
13f80 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20  g to get to the 
13f90 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77  signature */..sw
13fa0 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
13fb0 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
13fc0 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f  D_TYPE_PIV:....o
13fd0 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76  utbuf_len = retv
13fe0 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20  al;....outbuf_p 
13ff0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
14000 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c  rtlv_tag(outbuf,
14010 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78   &outbuf_len, 0x
14020 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62  7C, NULL,  &outb
14030 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  uf_len);....if (
14040 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c  outbuf_p == NULL
14050 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
14060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
14070 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66  ponse from PIV f
14080 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48  or GENERATE AUTH
14090 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e  ENTICATION was n
140a0 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72  ot a 0x7C tag, r
140b0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
140c0 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ure");......retu
140d0 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09  rn(-1);....}....
140e0 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66  .retval = outbuf
140f0 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66  _len;.....outbuf
14100 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09  _len = retval;..
14110 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63  ..outbuf_p = cac
14120 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
14130 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74  tag(outbuf, &out
14140 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e  buf_len, 0x82, N
14150 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65  ULL,  &outbuf_le
14160 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75  n);....if (outbu
14170 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f_p == NULL) {..
14180 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14190 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
141a0 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45   from PIV for GE
141b0 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49 43  NERATE AUTHENTIC
141c0 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20  ATION was not a 
141d0 30 78 38 32 20 77 69 74 68 69 6e 20 61 20 30 78  0x82 within a 0x
141e0 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e  7C tag, returnin
141f0 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
14200 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14210 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c  ....}.....retval
14220 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a   = outbuf_len;..
14230 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
14240 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
14250 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b  CAC:...case CACK
14260 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
14270 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a  ONLY:....break;.
14280 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65  .}.../* Unpad re
14290 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61  ply */..if (unpa
142a0 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20  dOutput) {...if 
142b0 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09  (retval < 3) {..
142c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
142d0 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20  RINTF("Reply is 
142e0 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72  too small, we ar
142f0 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e  e not able to un
14300 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62  pad -- passing b
14310 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66  ack and hoping f
14320 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a  or the best!");.
14330 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14340 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
14350 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
14360 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74  etval = %li (byt
14370 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74  es)", (long) ret
14380 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28  val);....return(
14390 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09  retval);...}....
143a0 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d  if (outbuf[0] !=
143b0 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b   0x00) {....CACK
143c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
143d0 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61  "Unrecognized pa
143e0 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20  dding scheme -- 
143f0 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64  passing back and
14400 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
14410 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43  best!");.....CAC
14420 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14430 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
14440 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
14450 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
14460 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09  long) retval);..
14470 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
14480 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79  ;...}....blockty
14490 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a  pe = outbuf[1];.
144a0 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20  ..unpadoffset = 
144b0 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c  0;....switch (bl
144c0 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61  ocktype) {....ca
144d0 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20  se 0x00:...../* 
144e0 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31  Padding Scheme 1
144f0 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  , the first non-
14500 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68 65  zero byte is the
14510 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a   start of data *
14520 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
14530 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
14540 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
14550 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
14560 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
14570 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
14580 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  != 0x00) {......
14590 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09  .break;......}..
145a0 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
145b0 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09  ...case 0x01:...
145c0 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
145d0 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65 73  eme 2, pad bytes
145e0 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77   are 0xFF follow
145f0 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09  ed by 0x00 */...
14600 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
14610 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
14620 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
14630 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
14640 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
14650 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30  npadoffset] != 0
14660 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20  xFF) {.......if 
14670 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
14680 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
14690 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73  .......unpadoffs
146a0 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72  et++;.........br
146b0 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  eak;.......} els
146c0 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45  e {........CACKE
146d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
146e0 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20  Invalid padding 
146f0 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75  data found, retu
14700 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
14710 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  , should have be
14720 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78  en 0x00 found 0x
14730 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64  %02x", (unsigned
14740 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70   int) outbuf[unp
14750 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09  adoffset]);.....
14760 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
14770 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
14780 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  lse {.......CACK
14790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
147a0 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
147b0 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
147c0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
147d0 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
147e0 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30  een 0xFF found 0
147f0 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
14800 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
14810 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
14820 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
14830 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
14840 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14850 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x02:...../* Pad
14860 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70  ding Scheme 3, p
14870 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e  ad bytes are non
14880 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f  -zero first zero
14890 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74   byte found is t
148a0 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79 74  he seperator byt
148b0 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e  e */.....for (un
148c0 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75  padoffset = 2; u
148d0 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74  npadoffset < ret
148e0 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  val; unpadoffset
148f0 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f  ++) {......if (o
14900 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
14910 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
14920 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b  ....unpadoffset+
14930 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
14940 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
14950 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
14960 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  if (unpadoffset 
14970 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43  > retval) {....C
14980 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14990 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 74  TF("Offset great
149a0 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69  er than reply si
149b0 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28  ze, aborting.  (
149c0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c  unpadoffset = %l
149d0 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29  u, retval = %lu)
149e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
149f0 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20  g) unpadoffset, 
14a00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14a10 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
14a20 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
14a30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14a40 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c  NTBUF("Padded:",
14a50 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
14a60 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75  ;....retval -= u
14a70 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65  npadoffset;...me
14a80 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75  mmove(outbuf, ou
14a90 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73  tbuf + unpadoffs
14aa0 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  et, retval);....
14ab0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14ac0 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
14ad0 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
14ae0 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  l);..}....CACKEY
14af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14b00 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
14b10 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  ess, retval = %l
14b20 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e  i (bytes)", (lon
14b30 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  g) retval);...re
14b40 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
14b50 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
14b60 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
14b70 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
14b80 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
14b90 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
14ba0 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
14bb0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
14bc0 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
14bd0 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  ret cackey_token
14be0 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63 74 20  _present(struct 
14bf0 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
14c00 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
14c10 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
14c20 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72  t;..DWORD reader
14c30 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20  _len = 0, state 
14c40 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20  = 0, protocol = 
14c50 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54  0, atr_len;..BYT
14c60 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49  E atr[MAX_ATR_SI
14c70 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75  ZE];..LONG statu
14c80 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63  s_ret, scard_rec
14c90 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
14ca0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14cb0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
14cc0 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29  (slot->internal)
14cd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14ce0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
14cf0 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e  ing token presen
14d00 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65  t (internal toke
14d10 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  n)");....return(
14d20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
14d30 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a  KENPRESENT);..}.
14d40 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
14d50 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
14d60 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
14d70 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
14d80 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
14d90 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
14da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14db0 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
14dc0 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
14dd0 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
14de0 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75  bsent");....retu
14df0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
14e00 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
14e10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
14e20 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67  _PRINTF("Calling
14e30 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 74   SCardStatus() t
14e40 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 61 72 64  o determine card
14e50 20 73 74 61 74 75 73 22 29 3b 0a 0a 09 61 74 72   status");...atr
14e60 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
14e70 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20  r);..status_ret 
14e80 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
14e90 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e  ot->pcsc_card, N
14ea0 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e  ULL, &reader_len
14eb0 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f  , &state, &proto
14ec0 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c  col, atr, &atr_l
14ed0 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75  en);...if (statu
14ee0 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  s_ret == SCARD_E
14ef0 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29  _INVALID_HANDLE)
14f00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14f10 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 53  G_PRINTF("SCardS
14f20 74 61 74 75 73 28 29 20 72 65 74 75 72 6e 65 64  tatus() returned
14f30 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
14f40 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67  _HANDLE, marking
14f50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
14f60 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72  connected and tr
14f70 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09  ying again");...
14f80 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
14f90 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
14fa0 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
14fb0 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
14fc0 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
14fd0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
14fe0 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
14ff0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
15000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15010 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
15020 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
15030 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
15040 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65  absent");.....re
15050 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15060 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
15070 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
15080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
15090 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73  ling SCardStatus
150a0 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 61  () again");....a
150b0 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
150c0 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72  atr);...status_r
150d0 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
150e0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
150f0 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
15100 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
15110 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
15120 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20  r_len);..}...if 
15130 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53  (status_ret != S
15140 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
15150 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  {...cackey_mark_
15160 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
15170 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f  ;....if (status_
15180 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
15190 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
151a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
151b0 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
151c0 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
151d0 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
151e0 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
151f0 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
15200 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
15210 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
15220 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29  ARD_PROTOCOL_T1)
15230 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72  ;....if (scard_r
15240 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  econn_ret == SCA
15250 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
15260 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
15270 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
15280 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
15290 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
152a0 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
152b0 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
152c0 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
152d0 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
152e0 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
152f0 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
15300 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
15310 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
15320 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
15330 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15340 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
15350 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71   successful, req
15360 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73  uerying");.....s
15370 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
15380 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
15390 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
153a0 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
153b0 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
153c0 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09  tr, &atr_len);..
153d0 09 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
153e0 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
153f0 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
15400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15410 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74  ("Still unable t
15420 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
15430 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
15440 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
15450 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
15460 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
15470 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
15480 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
15490 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
154a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
154b0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09  KENABSENT);.....
154c0 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
154d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
154e0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
154f0 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61   reconnect to ca
15500 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
15510 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61  ken absent.  SCa
15520 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20  rdReconnect() = 
15530 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
15540 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
15550 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63  TO_STR(scard_rec
15560 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  onn_ret));......
15570 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15580 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
15590 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
155a0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
155b0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
155c0 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20  e to query card 
155d0 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e  status, returnin
155e0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
155f0 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d   SCardStatus() =
15600 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
15610 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
15620 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72  _TO_STR(status_r
15630 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  et));.....return
15640 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
15650 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
15660 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65  ..}...if ((state
15670 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29   & SCARD_ABSENT)
15680 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54   == SCARD_ABSENT
15690 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
156a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
156b0 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72  is absent, retur
156c0 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
156d0 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  t");....return(C
156e0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
156f0 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  ENABSENT);..}...
15700 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15710 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74  NTF("Returning t
15720 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b  oken present.");
15730 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
15740 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
15750 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  SENT);.}../*. * 
15760 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
15770 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
15780 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
15790 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
157a0 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
157b0 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
157c0 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
157d0 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
157e0 6b 65 79 5f 73 65 74 5f 70 69 6e 28 73 74 72 75  key_set_pin(stru
157f0 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
15800 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
15810 68 61 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20 75 6e  har *old_pin, un
15820 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c 64 5f  signed long old_
15830 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65  pin_len, unsigne
15840 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
15850 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
15860 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  en) {..struct ca
15870 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
15880 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
15890 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ies;..unsigned c
158a0 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  har cac_pin[8] =
158b0 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
158c0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
158d0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
158e0 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
158f0 72 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b 38 5d  r old_cac_pin[8]
15900 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20   = {0xFF, 0xFF, 
15910 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
15920 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
15930 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  FF};..unsigned c
15940 68 61 72 20 70 69 6e 5f 75 70 64 61 74 65 5b 73  har pin_update[s
15950 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 20 2b  izeof(cac_pin) +
15960 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f   sizeof(old_cac_
15970 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e 65 64  pin)];..unsigned
15980 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b   long num_certs;
15990 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f  ..uint16_t respo
159a0 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74  nse_code;..int t
159b0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
159c0 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  .int send_ret;..
159d0 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63  int key_referenc
159e0 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 41  e = 0x00;.../* A
159f0 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50  pparently, CAC P
15a00 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59  INs are *EXACTLY
15a10 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d  * 8 bytes long -
15a20 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20  - pad with 0xFF 
15a30 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  if too short */.
15a40 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20  .if (pin_len >= 
15a50 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  8) {...memcpy(ca
15a60 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a  c_pin, pin, 8);.
15a70 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
15a80 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
15a90 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09   pin_len);..}...
15aa0 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20  if (old_pin_len 
15ab0 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
15ac0 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c  (old_cac_pin, ol
15ad0 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c  d_pin, 8);..} el
15ae0 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c  se {...memcpy(ol
15af0 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70  d_cac_pin, old_p
15b00 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29  in, old_pin_len)
15b10 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 61 74  ;..}.../* Concat
15b20 65 6e 61 74 65 20 62 6f 74 68 20 50 49 4e 73 20  enate both PINs 
15b30 74 6f 67 65 74 68 65 72 20 74 6f 20 73 65 6e 64  together to send
15b40 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   as a single ins
15b50 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d 65 6d  truction */..mem
15b60 63 70 79 28 70 69 6e 5f 75 70 64 61 74 65 2c 20  cpy(pin_update, 
15b70 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 73 69 7a  old_cac_pin, siz
15b80 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29  eof(old_cac_pin)
15b90 29 3b 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75  );..memcpy(pin_u
15ba0 70 64 61 74 65 20 2b 20 73 69 7a 65 6f 66 28 6f  pdate + sizeof(o
15bb0 6c 64 5f 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  ld_cac_pin), cac
15bc0 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28 63 61 63  _pin, sizeof(cac
15bd0 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52 65 6a  _pin));.../* Rej
15be0 65 63 74 20 50 49 4e 73 20 77 68 69 63 68 20 61  ect PINs which a
15bf0 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  re too short */.
15c00 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35  .if (pin_len < 5
15c10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15c20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63  UG_PRINTF("Rejec
15c30 74 69 6e 67 20 4e 65 77 20 50 49 4e 20 77 68 69  ting New PIN whi
15c40 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20  ch is too short 
15c50 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d  (length = %lu, m
15c60 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35  ust be atleast 5
15c70 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09  )", pin_len);...
15c80 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15c90 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
15ca0 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f  }...if (old_pin_
15cb0 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 43  len < 5) {...CAC
15cc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15cd0 28 22 52 65 6a 65 63 74 69 6e 67 20 4f 6c 64 20  ("Rejecting Old 
15ce0 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f  PIN which is too
15cf0 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d   short (length =
15d00 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74   %lu, must be at
15d10 6c 65 61 73 74 20 35 29 22 2c 20 6f 6c 64 5f 70  least 5)", old_p
15d20 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  in_len);....retu
15d30 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
15d40 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f  _BADPIN);..}.../
15d50 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69 63 61  * PIV authentica
15d60 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79  tion uses a "key
15d70 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30  _reference" of 0
15d80 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65  x80 */..pcsc_ide
15d90 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
15da0 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74  _read_certs(slot
15db0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
15dc0 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65  ts);..if (num_ce
15dd0 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f  rts > 0 && pcsc_
15de0 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
15df0 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28  LL) {...switch (
15e00 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
15e10 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  0].id_type) {...
15e20 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
15e30 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41  TYPE_PIV:.....CA
15e40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15e50 46 28 22 57 65 20 68 61 76 65 20 50 49 56 20 63  F("We have PIV c
15e60 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20  ard, so we will 
15e70 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65  attempt to authe
15e80 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20 74 68  nticate using th
15e90 65 20 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f  e PIV Applicatio
15ea0 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22  n key reference"
15eb0 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66 65  );......key_refe
15ec0 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 09  rence = 0x80;...
15ed0 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61  ..break;....defa
15ee0 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ult:.....break;.
15ef0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
15f00 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
15f10 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
15f20 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  rts, 1);..}.../*
15f30 20 49 73 73 75 65 20 61 20 53 65 74 20 50 49 4e   Issue a Set PIN
15f40 20 28 43 48 41 4e 47 45 20 52 45 46 45 52 45 4e   (CHANGE REFEREN
15f50 43 45 29 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  CE) */..send_ret
15f60 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
15f70 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
15f80 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
15f90 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47  SCIS_INSTR_CHANG
15fa0 45 5f 52 45 46 45 52 45 4e 43 45 2c 20 30 78 30  E_REFERENCE, 0x0
15fb0 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65  0, key_reference
15fc0 2c 20 73 69 7a 65 6f 66 28 70 69 6e 5f 75 70 64  , sizeof(pin_upd
15fd0 61 74 65 29 2c 20 70 69 6e 5f 75 70 64 61 74 65  ate), pin_update
15fe0 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73  , 0x00, &respons
15ff0 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55  e_code, NULL, NU
16000 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f  LL);...if (send_
16010 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
16020 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20  SC_S_OK) {...if 
16030 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20  ((response_code 
16040 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36  & 0x63C0) == 0x6
16050 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f  3C0) {....tries_
16060 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73  remaining = (res
16070 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46  ponse_code & 0xF
16080 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
16090 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
160a0 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
160b0 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 65  led, %i tries re
160c0 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f  maining", tries_
160d0 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09  remaining);.....
160e0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
160f0 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09  SC_E_BADPIN);...
16100 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
16110 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33  e_code == 0x6983
16120 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
16130 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
16140 6c 65 20 74 6f 20 73 65 74 20 50 49 4e 2c 20 64  le to set PIN, d
16150 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 20  evice is locked 
16160 6f 72 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  or changing the 
16170 50 49 4e 20 69 73 20 64 69 73 61 62 6c 65 64 22  PIN is disabled"
16180 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
16190 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
161a0 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ED);...}....retu
161b0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
161c0 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
161d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
161e0 4e 54 46 28 22 50 49 4e 20 43 68 61 6e 67 65 20  NTF("PIN Change 
161f0 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
16200 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
16210 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 44 69  C_S_OK);.../* Di
16220 73 61 62 6c 65 20 61 20 77 61 72 6e 69 6e 67 2c  sable a warning,
16230 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 20 6f   since this is o
16240 6e 6c 79 20 75 73 65 64 20 69 6e 20 64 65 62 75  nly used in debu
16250 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 72 69 65 73  g mode */..tries
16260 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 74 72 69  _remaining = tri
16270 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 7d 0a  es_remaining;.}.
16280 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
16290 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
162a0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
162b0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
162c0 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
162d0 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
162e0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
162f0 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
16300 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
16310 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
16320 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
16330 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
16340 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
16350 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73  _len, int *tries
16360 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 69 6e  _remaining_p, in
16370 74 20 72 65 74 72 69 65 73 29 20 7b 0a 09 73 74  t retries) {..st
16380 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
16390 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
163a0 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
163b0 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70  igned char cac_p
163c0 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30  in[8] = {0xFF, 0
163d0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
163e0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
163f0 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67  F, 0xFF};..unsig
16400 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
16410 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  ts;..uint16_t re
16420 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e  sponse_code;..in
16430 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
16440 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  g;..int send_ret
16450 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72  ;..int key_refer
16460 65 6e 63 65 20 3d 20 30 78 30 30 2c 20 68 61 76  ence = 0x00, hav
16470 65 5f 70 69 76 20 3d 20 30 3b 0a 09 63 61 63 6b  e_piv = 0;..cack
16480 65 79 5f 72 65 74 20 63 6f 6e 6e 65 63 74 5f 72  ey_ret connect_r
16490 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b 0a 0a  et, token_ret;..
164a0 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  ./* Indicate tha
164b0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  t we do not know
164c0 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20   about how many 
164d0 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e  tries are remain
164e0 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65  ing */..if (trie
164f0 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
16500 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
16510 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a  ing_p = -1;..}..
16520 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20  ./* Apparently, 
16530 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58  CAC PINs are *EX
16540 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c  ACTLY* 8 bytes l
16550 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20  ong -- pad with 
16560 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72  0xFF if too shor
16570 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65  t */..if (pin_le
16580 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
16590 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
165a0 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   8);..} else {..
165b0 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
165c0 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   pin, pin_len);.
165d0 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50  .}.../* Reject P
165e0 49 4e 73 20 77 68 69 63 68 20 61 72 65 20 74 6f  INs which are to
165f0 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28  o short */..if (
16600 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09  pin_len < 5) {..
16610 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16620 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20  INTF("Rejecting 
16630 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f  PIN which is too
16640 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d   short (length =
16650 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74   %lu, must be at
16660 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c  least 5)", pin_l
16670 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  en);....return(C
16680 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
16690 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49  PIN);..}.../* PI
166a0 56 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  V authentication
166b0 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65 66   uses a "key_ref
166c0 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30 20  erence" of 0x80 
166d0 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74  */..pcsc_identit
166e0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
166f0 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55  d_certs(slot, NU
16700 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
16710 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
16720 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e  > 0 && pcsc_iden
16730 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
16740 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63 73 63  {...switch (pcsc
16750 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69  _identities[0].i
16760 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  d_type) {....cas
16770 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
16780 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59  _PIV:.....CACKEY
16790 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57  _DEBUG_PRINTF("W
167a0 65 20 68 61 76 65 20 50 49 56 20 63 61 72 64 2c  e have PIV card,
167b0 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 74 65   so we will atte
167c0 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74 69 63  mpt to authentic
167d0 61 74 65 20 75 73 69 6e 67 20 74 68 65 20 50 49  ate using the PI
167e0 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65  V Application ke
167f0 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a  y reference");..
16800 09 09 09 09 68 61 76 65 5f 70 69 76 20 3d 20 31  ....have_piv = 1
16810 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
16820 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65  default:.....bre
16830 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  ak;...}....cacke
16840 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
16850 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
16860 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a  m_certs, 1);..}.
16870 0a 09 69 66 20 28 68 61 76 65 5f 70 69 76 20 3d  ..if (have_piv =
16880 3d 20 31 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66  = 1) {...key_ref
16890 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09  erence = 0x80;..
168a0 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e  }.../* Issue PIN
168b0 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64   Verify */..send
168c0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
168d0 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
168e0 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
168f0 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  6, GSCIS_INSTR_V
16900 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79  ERIFY, 0x00, key
16910 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65  _reference, size
16920 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  of(cac_pin), cac
16930 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73  _pin, 0x00, &res
16940 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c  ponse_code, NULL
16950 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73  , NULL);...if (s
16960 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
16970 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
16980 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63  .if ((response_c
16990 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d  ode & 0x63C0) ==
169a0 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72   0x63C0) {....tr
169b0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20  ies_remaining = 
169c0 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26  (response_code &
169d0 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45   0xF);.....CACKE
169e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
169f0 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
16a00 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65   failed, %i trie
16a10 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72  s remaining", tr
16a20 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a  ies_remaining);.
16a30 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65  ....if (tries_re
16a40 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09  maining_p) {....
16a50 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
16a60 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61  g_p = tries_rema
16a70 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09  ining;....}.....
16a80 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
16a90 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09  SC_E_BADPIN);...
16aa0 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
16ab0 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33  e_code == 0x6983
16ac0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
16ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
16ae0 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
16af0 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c  led, device is l
16b00 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74  ocked");.....ret
16b10 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16b20 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a  E_LOCKED);...}..
16b30 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
16b40 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b  ode == 0x6d00) {
16b50 0a 09 09 09 69 66 20 28 72 65 74 72 69 65 73 20  ....if (retries 
16b60 3e 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  > 0) {.....CACKE
16b70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16b80 47 6f 74 20 49 53 4f 20 37 38 31 36 20 52 65 73  Got ISO 7816 Res
16b90 70 6f 6e 73 65 20 5c 22 36 44 20 30 30 5c 22 20  ponse \"6D 00\" 
16ba0 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
16bb0 20 56 45 52 49 46 59 20 72 65 71 75 65 73 74 2e   VERIFY request.
16bc0 22 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
16bd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20  EBUG_PRINTF("We 
16be0 64 69 64 20 6e 6f 74 20 65 78 70 65 63 74 20 74  did not expect t
16bf0 68 69 73 20 62 65 63 61 75 73 65 20 69 74 20 69  his because it i
16c00 73 20 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65 64 20  s not mentioned 
16c10 69 6e 20 4e 49 53 54 20 53 50 20 38 30 30 2d 37  in NIST SP 800-7
16c20 33 2d 33 20 50 61 72 74 20 32 20 53 65 63 74 69  3-3 Part 2 Secti
16c30 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 47 53 43 2d  on 3.2.1 or GSC-
16c40 49 53 20 76 32 2e 31 22 29 3b 0a 09 09 09 09 43  IS v2.1");.....C
16c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16c60 54 46 28 22 57 65 20 61 72 65 20 67 6f 69 6e 67  TF("We are going
16c70 20 74 6f 20 74 72 79 20 74 6f 20 72 65 73 65 74   to try to reset
16c80 20 74 68 65 20 63 61 72 64 20 61 6e 64 20 73 65   the card and se
16c90 6c 65 63 74 20 74 68 65 20 61 70 70 6c 65 74 20  lect the applet 
16ca0 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 09 09 09 63  again.");......c
16cb0 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
16cc0 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
16cd0 09 09 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  ..connect_ret = 
16ce0 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
16cf0 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69  ard(slot);.....i
16d00 66 20 28 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  f (connect_ret !
16d10 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
16d20 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  OK) {......CACKE
16d30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16d40 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
16d50 65 63 74 20 61 66 74 65 72 20 72 65 73 65 74 74  ect after resett
16d60 69 6e 67 20 74 68 65 20 63 61 72 64 2c 20 72 65  ing the card, re
16d70 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
16d80 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  .");.......retur
16d90 6e 28 63 6f 6e 6e 65 63 74 5f 72 65 74 29 3b 0a  n(connect_ret);.
16da0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
16db0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16dc0 56 65 72 69 66 79 69 6e 67 20 77 65 20 73 74 69  Verifying we sti
16dd0 6c 6c 20 68 61 76 65 20 61 20 74 6f 6b 65 6e 2e  ll have a token.
16de0 22 29 3b 0a 09 09 09 09 74 6f 6b 65 6e 5f 72 65  ");.....token_re
16df0 74 20 3d 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  t = cackey_token
16e00 5f 70 72 65 73 65 6e 74 28 73 6c 6f 74 29 3b 0a  _present(slot);.
16e10 09 09 09 09 69 66 20 28 74 6f 6b 65 6e 5f 72 65  ....if (token_re
16e20 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
16e30 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
16e40 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
16e50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b  EBUG_PRINTF("Tok
16e60 65 6e 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  en not present, 
16e70 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
16e80 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  or.");.......ret
16e90 75 72 6e 28 74 6f 6b 65 6e 5f 72 65 74 29 3b 0a  urn(token_ret);.
16ea0 09 09 09 09 7d 0a 0a 0a 09 09 09 09 43 41 43 4b  ....}.......CACK
16eb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16ec0 22 54 72 79 69 6e 67 20 74 6f 20 6c 6f 67 69 6e  "Trying to login
16ed0 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 09 72 65   again");.....re
16ee0 74 75 72 6e 28 63 61 63 6b 65 79 5f 6c 6f 67 69  turn(cackey_logi
16ef0 6e 28 73 6c 6f 74 2c 20 70 69 6e 2c 20 70 69 6e  n(slot, pin, pin
16f00 5f 6c 65 6e 2c 20 74 72 69 65 73 5f 72 65 6d 61  _len, tries_rema
16f10 69 6e 69 6e 67 5f 70 2c 20 72 65 74 72 69 65 73  ining_p, retries
16f20 20 2d 20 31 29 29 3b 0a 09 09 09 7d 0a 09 09 7d   - 1));....}...}
16f30 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
16f40 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
16f50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
16f60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
16f70 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   Verification su
16f80 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74  cceeded");...ret
16f90 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16fa0 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
16fb0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
16fc0 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
16fd0 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
16fe0 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
16ff0 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
17000 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
17010 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
17020 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
17030 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74  _pcsc_identity_t
17040 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63  o_label(struct c
17050 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
17060 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
17070 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
17080 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65  bel_buf, unsigne
17090 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66  d long label_buf
170a0 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  _len) {..unsigne
170b0 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61  d long certifica
170c0 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c  te_len;..void *l
170d0 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64  abel_asn1;..void
170e0 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
170f0 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65  int x509_read_re
17100 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  t;...certificate
17110 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
17120 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69  tificate;..certi
17130 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65  ficate_len = ide
17140 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
17150 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65  te_len;...if (ce
17160 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20  rtificate_len < 
17170 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
17180 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61  );..}...x509_rea
17190 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
171a0 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63  subject(certific
171b0 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
171c0 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20  _len, (void **) 
171d0 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69  &label_asn1);..i
171e0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
171f0 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
17200 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f  (-1);..}...x509_
17210 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
17220 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62  dn_to_string(lab
17230 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65  el_asn1, x509_re
17240 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29  ad_ret, (char *)
17250 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65   label_buf, labe
17260 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29  l_buf_len, "CN")
17270 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ;..if (x509_read
17280 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78  _ret <= 0) {...x
17290 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
172a0 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67  509_dn_to_string
172b0 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30  (label_asn1, x50
172c0 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61  9_read_ret, (cha
172d0 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20  r *) label_buf, 
172e0 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e  label_buf_len, N
172f0 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30  ULL);....if (x50
17300 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
17310 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29   {....return(-1)
17320 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66  ;...}..}..#ifdef
17330 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
17340 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
17350 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
17360 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20  x509_read_ret > 
17370 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
17380 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17390 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f  UG_PRINTF("x509_
173a0 72 65 61 64 5f 72 65 74 20 65 78 63 65 65 64 73  read_ret exceeds
173b0 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
173c0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
173d0 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
173e0 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  , x509_read_ret 
173f0 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
17400 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
17410 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17420 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29  ) x509_read_ret)
17430 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
17440 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
17450 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30  dif...return(x50
17460 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a  9_read_ret);.}..
17470 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
17480 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
17490 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
174a0 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a  ex_create(void *
174b0 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
174c0 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
174d0 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
174e0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
174f0 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
17500 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
17510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
17520 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
17530 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
17540 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
17550 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
17560 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
17570 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
17580 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
17590 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a  thread_mutex));.
175a0 09 09 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d  ..if (!pthread_m
175b0 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45  utex) {....CACKE
175c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
175d0 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61  Failed to alloca
175e0 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09  te memory.");...
175f0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
17600 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  }....pthread_ret
17610 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
17620 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64  tex_init(pthread
17630 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09  _mutex, NULL);..
17640 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
17650 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
17660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17670 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
17680 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65  x_init() returne
17690 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
176a0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
176b0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
176c0 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d  ...}....*mutex =
176d0 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a   pthread_mutex;.
176e0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
176f0 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
17700 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  teMutex) {....cu
17710 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
17720 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
17730 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
17740 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
17750 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
17760 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17770 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
17780 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
17790 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
177a0 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
177b0 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
177c0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
177d0 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
177e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
177f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
17800 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
17810 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
17820 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
17830 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
17840 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
17850 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64  _mutex_lock(void
17860 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72   *mutex) {..pthr
17870 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
17880 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
17890 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
178a0 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
178b0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
178c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
178d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
178e0 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
178f0 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
17900 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
17910 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
17920 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
17930 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65   mutex;....pthre
17940 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
17950 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70  ead_mutex_lock(p
17960 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09  thread_mutex);..
17970 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
17980 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
17990 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
179a0 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
179b0 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65  x_lock() returne
179c0 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
179d0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
179e0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
179f0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
17a00 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
17a10 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  .LockMutex) {...
17a20 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
17a30 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63   cackey_args.Loc
17a40 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  kMutex(mutex);..
17a50 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
17a60 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
17a70 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
17a80 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
17a90 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
17aa0 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
17ab0 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
17ac0 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
17ad0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
17ae0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
17af0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17b00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
17b10 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
17b20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
17b30 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
17b40 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
17b50 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
17b60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69  mutex_unlock(voi
17b70 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68  d *mutex) {..pth
17b80 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
17b90 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
17ba0 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
17bb0 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
17bc0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
17bd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
17be0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
17bf0 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
17c00 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
17c10 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
17c20 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
17c30 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
17c40 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72  = mutex;....pthr
17c50 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
17c60 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
17c70 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  k(pthread_mutex)
17c80 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
17c90 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
17ca0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17cb0 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d  RINTF("pthread_m
17cc0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65  utex_unlock() re
17cd0 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
17ce0 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
17cf0 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
17d00 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  (-1);...}..} els
17d10 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
17d20 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
17d30 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
17d40 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
17d50 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28  rgs.UnlockMutex(
17d60 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
17d70 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
17d80 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
17d90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17da0 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
17db0 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65  UnlockMutex() re
17dc0 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
17dd0 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
17de0 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
17df0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
17e00 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
17e10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17e20 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
17e30 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
17e40 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74  return(0);.}..st
17e50 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54  atic CK_ATTRIBUT
17e60 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74  E_PTR cackey_get
17e70 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f  _attributes(CK_O
17e80 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65  BJECT_CLASS obje
17e90 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20  ctclass, struct 
17ea0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
17eb0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20  tity *identity, 
17ec0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
17ed0 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55  entity_num, CK_U
17ee0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e  LONG_PTR pulCoun
17ef0 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  t) {..static CK_
17f00 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20  BBOOL ck_true = 
17f10 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42  1;..static CK_BB
17f20 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30  OOL ck_false = 0
17f30 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55  ;..static CK_TRU
17f40 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20  ST ck_trusted = 
17f50 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47  CK_TRUSTED_DELEG
17f60 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  ATOR;..CK_ULONG 
17f70 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65  numattrs = 0, re
17f80 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f  tval_count;..CK_
17f90 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63  ATTRIBUTE_TYPE c
17fa0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
17fb0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72  CK_ATTRIBUTE cur
17fc0 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b  r_attr, *retval;
17fd0 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
17fe0 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
17ff0 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f  ulValueLen;..CK_
18000 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f  OBJECT_CLASS ck_
18010 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43  object_class;..C
18020 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
18030 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74  PE ck_certificat
18040 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f  e_type;..CK_KEY_
18050 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65  TYPE ck_key_type
18060 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75  ;..CK_UTF8CHAR u
18070 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09  cTmpBuf[1024];..
18080 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31  SHA1Context sha1
18090 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d  _ctx;..MD5_CTX m
180a0 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74  d5_ctx;..uint8_t
180b0 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48   sha1_hash[SHA1H
180c0 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38  ashSize];..uint8
180d0 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48  _t md5_hash[MD5H
180e0 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67  ashSize];..unsig
180f0 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
18100 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20  icate;..ssize_t 
18110 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
18120 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  = -1, x509_read_
18130 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65  ret;..int pValue
18140 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  _free;...CACKEY_
18150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
18160 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73  lled (objectClas
18170 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74  s = %lu, identit
18180 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20  y_num = %lu).", 
18190 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
181a0 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65  objectclass, ide
181b0 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70  ntity_num);...*p
181c0 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69  ulCount = 0;...i
181d0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
181e0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
181f0 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  E && objectclass
18200 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
18210 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
18220 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
18230 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
18240 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
18250 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43  APE_TRUST) {...C
18260 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18270 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
18280 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
18290 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63  invalid object c
182a0 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72  lass");....retur
182b0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
182c0 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66   Get Cert */..if
182d0 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55   (identity == NU
182e0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
182f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
18300 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
18310 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
18320 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65   identiy provide
18330 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
18340 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69  ULL);..}...certi
18350 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
18360 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
18370 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
18380 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
18390 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
183a0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
183b0 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72  len == -1 || cer
183c0 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c  tificate == NULL
183d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
183e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
183f0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
18400 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e  NULL), this iden
18410 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  tity does not ha
18420 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74  ve an X.509 cert
18430 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
18440 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77  ed with it and w
18450 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a  ill not work");.
18460 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
18470 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
18480 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65  that certificate
18490 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65   is ASN.1 encode
184a0 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  d X.509 certific
184b0 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39  ate */..if (x509
184c0 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
184d0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
184e0 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c  ate_len, NULL) <
184f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
18510 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
18520 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35   (NULL), the X.5
18530 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61  09 certificate a
18540 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
18550 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20  his identity is 
18560 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09  not valid");....
18570 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
18580 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
18590 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20  = 64;..retval = 
185a0 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f  malloc(retval_co
185b0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
185c0 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63  tval));...for (c
185d0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
185e0 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  0; curr_attr_typ
185f0 65 20 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20  e < 0xce5363bf; 
18600 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b  curr_attr_type++
18610 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61  ) {...if (curr_a
18620 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30  ttr_type == 0x80
18630 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74  0) {....curr_att
18640 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36  r_type = 0xce536
18650 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c  300;...}....pVal
18660 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70  ue_free = 0;...p
18670 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
18680 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
18690 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77  _LONG) -1;....sw
186a0 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f  itch (curr_attr_
186b0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
186c0 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43  CKA_CLASS:.....C
186d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
186e0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
186f0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41  ttribute CKA_CLA
18700 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SS (0x%08lx) ...
18710 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18720 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
18730 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65  e);......ck_obje
18740 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63  ct_class = objec
18750 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61  tclass;......pVa
18760 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74  lue = &ck_object
18770 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61  _class;.....ulVa
18780 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18790 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29  ck_object_class)
187a0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
187b0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
187c0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
187d0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
187e0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
187f0 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20  OBJECT_CLASS *) 
18800 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18810 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18820 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18830 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18840 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09  e CKA_TOKEN:....
18850 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18860 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18870 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
18880 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  OKEN (0x%08lx) .
18890 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
188a0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
188b0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
188c0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
188d0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
188e0 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
188f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18900 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
18910 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
18920 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
18930 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
18940 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
18950 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
18960 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
18970 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
18980 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ....case CKA_PRI
18990 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  VATE:.....CACKEY
189a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
189b0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
189c0 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20  ute CKA_PRIVATE 
189d0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
189e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
189f0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
18a00 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
18a10 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
18a20 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
18a30 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18a40 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
18a50 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
18a60 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
18a70 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74  not a Netscape t
18a80 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
18a90 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
18aa0 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  }......pValue = 
18ab0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
18ac0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
18ad0 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
18ae0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18af0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18b00 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
18b10 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18b20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
18b30 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
18b40 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18b50 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18b60 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18b70 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
18b80 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ED:.....CACKEY_D
18b90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18ba0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18bb0 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30  e CKA_TRUSTED (0
18bc0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18bd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18be0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18bf0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
18c00 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
18c10 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
18c20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18c30 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
18c40 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18c50 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
18c60 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
18c70 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18c80 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18c90 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
18ca0 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
18cb0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
18cc0 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
18cd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18ce0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18cf0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
18d00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18d10 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
18d20 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18d30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18d40 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18d50 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18d60 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09  KA_MODIFIABLE:..
18d70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18d80 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18d90 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18da0 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25  _MODIFIABLE (0x%
18db0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
18dc0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
18dd0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
18de0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
18df0 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
18e00 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18e10 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
18e20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18e30 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18e40 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
18e50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18e60 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
18e70 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18e80 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18e90 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18ea0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18eb0 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09  e CKA_LABEL:....
18ec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18ed0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18ee0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c   attribute CKA_L
18ef0 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e  ABEL (0x%08lx) .
18f00 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18f10 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18f20 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 69  ype);......if (i
18f30 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65  dentity->id_type
18f40 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59   == CACKEY_ID_TY
18f50 50 45 5f 50 49 56 29 20 7b 0a 09 09 09 09 09 70  PE_PIV) {......p
18f60 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79  Value = identity
18f70 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ->card.piv.label
18f80 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
18f90 6e 20 3d 20 73 74 72 6c 65 6e 28 70 56 61 6c 75  n = strlen(pValu
18fa0 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
18fb0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
18fc0 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61   = snprintf((cha
18fd0 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73  r *) ucTmpBuf, s
18fe0 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c  izeof(ucTmpBuf),
18ff0 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22   "Identity #%lu"
19000 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19010 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  ) identity_num);
19020 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75  ......pValue = u
19030 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 09 69  cTmpBuf;.......i
19040 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d  f (ulValueLen >=
19050 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
19060 29 29 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  )) {.......ulVal
19070 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09  ueLen = 0;......
19080 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
19090 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
190a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
190b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
190c0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
190d0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
190e0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
190f0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
19100 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41  ;....case CKA_VA
19110 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  LUE:.....CACKEY_
19120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19130 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19140 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78  te CKA_VALUE (0x
19150 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
19160 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
19170 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
19180 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63  ...switch (objec
19190 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63  tclass) {......c
191a0 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f  ase CKO_PRIVATE_
191b0 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  KEY:.......CACKE
191c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
191d0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
191e0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
191f0 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65  we are a private
19200 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09   key.");........
19210 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
19220 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19230 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  UST:.......CACKE
19240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19250 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
19260 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
19270 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
19280 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
19290 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
192a0 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55  .....case CKO_PU
192b0 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09  BLIC_KEY:.......
192c0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
192d0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
192e0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
192f0 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65   = x509_to_pubke
19300 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  y(certificate, c
19310 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
19320 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09  &pValue);.......
19330 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
19340 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09  et < 0) { ......
19350 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
19360 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20  ;........} else 
19370 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75  {.........ulValu
19380 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
19390 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09  _ret;........}..
193a0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72  .....}........br
193b0 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
193c0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  KO_CERTIFICATE:.
193d0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63  ......pValue = c
193e0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09  ertificate;.....
193f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63  ..ulValueLen = c
19400 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
19410 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
19420 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19440 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
19450 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
19460 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
19470 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
19480 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
19490 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43  KA_ISSUER:.....C
194a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
194b0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
194c0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53  ttribute CKA_ISS
194d0 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  UER (0x%08lx) ..
194e0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
194f0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19500 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19510 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
19520 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
19530 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19540 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
19550 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
19560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19570 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
19580 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
19590 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
195a0 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63  ificate or Netsc
195b0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
195c0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
195d0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
195e0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
195f0 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
19600 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
19610 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74  9_to_issuer(cert
19620 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
19630 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
19640 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
19650 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
19660 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
19670 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
19680 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
19690 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
196a0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
196b0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
196c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
196d0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
196e0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
196f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
19700 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
19710 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
19720 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
19730 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19740 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19750 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19760 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
19770 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
19780 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19790 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
197a0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
197b0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
197c0 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
197d0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
197e0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
197f0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
19800 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19810 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
19820 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
19830 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
19840 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70  icate or Netscap
19850 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
19860 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
19870 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
19880 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
19890 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
198a0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
198b0 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
198c0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
198d0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
198e0 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
198f0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
19900 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
19910 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
19920 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
19930 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
19940 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
19950 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
19960 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19970 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
19980 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
19990 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
199a0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
199b0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
199c0 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09  KA_SUBJECT:.....
199d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
199e0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
199f0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55  attribute CKA_SU
19a00 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20  BJECT (0x%08lx) 
19a10 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
19a20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
19a30 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
19a40 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19a50 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
19a60 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19a70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19a80 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19a90 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19aa0 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
19ab0 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72  cate");.......br
19ac0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
19ad0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
19ae0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
19af0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
19b00 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
19b10 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
19b20 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
19b30 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
19b40 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
19b50 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
19b60 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
19b70 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
19b80 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
19b90 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
19ba0 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
19bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19bc0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
19bd0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
19be0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
19bf0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
19c00 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
19c10 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09  ase CKA_ID:.....
19c20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19c30 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
19c40 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44  attribute CKA_ID
19c50 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
19c60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19c70 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
19c80 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
19c90 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
19ca0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
19cb0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19cc0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
19cd0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
19ce0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
19cf0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
19d00 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
19d10 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
19d20 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20  ....ucTmpBuf[0] 
19d30 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d  = ((identity_num
19d40 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78   + 1) >> 8) & 0x
19d50 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66  ff;.....ucTmpBuf
19d60 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79  [1] =  (identity
19d70 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66  _num + 1) & 0xff
19d80 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
19d90 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75  &ucTmpBuf;.....u
19da0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a  lValueLen = 2;..
19db0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19dc0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
19dd0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
19de0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
19df0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
19e00 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
19e10 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
19e20 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a  RTIFICATE_TYPE:.
19e30 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19e40 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19e50 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19e60 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
19e70 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PE (0x%08lx) ...
19e80 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19e90 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19ea0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
19eb0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19ec0 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
19ed0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19ee0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
19ef0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
19f00 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
19f10 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
19f20 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  e.");.......brea
19f30 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
19f40 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
19f50 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65   one certificate
19f60 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f   type */.....ck_
19f70 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
19f80 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09   = CKC_X_509;...
19f90 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
19fa0 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
19fb0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
19fc0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72   = sizeof(ck_cer
19fd0 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a  tificate_type);.
19fe0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19ff0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1a000 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35  eturning CKC_X_5
1a010 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75  09 (%lu) (%p/%lu
1a020 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1a030 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46  ng) *((CK_CERTIF
1a040 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56  ICATE_TYPE *) pV
1a050 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
1a060 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1a070 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1a080 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1a090 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09  CKA_KEY_TYPE:...
1a0a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a0b0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1a0c0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1a0d0 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c  KEY_TYPE (0x%08l
1a0e0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1a0f0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1a100 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1a110 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
1a120 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
1a130 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
1a140 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
1a150 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  EY) {......CACKE
1a160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a170 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1a180 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1a190 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79  we are not a key
1a1a0 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
1a1b0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
1a1c0 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
1a1d0 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a  one key type */.
1a1e0 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20  ....ck_key_type 
1a1f0 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09  = CKK_RSA;......
1a200 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79  pValue = &ck_key
1a210 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _type;.....ulVal
1a220 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1a230 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09  k_key_type);....
1a240 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a250 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a260 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25  rning CKK_RSA (%
1a270 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
1a280 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1a290 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
1a2a0 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
1a2b0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1a2c0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1a2d0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1a2e0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
1a2f0 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  IGN:.....CACKEY_
1a300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a310 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1a320 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25  te CKA_SIGN (0x%
1a330 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a340 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a350 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a360 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1a370 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1a380 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1a390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a3a0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1a3b0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1a3c0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1a3d0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1a3e0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1a3f0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
1a400 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1a410 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
1a420 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
1a430 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
1a440 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1a450 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
1a460 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1a470 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
1a480 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
1a490 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1a4a0 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
1a4b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a4c0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1a4d0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
1a4e0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
1a4f0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
1a500 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
1a510 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a520 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a530 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a540 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ....case CKA_SIG
1a550 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43  N_RECOVER:.....C
1a560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a570 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1a580 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47  ttribute CKA_SIG
1a590 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 38  N_RECOVER (0x%08
1a5a0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1a5b0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1a5c0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1a5d0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1a5e0 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
1a5f0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1a600 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a610 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1a620 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1a630 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
1a640 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1a650 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1a660 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
1a670 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  We currently onl
1a680 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20  y support "Sign 
1a690 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a  with Appendix" *
1a6a0 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  /.....pValue = &
1a6b0 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
1a6c0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1a6d0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
1a6e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a6f0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a700 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1a710 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1a720 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
1a730 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1a740 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1a750 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1a760 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1a770 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50  .case CKA_DECRYP
1a780 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
1a790 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1a7a0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1a7b0 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78   CKA_DECRYPT (0x
1a7c0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1a7d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1a7e0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1a7f0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1a800 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
1a810 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1a820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a830 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1a840 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1a850 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
1a860 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1a870 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1a880 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1a890 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1a8a0 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
1a8b0 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73  EY || objectclas
1a8c0 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s == CKO_PUBLIC_
1a8d0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
1a8e0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1a8f0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a900 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1a910 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1a920 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1a930 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
1a940 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a950 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
1a960 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1a970 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a980 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1a990 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1a9a0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1a9b0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1a9c0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1a9d0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1a9e0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1a9f0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
1aa00 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41  ENSITIVE:.....CA
1aa10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1aa20 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1aa30 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53  tribute CKA_SENS
1aa40 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29 20  ITIVE (0x%08lx) 
1aa50 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1aa60 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1aa70 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1aa80 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1aa90 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1aaa0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1aab0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1aac0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1aad0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1aae0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1aaf0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1ab00 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1ab10 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
1ab20 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1ab30 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
1ab40 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1ab50 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
1ab60 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1ab70 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
1ab80 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
1ab90 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
1aba0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1abb0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
1abc0 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
1abd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1abe0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1abf0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
1ac00 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ac10 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
1ac20 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
1ac30 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ac40 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1ac50 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1ac60 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  se CKA_EXTRACTAB
1ac70 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  LE:.....CACKEY_D
1ac80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1ac90 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1aca0 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
1acb0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
1acc0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1acd0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1ace0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1acf0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
1ad00 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1ad10 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1ad20 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1ad30 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1ad40 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1ad50 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
1ad60 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1ad70 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1ad80 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1ad90 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
1ada0 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
1adb0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
1adc0 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
1add0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1ade0 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
1adf0 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
1ae00 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
1ae10 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1ae20 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
1ae30 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
1ae40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ae50 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1ae60 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
1ae70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
1ae80 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
1ae90 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
1aea0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1aeb0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1aec0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1aed0 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09  KA_MODULUS:.....
1aee0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1aef0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1af00 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f  attribute CKA_MO
1af10 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20  DULUS (0x%08lx) 
1af20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1af30 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1af40 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1af50 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1af60 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1af70 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1af80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1af90 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1afa0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1afb0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1afc0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1afd0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1afe0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
1aff0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
1b000 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
1b010 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
1b020 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66  o_modulus(certif
1b030 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
1b040 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
1b050 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
1b060 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
1b070 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
1b080 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
1b090 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
1b0a0 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
1b0b0 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
1b0c0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1b0d0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1b0e0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
1b0f0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
1b100 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1b110 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1b120 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1b130 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
1b140 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  NT:.....CACKEY_D
1b150 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1b160 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1b170 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50  e CKA_PUBLIC_EXP
1b180 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20  ONENT (0x%08lx) 
1b190 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1b1a0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1b1b0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1b1c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1b1d0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1b1e0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1b1f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b200 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1b210 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1b220 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1b230 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1b240 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1b250 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
1b260 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
1b270 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
1b280 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
1b290 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69  o_exponent(certi
1b2a0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
1b2b0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
1b2c0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
1b2d0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
1b2e0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
1b2f0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
1b300 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
1b310 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
1b320 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
1b330 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
1b340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b350 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
1b360 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
1b370 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1b380 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1b390 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1b3a0 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41  CKA_TRUST_DIGITA
1b3b0 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09  L_SIGNATURE:....
1b3c0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e  case CKA_TRUST_N
1b3d0 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a  ON_REPUDIATION:.
1b3e0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1b3f0 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45  T_KEY_ENCIPHERME
1b400 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
1b410 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50  TRUST_DATA_ENCIP
1b420 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  HERMENT:....case
1b430 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41   CKA_TRUST_KEY_A
1b440 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73  GREEMENT:....cas
1b450 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
1b460 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61  CERT_SIGN:....ca
1b470 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c  se CKA_TRUST_CRL
1b480 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43  _SIGN:....case C
1b490 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f  KA_TRUST_SERVER_
1b4a0 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
1b4b0 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41  A_TRUST_CLIENT_A
1b4c0 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  UTH:....case CKA
1b4d0 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
1b4e0 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ING:....case CKA
1b4f0 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f  _TRUST_EMAIL_PRO
1b500 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43  TECTION:.....CAC
1b510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b520 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1b530 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54  ribute CKA_TRUST
1b540 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e  _... (0x%08lx) .
1b550 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1b560 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1b570 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
1b580 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b  e = &ck_trusted;
1b590 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1b5a0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73  = sizeof(ck_trus
1b5b0 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ted);......CACKE
1b5c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b5d0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1b5e0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
1b5f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
1b600 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61  (CK_TRUST *) pVa
1b610 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
1b620 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1b630 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1b640 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1b650 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53  KA_CERT_SHA1_HAS
1b660 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  H:.....CACKEY_DE
1b670 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1b680 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1b690 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48   CKA_CERT_SHA1_H
1b6a0 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASH (0x%08lx) ..
1b6b0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1b6c0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1b6d0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1b6e0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
1b6f0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1b700 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1b710 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b720 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1b730 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1b740 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61  are not a Netsca
1b750 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1b760 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1b770 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52  ....}......SHA1R
1b780 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b  eset(&sha1_ctx);
1b790 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28 26  .....SHA1Input(&
1b7a0 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66  sha1_ctx, certif
1b7b0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
1b7c0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41  te_len);.....SHA
1b7d0 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74  1Result(&sha1_ct
1b7e0 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a  x, sha1_hash);..
1b7f0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61  ....pValue = sha
1b800 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61  1_hash;.....ulVa
1b810 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1b820 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09  sha1_hash);.....
1b830 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b840 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1b850 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
1b860 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1b870 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1b880 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1b890 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
1b8a0 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41  MD5_HASH:.....CA
1b8b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b8c0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1b8d0 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
1b8e0 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30 38  _MD5_HASH (0x%08
1b8f0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1b900 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1b910 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1b920 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1b930 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
1b940 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1b950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b960 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1b970 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1b980 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
1b990 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1b9a0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1b9b0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1b9c0 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74  .MD5Init(&md5_ct
1b9d0 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74  x);.....MD5Updat
1b9e0 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74  e(&md5_ctx, cert
1b9f0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1ba00 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d  cate_len);.....M
1ba10 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68  D5Final(md5_hash
1ba20 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09  , &md5_ctx);....
1ba30 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68  ..pValue = md5_h
1ba40 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ash;.....ulValue
1ba50 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35  Len = sizeof(md5
1ba60 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43  _hash);......CAC
1ba70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ba80 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1ba90 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
1baa0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1bab0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1bac0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
1bad0 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75  fault:.....pValu
1bae0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c  e = NULL;.....ul
1baf0 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
1bb00 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65  ONG) -1;.....bre
1bb10 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ak;...}....if ((
1bb20 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75  (CK_LONG) ulValu
1bb30 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f  eLen) != ((CK_LO
1bb40 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a  NG) -1)) {..../*
1bb50 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72 20   Push curr_attr 
1bb60 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a  onto the stack *
1bb70 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74  /....curr_attr.t
1bb80 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f  ype = curr_attr_
1bb90 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74  type;....curr_at
1bba0 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  tr.ulValueLen = 
1bbb0 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
1bbc0 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65  curr_attr.pValue
1bbd0 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61   = malloc(curr_a
1bbe0 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ttr.ulValueLen);
1bbf0 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
1bc00 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61  attr.pValue, pVa
1bc10 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75  lue, curr_attr.u
1bc20 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1bc30 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20  if (pValue_free 
1bc40 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
1bc50 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09  .free(pValue);..
1bc60 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61  ..}.....if (numa
1bc70 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63  ttrs >= retval_c
1bc80 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76  ount) {.....retv
1bc90 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
1bca0 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
1bcb0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
1bcc0 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  al));....}.....m
1bcd0 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75  emcpy(&retval[nu
1bce0 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61  mattrs], &curr_a
1bcf0 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  ttr, sizeof(curr
1bd00 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61  _attr));....numa
1bd10 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a  ttrs++;...}..}..
1bd20 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d  .if (numattrs !=
1bd30 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63   0) {...retval_c
1bd40 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
1bd50 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
1bd60 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76  loc(retval, retv
1bd70 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
1bd80 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20  f(*retval));..} 
1bd90 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65  else {...free(re
1bda0 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
1bdb0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70   = NULL;..}...*p
1bdc0 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  ulCount = numatt
1bdd0 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  rs;...CACKEY_DEB
1bde0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1bdf0 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73  ning %lu objects
1be00 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72   (%p).", numattr
1be10 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74 76  s, (void *) retv
1be20 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
1be30 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1be40 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
1be50 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  e_identities(str
1be60 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
1be70 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c  ity *identities,
1be80 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
1be90 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1bea0 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
1beb0 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e   *curr_attr;..un
1bec0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69  signed long id_i
1bed0 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09  dx, attr_idx;...
1bee0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d  if (identities =
1bef0 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69  = NULL || identi
1bf00 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29  ties_count == 0)
1bf10 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
1bf20 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20  ..for (id_idx = 
1bf30 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e  0; id_idx < iden
1bf40 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64  tities_count; id
1bf50 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28  _idx++) {...if (
1bf60 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1bf70 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
1bf80 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64  ....for (attr_id
1bf90 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20  x = 0; attr_idx 
1bfa0 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  < identities[id_
1bfb0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1bfc0 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  count; attr_idx+
1bfd0 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74  +) {.....curr_at
1bfe0 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73  tr = &identities
1bff0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1c000 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  tes[attr_idx];..
1c010 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
1c020 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  r->pValue) {....
1c030 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72  ..free(curr_attr
1c040 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d  ->pValue);.....}
1c050 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64  ....}.....if (id
1c060 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1c070 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09  .attributes) {..
1c080 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74 69  ...free(identiti
1c090 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1c0a0 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09  butes);....}....
1c0b0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1c0c0 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ts(identities[id
1c0d0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1c0e0 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a  ity, 1, 1);...}.
1c0f0 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69  .}...free(identi
1c100 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ties);.}..static
1c110 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63   unsigned long c
1c120 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
1c130 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74  dentities(struct
1c140 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1c150 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e   *identities, un
1c160 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1c170 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e  dod_certs) {..un
1c180 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74  signed long cert
1c190 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d 20 30  _idx, id_idx = 0
1c1a0 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69  ;...if (identiti
1c1b0 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es == NULL) {...
1c1c0 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63  return(num_dod_c
1c1d0 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09  erts * 3);..}...
1c1e0 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20  for (cert_idx = 
1c1f0 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75  0; cert_idx < nu
1c200 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 65 72  m_dod_certs; cer
1c210 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65  t_idx++) {...ide
1c220 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c230 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
1c240 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69  NULL;...identiti
1c250 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1c260 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
1c270 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
1c280 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20 26  O_CERTIFICATE, &
1c290 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
1c2a0 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
1c2b0 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1c2c0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1c2d0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1c2e0 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09  ...id_idx++;....
1c2f0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c300 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1c310 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74   = NULL;...ident
1c320 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1c330 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1c340 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1c350 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c  (CKO_PUBLIC_KEY,
1c360 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
1c370 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
1c380 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
1c390 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c3a0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1c3b0 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a  );...id_idx++;..
1c3c0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1c3d0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1c3e0 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
1c3f0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c400 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
1c410 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
1c420 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  es(CKO_NETSCAPE_
1c430 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f 63 65  TRUST, &extra_ce
1c440 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
1c450 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
1c460 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1c470 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1c480 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
1c490 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  x++;..}...return
1c4a0 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  (id_idx);.}..sta
1c4b0 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
1c4c0 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b  y_identity *cack
1c4d0 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
1c4e0 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
1c4f0 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
1c500 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f  igned long *ids_
1c510 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74  found) {..struct
1c520 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
1c530 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
1c540 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20  tities;..struct 
1c550 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
1c560 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  *identities;..un
1c570 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1c580 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72  ids, id_idx, cur
1c590 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69  r_id_type;..unsi
1c5a0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
1c5b0 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  rts, num_dod_cer
1c5c0 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69  ts, cert_idx;..i
1c5d0 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  nt include_extra
1c5e0 5f 63 65 72 74 73 20 3d 20 30 2c 20 69 6e 63 6c  _certs = 0, incl
1c5f0 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a  ude_dod_certs;..
1c600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c610 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1c620 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64  ...if (ids_found
1c630 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1c640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c650 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66  F("Error.  ids_f
1c660 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  ound is NULL");.
1c670 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
1c680 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
1c690 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43  EY_CARD_SLOT_INC
1c6a0 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53  LUDE_EXTRA_CERTS
1c6b0 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
1c6c0 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69  certs = 1;.#endi
1c6d0 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  f...if (getenv("
1c6e0 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53  CACKEY_DOD_CERTS
1c6f0 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21  _ON_HW_SLOTS") !
1c700 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1c710 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
1c720 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65  = 1;..}...if (ge
1c730 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
1c740 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f  DOD_CERTS_ON_HW_
1c750 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  SLOTS") != NULL)
1c760 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74   {...include_ext
1c770 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  ra_certs = 0;..}
1c780 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
1c790 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09  NO_EXTRA_CERTS..
1c7a0 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1c7b0 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29  EY_EXTRA_CERTS")
1c7c0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1c7d0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1c7e0 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
1c7f0 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1c800 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65  ts = 0;..}.#else
1c810 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1c820 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45  CKEY_NO_EXTRA_CE
1c830 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  RTS") != NULL) {
1c840 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1c850 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  erts = 0;..} els
1c860 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f  e {...include_do
1c870 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a  d_certs = 1;..}.
1c880 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63  #endif...if (inc
1c890 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 29 20  lude_dod_certs) 
1c8a0 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  {...num_dod_cert
1c8b0 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61  s = sizeof(extra
1c8c0 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66  _certs) / sizeof
1c8d0 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29  (extra_certs[0])
1c8e0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75  ;..} else {...nu
1c8f0 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b  m_dod_certs = 0;
1c900 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
1c910 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75  internal) {...nu
1c920 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72  m_ids = cackey_r
1c930 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
1c940 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64  es(NULL, num_dod
1c950 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28  _certs);....if (
1c960 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a  num_ids != 0) {.
1c970 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
1c980 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a  malloc(num_ids *
1c990 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
1c9a0 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ies));.....cacke
1c9b0 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
1c9c0 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73  ities(identities
1c9d0 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1c9e0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1c9f0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
1ca00 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66  L;...}....*ids_f
1ca10 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a  ound = num_ids;.
1ca20 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69  ...return(identi
1ca30 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  ties);..}...pcsc
1ca40 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
1ca50 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
1ca60 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  slot, NULL, &num
1ca70 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63  _certs);..if (pc
1ca80 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
1ca90 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f   NULL) {.../* Co
1caa0 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20  nvert number of 
1cab0 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20  Certs to number 
1cac0 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09  of objects */...
1cad0 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50  num_ids = (CKO_P
1cae0 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f  RIVATE_KEY - CKO
1caf0 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31  _CERTIFICATE + 1
1cb00 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a  ) * num_certs;..
1cb10 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78  ..if (include_ex
1cb20 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  tra_certs) {....
1cb30 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65  num_ids += cacke
1cb40 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
1cb50 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f  ities(NULL, num_
1cb60 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
1cb70 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
1cb80 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a  malloc(num_ids *
1cb90 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
1cba0 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64  ies));..../* Add
1cbb0 20 63 65 72 74 69 66 69 63 61 74 65 73 2c 20 70   certificates, p
1cbc0 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20  ublic keys, and 
1cbd0 70 72 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f  private keys fro
1cbe0 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72 64 20  m the smartcard 
1cbf0 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b  */...id_idx = 0;
1cc00 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
1cc10 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
1cc20 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74   num_certs; cert
1cc30 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72  _idx++) {....for
1cc40 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d   (curr_id_type =
1cc50 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
1cc60 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c  ; curr_id_type <
1cc70 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
1cc80 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b  Y; curr_id_type+
1cc90 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74  +) {.....identit
1cca0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1ccb0 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
1ccc0 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63  get_attributes(c
1ccd0 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63  urr_id_type, &pc
1cce0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1ccf0 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64  rt_idx], cert_id
1cd00 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
1cd10 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1cd20 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69  s_count);......i
1cd30 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1cd40 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1cd50 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
1cd60 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  *identities[id_i
1cd70 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1cd80 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  y));.....memcpy(
1cd90 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1cda0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1cdb0 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69  , &pcsc_identiti
1cdc0 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69  es[cert_idx], si
1cdd0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
1cde0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1cdf0 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69  entity));......i
1ce00 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1ce10 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
1ce20 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
1ce30 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74  alloc(pcsc_ident
1ce40 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e  ities[cert_idx].
1ce50 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
1ce60 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65  ;.....memcpy(ide
1ce70 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1ce80 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
1ce90 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
1cea0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1ceb0 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
1cec0 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  e, pcsc_identiti
1ced0 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
1cee0 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a  tificate_len);..
1cef0 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09  ....id_idx++;...
1cf00 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e  .}...}....if (in
1cf10 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1cf20 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  s) {....CACKEY_D
1cf30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63  EBUG_PRINTF("Inc
1cf40 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65 72 6e  luding US Govern
1cf50 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 74 65  ment Certificate
1cf60 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20 73 6c  s on hardware sl
1cf70 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ot");.....cackey
1cf80 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1cf90 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 20  ties(identities 
1cfa0 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f  + id_idx, num_do
1cfb0 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09  d_certs);...}...
1cfc0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1cfd0 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ts(pcsc_identiti
1cfe0 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31  es, num_certs, 1
1cff0 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64  );....*ids_found
1d000 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72   = num_ids;....r
1d010 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73  eturn(identities
1d020 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f  );..}....*ids_fo
1d030 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  und = 0;..return
1d040 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69  (NULL);.}..stati
1d050 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
1d060 6b 65 79 5f 67 65 74 5f 70 69 6e 28 63 68 61 72  key_get_pin(char
1d070 20 2a 70 69 6e 62 75 66 29 20 7b 0a 09 46 49 4c   *pinbuf) {..FIL
1d080 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68 61 72 20  E *pinfd;..char 
1d090 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 69 6e 74  *fgets_ret;..int
1d0a0 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09 69   pclose_ret;...i
1d0b0 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
1d0c0 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mmand == NULL) {
1d0d0 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
1d0e0 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
1d0f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75  ;..}...if (pinbu
1d100 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  f == NULL) {...r
1d110 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
1d120 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
1d130 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d140 50 52 49 4e 54 46 28 22 43 41 43 4b 45 59 5f 50  PRINTF("CACKEY_P
1d150 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25 73 22  IN_COMMAND = %s"
1d160 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  , cackey_pin_com
1d170 6d 61 6e 64 29 3b 0a 0a 09 70 69 6e 66 64 20 3d  mand);...pinfd =
1d180 20 70 6f 70 65 6e 28 63 61 63 6b 65 79 5f 70 69   popen(cackey_pi
1d190 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 22 72 22 29 3b  n_command, "r");
1d1a0 0a 09 69 66 20 28 70 69 6e 66 64 20 3d 3d 20 4e  ..if (pinfd == N
1d1b0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1d1c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d1d0 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62 6c 65  ror.  %s: Unable
1d1e0 20 74 6f 20 72 75 6e 22 2c 20 63 61 63 6b 65 79   to run", cackey
1d1f0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a  _pin_command);..
1d200 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
1d210 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
1d220 09 7d 0a 0a 09 66 67 65 74 73 5f 72 65 74 20 3d  .}...fgets_ret =
1d230 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c 20 33   fgets(pinbuf, 3
1d240 32 2c 20 70 69 6e 66 64 29 3b 0a 09 69 66 20 28  2, pinfd);..if (
1d250 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c  fgets_ret == NUL
1d260 4c 29 20 7b 0a 09 09 70 69 6e 62 75 66 5b 30 5d  L) {...pinbuf[0]
1d270 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 70 63   = '\0';..}...pc
1d280 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c 6f 73  lose_ret = pclos
1d290 65 28 70 69 6e 66 64 29 3b 0a 09 69 66 20 28 70  e(pinfd);..if (p
1d2a0 63 6c 6f 73 65 5f 72 65 74 20 3d 3d 20 2d 31 20  close_ret == -1 
1d2b0 26 26 20 65 72 72 6e 6f 20 3d 3d 20 45 43 48 49  && errno == ECHI
1d2c0 4c 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LD) {...CACKEY_D
1d2d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 74  EBUG_PRINTF("Not
1d2e0 69 63 65 2e 20 20 70 63 6c 6f 73 65 28 29 20 69  ice.  pclose() i
1d2f0 6e 64 69 63 61 74 65 64 20 69 74 20 63 6f 75 6c  ndicated it coul
1d300 64 20 6e 6f 74 20 67 65 74 20 74 68 65 20 73 74  d not get the st
1d310 61 74 75 73 20 6f 66 20 74 68 65 20 63 68 69 6c  atus of the chil
1d320 64 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 73  d, assuming it s
1d330 75 63 63 65 65 65 64 65 64 20 21 22 29 3b 0a 0a  ucceeeded !");..
1d340 09 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 30  ..pclose_ret = 0
1d350 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 63 6c 6f 73  ;..}...if (pclos
1d360 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  e_ret != 0) {...
1d370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d380 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a  NTF("Error.  %s:
1d390 20 65 78 69 74 65 64 20 77 69 74 68 20 6e 6f 6e   exited with non
1d3a0 2d 7a 65 72 6f 20 73 74 61 74 75 73 20 6f 66 20  -zero status of 
1d3b0 25 69 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f  %i", cackey_pin_
1d3c0 63 6f 6d 6d 61 6e 64 2c 20 70 63 6c 6f 73 65 5f  command, pclose_
1d3d0 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
1d3e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
1d3f0 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  DPIN);..}...if (
1d400 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 3c  strlen(pinbuf) <
1d410 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   1) {...CACKEY_D
1d420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d430 6f 72 2e 20 20 25 73 3a 20 72 65 74 75 72 6e 65  or.  %s: returne
1d440 64 20 6e 6f 20 64 61 74 61 22 2c 20 63 61 63 6b  d no data", cack
1d450 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b  ey_pin_command);
1d460 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
1d470 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
1d480 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75  ;..}...if (pinbu
1d490 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29  f[strlen(pinbuf)
1d4a0 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b   - 1] == '\n') {
1d4b0 0a 09 09 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e  ...pinbuf[strlen
1d4c0 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 20  (pinbuf) - 1] = 
1d4d0 27 5c 30 27 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  '\0';..}...retur
1d4e0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
1d4f0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1d500 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d510 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28  , C_Initialize)(
1d520 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69  CK_VOID_PTR pIni
1d530 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49  tArgs) {..CK_C_I
1d540 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43  NITIALIZE_ARGS C
1d550 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e  K_PTR args;..uin
1d560 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67 68 65  t32_t idx, highe
1d570 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75  st_slot;..int mu
1d580 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 09 69  tex_init_ret;..i
1d590 6e 74 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  nt include_dod_c
1d5a0 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  erts;...CACKEY_D
1d5b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1d5c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
1d5d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1d5e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d5f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d600 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69  .  Already initi
1d610 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1d620 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1d630 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41  I_ALREADY_INITIA
1d640 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1d650 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55  (pInitArgs != NU
1d660 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70  LL) {...args = p
1d670 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63  InitArgs;...memc
1d680 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c  py(&cackey_args,
1d690 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61   args, sizeof(ca
1d6a0 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09  ckey_args));....
1d6b0 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
1d6c0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1d6d0 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
1d6e0 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
1d6f0 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d  rgs->LockMutex =
1d700 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1d710 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e  UnlockMutex == N
1d720 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72  ULL) {....if (ar
1d730 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
1d740 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1d750 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d  >DestroyMutex !=
1d760 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
1d770 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ockMutex != NULL
1d780 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
1d790 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b  Mutex != NULL) {
1d7a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d7b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d7c0 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41   Some, but not A
1d7d0 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72 69  ll threading pri
1d7e0 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64 65 64  mitives provided
1d7f0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
1d800 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1d810 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  AD);....}...}..}
1d820 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79   else {...cackey
1d830 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
1d840 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
1d850 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d  ey_args.DestroyM
1d860 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1d870 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
1d880 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1d890 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
1d8a0 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
1d8b0 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  .cackey_args.fla
1d8c0 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72  gs = 0;..}...for
1d8d0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1d8e0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1d8f0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1d900 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1d910 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
1d920 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
1d930 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20  ons[idx].active 
1d940 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  = 0;..}...for (i
1d950 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
1d960 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1d970 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1d980 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
1d990 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
1d9a0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74  y_slots[idx].act
1d9b0 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ive = 0;...cacke
1d9c0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
1d9d0 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b  c_reader = NULL;
1d9e0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1d9f0 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  idx].transaction
1da00 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61  _depth = 0;...ca
1da10 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1da20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
1da30 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
1da40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1da50 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30  ].slot_reset = 0
1da60 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1da70 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  [idx].token_flag
1da80 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  s = 0;...cackey_
1da90 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
1daa0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
1dab0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74  y_slots[idx].int
1dac0 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 23  ernal = 0;..}..#
1dad0 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f  ifdef CACKEY_NO_
1dae0 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20  EXTRA_CERTS..if 
1daf0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1db00 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1db10 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1db20 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31  de_dod_certs = 1
1db30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e  ;..} else {...in
1db40 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1db50 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69  = 0;..}.#else..i
1db60 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1db70 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1db80 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1db90 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1dba0 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 0;..} else {
1dbb0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1dbc0 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e  erts = 1;..}.#en
1dbd0 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64  dif...if (includ
1dbe0 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d 20 30  e_dod_certs == 0
1dbf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dc00 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64  UG_PRINTF("Asked
1dc10 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20   not to include 
1dc20 44 6f 44 20 63 65 72 74 69 66 69 63 61 74 65 73  DoD certificates
1dc30 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
1dc40 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28  highest_slot = (
1dc50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1dc60 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1dc70 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20  ckey_slots[0])) 
1dc80 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  - 1;....CACKEY_D
1dc90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63  EBUG_PRINTF("Inc
1dca0 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73  luding DoD certs
1dcb0 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28   in slot %lu", (
1dcc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
1dcd0 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09  ighest_slot);...
1dce0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1dcf0 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69  ghest_slot].acti
1dd00 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79  ve = 1;...cackey
1dd10 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1dd20 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20  lot].internal = 
1dd30 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  1;...cackey_slot
1dd40 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e  s[highest_slot].
1dd50 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65  label = (unsigne
1dd60 64 20 63 68 61 72 20 2a 29 20 22 55 53 20 47 6f  d char *) "US Go
1dd70 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69  vernment Certifi
1dd80 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79  cates";...cackey
1dd90 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1dda0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
1ddb0 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63   = "CACKey";...c
1ddc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1ddd0 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  est_slot].token_
1dde0 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  flags = 0;..}...
1ddf0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1de00 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63  ed = 1;...if (!c
1de10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
1de20 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e  it) {...mutex_in
1de30 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  it_ret = cackey_
1de40 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 63 61  mutex_create(&ca
1de50 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1de60 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74  ..if (mutex_init
1de70 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
1de80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1de90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74  NTF("Error.  Mut
1dea0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
1deb0 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  n failed.");....
1dec0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54  .return(CKR_CANT
1ded0 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63  _LOCK);...}....c
1dee0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
1def0 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  it = 1;..}.../* 
1df00 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64  Define a command
1df10 20 74 6f 20 70 72 6f 6d 70 74 20 75 73 65 72 20   to prompt user 
1df20 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23 69 66  for a PIN */.#if
1df30 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43  def CACKEY_PIN_C
1df40 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 0a 09  OMMAND_DEFAULT..
1df50 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1df60 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b  nd = strdup(CACK
1df70 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54  EY_MACRO_DEFAULT
1df80 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e  _XSTR(CACKEY_PIN
1df90 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
1dfa0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ));.#endif..#ifd
1dfb0 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  ef CACKEY_PIN_CO
1dfc0 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41  MMAND_XONLY_DEFA
1dfd0 55 4c 54 0a 09 69 66 20 28 67 65 74 65 6e 76 28  ULT..if (getenv(
1dfe0 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55  "DISPLAY") != NU
1dff0 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
1e000 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72  in_command = str
1e010 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f  dup(CACKEY_MACRO
1e020 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41  _DEFAULT_XSTR(CA
1e030 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1e040 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29  _XONLY_DEFAULT))
1e050 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66  ;..}.#endif...if
1e060 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1e070 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21  _PIN_COMMAND") !
1e080 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
1e090 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1e0a0 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22   strdup(getenv("
1e0b0 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1e0c0 4e 44 22 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ND"));..}...if (
1e0d0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1e0e0 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59  IN_COMMAND_XONLY
1e0f0 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65  ") != NULL && ge
1e100 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20  tenv("DISPLAY") 
1e110 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1e120 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1e130 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28  = strdup(getenv(
1e140 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1e150 41 4e 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a 09 7d  AND_XONLY"));..}
1e160 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
1e170 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f  READERS_INCLUDE_
1e180 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63 61  ONLY_DEFAULT..ca
1e190 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1e1a0 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64  lude_only = strd
1e1b0 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1e1c0 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1e1d0 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c  KEY_READERS_INCL
1e1e0 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  UDE_ONLY_DEFAULT
1e1f0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ));.#endif..#ifd
1e200 65 66 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52  ef CACKEY_READER
1e210 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c  S_EXCLUDE_DEFAUL
1e220 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  T..cackey_reader
1e230 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64  s_exclude = strd
1e240 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1e250 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1e260 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c  KEY_READERS_EXCL
1e270 55 44 45 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23  UDE_DEFAULT));.#
1e280 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65  endif...if (gete
1e290 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45  nv("CACKEY_READE
1e2a0 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22  RS_INCLUDE_ONLY"
1e2b0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1e2c0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
1e2d0 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72  clude_only = str
1e2e0 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b  dup(getenv("CACK
1e2f0 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55  EY_READERS_INCLU
1e300 44 45 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09 09 69  DE_ONLY"));....i
1e310 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  f (cackey_reader
1e320 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 5b 30  s_include_only[0
1e330 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09  ] == '\0') {....
1e340 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64  free(cackey_read
1e350 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1e360 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65  );.....cackey_re
1e370 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1e380 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ly = NULL;...}..
1e390 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
1e3a0 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45  CACKEY_READERS_E
1e3b0 58 43 4c 55 44 45 22 29 20 21 3d 20 4e 55 4c 4c  XCLUDE") != NULL
1e3c0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61  ) {...cackey_rea
1e3d0 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73  ders_exclude = s
1e3e0 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41  trdup(getenv("CA
1e3f0 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43  CKEY_READERS_EXC
1e400 4c 55 44 45 22 29 29 3b 0a 0a 09 09 69 66 20 28  LUDE"));....if (
1e410 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
1e420 78 63 6c 75 64 65 5b 30 5d 20 3d 3d 20 27 5c 30  xclude[0] == '\0
1e430 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  ') {....free(cac
1e440 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1e450 75 64 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ude);.....cackey
1e460 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
1e470 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a   = NULL;...}..}.
1e480 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e490 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1e4a0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1e4b0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1e4c0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1e4d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1e4e0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a  CK_RV, C_Finaliz
1e4f0 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
1e500 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e  Reserved) {..uin
1e510 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43  t32_t idx;...CAC
1e520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e530 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1e540 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
1e550 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1e560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e570 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
1e580 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
1e590 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1e5a0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1e5b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1e5c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1e5d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e5e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1e5f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1e600 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1e610 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1e620 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66  IALIZED);..}...f
1e630 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1e640 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1e650 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1e660 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1e670 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1e680 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
1e690 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
1e6a0 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c  ctive) {....C_Cl
1e6b0 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
1e6c0 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
1e6d0 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
1e6e0 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28  t_all();...for (
1e6f0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1e700 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1e710 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1e720 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1e730 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1e740 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1e750 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1e760 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1e770 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1e780 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
1e790 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63  der) {....free(c
1e7a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1e7b0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
1e7c0 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
1e7d0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68  _slots[idx].cach
1e7e0 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63  ed_certs) {....c
1e7f0 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1e800 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1e810 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c  x].cached_certs,
1e820 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64   cackey_slots[id
1e830 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  x].cached_certs_
1e840 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63  count, 1);.....c
1e850 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1e860 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20  .cached_certs = 
1e870 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63  NULL;...}..}...c
1e880 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
1e890 6e 6e 65 63 74 28 29 3b 0a 0a 09 69 66 20 28 63  nnect();...if (c
1e8a0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1e8b0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  d != NULL) {...f
1e8c0 72 65 65 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63  ree(cackey_pin_c
1e8d0 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 63 61 63 6b  ommand);....cack
1e8e0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1e8f0 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28   NULL;..}...if (
1e900 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1e910 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e  nclude_only != N
1e920 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61  ULL) {...free(ca
1e930 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1e940 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 63  lude_only);....c
1e950 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
1e960 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c  clude_only = NUL
1e970 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  L;..}...if (cack
1e980 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
1e990 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  de != NULL) {...
1e9a0 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64  free(cackey_read
1e9b0 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09  ers_exclude);...
1e9c0 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1e9d0 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a  exclude = NULL;.
1e9e0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  .}...cackey_init
1e9f0 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43  ialized = 0;...C
1ea00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ea10 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ea20 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1ea30 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1ea40 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1ea50 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ea60 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43  RV, C_GetInfo)(C
1ea70 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  K_INFO_PTR pInfo
1ea80 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
1ea90 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
1eaa0 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
1eab0 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
1eac0 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1ead0 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  R libraryDescrip
1eae0 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
1eaf0 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ";...CACKEY_DEBU
1eb00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1eb10 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1eb20 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1eb30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eb40 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1eb50 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1eb60 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1eb70 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1eb80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1eb90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1eba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ebb0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1ebc0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1ebd0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1ebe0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1ebf0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  ZED);..}...pInfo
1ec00 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
1ec10 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
1ec20 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
1ec30 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
1ec40 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1ec50 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
1ec60 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
1ec70 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
1ec80 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
1ec90 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28   0xff;...memset(
1eca0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1ecb0 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
1ecc0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
1ecd0 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
1ece0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
1ecf0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
1ed00 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
1ed10 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
1ed20 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
1ed30 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a  >flags = 0x00;..
1ed40 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
1ed50 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1ed60 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
1ed70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
1ed80 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
1ed90 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  cpy(pInfo->libra
1eda0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c  ryDescription, l
1edb0 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1edc0 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72  n, sizeof(librar
1edd0 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  yDescription) - 
1ede0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  1);...pInfo->lib
1edf0 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  raryVersion.majo
1ee00 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1ee10 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
1ee20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
1ee30 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
1ee40 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
1ee50 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
1ee60 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  ) & 0xff;...CACK
1ee70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ee80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1ee90 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1eea0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1eeb0 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f  K);.}../*. * Pro
1eec0 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61  cess list of rea
1eed0 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65  ders, and create
1eee0 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e   mapping between
1eef0 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64   reader name and
1ef00 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f   slot ID. */.CK_
1ef10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1ef20 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
1ef30 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74  List)(CK_BBOOL t
1ef40 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f  okenPresent, CK_
1ef50 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
1ef60 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tList, CK_ULONG_
1ef70 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
1ef80 09 73 74 61 74 69 63 20 69 6e 74 20 66 69 72 73  .static int firs
1ef90 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74  t_call = 1;..int
1efa0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1efb0 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  int pcsc_connect
1efc0 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _ret;..CK_ULONG 
1efd0 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
1efe0 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c  t = 0, currslot,
1eff0 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72   slot_idx;..char
1f000 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20   *pcsc_readers, 
1f010 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 2c  *pcsc_readers_s,
1f020 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65   *pcsc_readers_e
1f030 3b 0a 09 63 68 61 72 20 2a 72 65 61 64 65 72 5f  ;..char *reader_
1f040 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 3b 0a 09  check_pattern;..
1f050 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65  DWORD pcsc_reade
1f060 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  rs_len;..LONG sc
1f070 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1f080 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72  ret;..size_t cur
1f090 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69  r_reader_len;..i
1f0a0 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 09  nt slot_reset;..
1f0b0 69 6e 74 20 69 6e 63 6c 75 64 65 5f 72 65 61 64  int include_read
1f0c0 65 72 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  er;...CACKEY_DEB
1f0d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f0e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43  d.");...if (pulC
1f0f0 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
1f100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f110 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
1f120 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22  lCount is NULL."
1f130 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f140 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1f150 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1f160 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f170 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f180 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f190 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f1a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f1b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f1c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f1d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f1e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1f1f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f200 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f210 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f220 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f230 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1f240 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1f250 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1f260 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1f270 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74  .../* Clear list
1f280 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c   of slots */..sl
1f290 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 69  ot_reset = 0;..i
1f2a0 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a  f (pSlotList) {.
1f2b0 09 09 69 66 20 28 66 69 72 73 74 5f 63 61 6c 6c  ..if (first_call
1f2c0 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63 61 6c  ) {....first_cal
1f2d0 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f  l = 0;.....slot_
1f2e0 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a  reset = 1;...}..
1f2f0 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  ../* If any of t
1f300 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20 62 65  he slots have be
1f310 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20 70 75  en reset then pu
1f320 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  rge all informat
1f330 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20 61 67  ion and check ag
1f340 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75  ain */...for (cu
1f350 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
1f360 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1f370 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1f380 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1f390 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1f3a0 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61  t++) {....if (ca
1f3b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1f3c0 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot].internal) {
1f3d0 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
1f3e0 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
1f3f0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1f400 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  ot].active) {...
1f410 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
1f420 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1f430 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1f440 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
1f450 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31  ..slot_reset = 1
1f460 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1f470 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c  .}...}....if (sl
1f480 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 43  ot_reset) {....C
1f490 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f4a0 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c 6c 20  TF("Purging all 
1f4b0 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
1f4c0 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79  .");...../* Only
1f4d0 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
1f4e0 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20   of slots if we 
1f4f0 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69  are actually bei
1f500 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ng supply the sl
1f510 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
1f520 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  /....cackey_slot
1f530 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
1f540 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75 72  ();.....for (cur
1f550 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
1f560 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
1f570 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1f580 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1f590 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
1f5a0 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61  ++) {.....if (ca
1f5b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1f5c0 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot].internal) {
1f5d0 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
1f5e0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1f5f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1f600 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1f610 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  r) {......free(c
1f620 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1f630 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1f640 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79  r);.......cackey
1f650 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1f660 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
1f670 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ULL;.....}......
1f680 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1f690 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c  [currslot].label
1f6a0 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61  ) {......free(ca
1f6b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1f6c0 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09  lot].label);....
1f6d0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f6e0 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20  currslot].label 
1f6f0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09  = NULL;.....}...
1f700 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f710 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
1f720 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65   = 0;....}...} e
1f730 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a 09 7d  lse {.......}..}
1f740 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
1f750 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
1f760 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  */..pcsc_connect
1f770 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
1f780 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 2f 2a  sc_connect();./*
1f790 20 58 58 58 3a 20 43 41 4e 20 48 41 4e 47 20 48   XXX: CAN HANG H
1f7a0 45 52 45 20 21 20 2a 2f 0a 09 69 66 20 28 70 63  ERE ! */..if (pc
1f7b0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
1f7c0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
1f7d0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
1f7e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
1f7f0 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
1f800 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e   failed, assumin
1f810 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09  g no slots");...
1f820 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b  .slot_count = 0;
1f830 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73  ..} else {...pcs
1f840 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20  c_readers_len = 
1f850 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74  0;....scard_list
1f860 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
1f870 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
1f880 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
1f890 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  le, NULL, NULL, 
1f8a0 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  &pcsc_readers_le
1f8b0 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64  n);....if (scard
1f8c0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1f8d0 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d   == SCARD_F_COMM
1f8e0 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43  _ERROR) {....CAC
1f8f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f900 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69  ("Error. SCardLi
1f910 73 74 52 65 61 64 65 72 73 28 29 20 72 65 74 75  stReaders() retu
1f920 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d  rned SCARD_F_COM
1f930 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e  M_ERROR, assumin
1f940 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  g Connection to 
1f950 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e  PC/SC went away.
1f960 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29   Reconnecting.")
1f970 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  ;.....cackey_pcs
1f980 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a  c_disconnect();.
1f990 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  ...cackey_pcsc_c
1f9a0 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41  onnect();.....CA
1f9b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f9c0 46 28 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c  F("Trying SCardL
1f9d0 69 73 74 52 65 61 64 65 72 73 28 29 20 61 67 61  istReaders() aga
1f9e0 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c  in");....scard_l
1f9f0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1fa00 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1fa10 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
1fa20 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  andle, NULL, NUL
1fa30 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73  L, &pcsc_readers
1fa40 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  _len);...}....if
1fa50 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
1fa60 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
1fa70 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63  _S_SUCCESS && pc
1fa80 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21  sc_readers_len !
1fa90 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72  = 0) {....pcsc_r
1faa0 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28  eaders = malloc(
1fab0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1fac0 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65  );....pcsc_reade
1fad0 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_s = pcsc_read
1fae0 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c  ers;.....scard_l
1faf0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1fb00 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1fb10 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
1fb20 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73  andle, NULL, pcs
1fb30 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63  c_readers, &pcsc
1fb40 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
1fb50 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
1fb60 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
1fb70 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
1fb80 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  {.....pcsc_reade
1fb90 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_e = pcsc_read
1fba0 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65  ers + pcsc_reade
1fbb0 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20  rs_len;....../* 
1fbc0 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20  Start with Slot 
1fbd0 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61  ID 1, to avoid a
1fbe0 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52   bug in GDM on R
1fbf0 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75  HEL */...../* Bu
1fc00 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a  g 594911: https:
1fc10 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61  //bugzilla.redha
1fc20 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63  t.com/show_bug.c
1fc30 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a  gi?id=594911 */.
1fc40 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31  ....currslot = 1
1fc50 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ;.....slot_count
1fc60 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c 65 20   = 0;.....while 
1fc70 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20  (pcsc_readers < 
1fc80 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
1fc90 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e  {....../* Find n
1fca0 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c  ext available sl
1fcb0 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28  ot */......for (
1fcc0 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1fcd0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1fce0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1fcf0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1fd00 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1fd10 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1fd20 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1fd30 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09  ctive) {........
1fd40 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09  break;.......}..
1fd50 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72  ....}.......curr
1fd60 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74  _reader_len = st
1fd70 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72  rlen(pcsc_reader
1fd80 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70  s);.......if ((p
1fd90 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75  csc_readers + cu
1fda0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e  rr_reader_len) >
1fdb0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29   pcsc_readers_e)
1fdc0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
1fdd0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
1fde0 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e  (curr_reader_len
1fdf0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62   == 0) {.......b
1fe00 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1fe10 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20  ...if (currslot 
1fe20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1fe30 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1fe40 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1fe50 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ]))) {.......CAC
1fe60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fe70 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61  ("Found more rea
1fe80 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20  ders than slots 
1fe90 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29  are available!")
1fea0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
1feb0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43  .....}.......CAC
1fec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fed0 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20  ("Found reader: 
1fee0 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 25  %s (currslot = %
1fef0 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61 64 65  lu)", pcsc_reade
1ff00 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  rs, (unsigned lo
1ff10 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a  ng) currslot);..
1ff20 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1ff30 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f  readers_include_
1ff40 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  only != NULL) {.
1ff50 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1ff60 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64  UG_PRINTF("Asked
1ff70 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79   to include only
1ff80 20 72 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e   readers matchin
1ff90 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72  g: %s", cackey_r
1ffa0 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f  eaders_include_o
1ffb0 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63  nly);........inc
1ffc0 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 30 3b  lude_reader = 0;
1ffd0 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68  .......reader_ch
1ffe0 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61  eck_pattern = ca
1fff0 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
20000 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09  lude_only;......
20010 7d 20 65 6c 73 65 20 69 66 20 28 63 61 63 6b 65  } else if (cacke
20020 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64  y_readers_exclud
20030 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e != NULL) {....
20040 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20050 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f  PRINTF("Asked to
20060 20 65 78 63 6c 75 64 65 20 72 65 61 64 65 72 73   exclude readers
20070 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20   matching: %s", 
20080 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
20090 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09 09 09  xclude);........
200a0 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d  include_reader =
200b0 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72   1;.......reader
200c0 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d  _check_pattern =
200d0 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f   cackey_readers_
200e0 65 78 63 6c 75 64 65 3b 0a 09 09 09 09 09 7d 20  exclude;......} 
200f0 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 6e 63  else {.......inc
20100 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b  lude_reader = 1;
20110 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68  .......reader_ch
20120 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 4e 55  eck_pattern = NU
20130 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  LL;......}......
20140 09 69 66 20 28 72 65 61 64 65 72 5f 63 68 65 63  .if (reader_chec
20150 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e 55 4c  k_pattern != NUL
20160 4c 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73  L) {.......if (s
20170 74 72 73 74 72 28 70 63 73 63 5f 72 65 61 64 65  trstr(pcsc_reade
20180 72 73 2c 20 72 65 61 64 65 72 5f 63 68 65 63 6b  rs, reader_check
20190 5f 70 61 74 74 65 72 6e 29 20 21 3d 20 4e 55 4c  _pattern) != NUL
201a0 4c 29 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b  L) {........CACK
201b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
201c0 22 54 68 69 73 20 72 65 61 64 65 72 20 6d 61 74  "This reader mat
201d0 63 68 65 64 20 74 68 65 20 70 61 74 74 65 72 6e  ched the pattern
201e0 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09 09 09 09  .");............
201f0 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65  ...include_reade
20200 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72 65 61  r = !include_rea
20210 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  der;.......}....
20220 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 69 6e  ..}.......if (in
20230 63 6c 75 64 65 5f 72 65 61 64 65 72 20 21 3d 20  clude_reader != 
20240 31 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  1) {.......CACKE
20250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20260 53 6b 69 70 70 69 6e 67 20 74 68 69 73 20 72 65  Skipping this re
20270 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09 09 09  ader.");........
20280 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20  pcsc_readers += 
20290 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
202a0 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f 6e 74  + 1;........cont
202b0 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  inue;......}....
202c0 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74  .../* Only updat
202d0 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c  e the list of sl
202e0 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63  ots if we are ac
202f0 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b  tually being ask
20300 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ed supply the sl
20310 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
20320 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74  /......if (pSlot
20330 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66  List) {.......if
20340 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a   (slot_reset) {.
20350 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
20360 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
20370 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09  tive = 1;.......
20380 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
20390 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c  rrslot].internal
203a0 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
203b0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
203c0 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
203d0 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65  = strdup(pcsc_re
203e0 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63  aders);........c
203f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
20400 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f  slot].pcsc_card_
20410 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
20420 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
20430 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61  ts[currslot].tra
20440 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
20450 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
20460 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
20470 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
20480 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
20490 09 09 09 09 09 09 09 69 66 20 28 63 61 63 6b 65  .......if (cacke
204a0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d  y_pin_command ==
204b0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09   NULL) {........
204c0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
204d0 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  rrslot].token_fl
204e0 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
204f0 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09  REQUIRED;.......
20500 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
20510 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
20520 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66  urrslot].token_f
20530 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09 09 09  lags = 0;.......
20540 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  .}........cackey
20550 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
20560 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a  .label = NULL;..
20570 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  .......cackey_ma
20580 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63  rk_slot_reset(&c
20590 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
205a0 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a  slot]);.......}.
205b0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
205c0 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
205d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
205e0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09  active) {.......
205f0 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79  ./* Artificially
20600 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75   increase the nu
20610 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73  mber of active s
20620 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c  lots by what wil
20630 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20  l become active 
20640 2a 2f 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59  */........CACKEY
20650 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
20660 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76 65 20 73  ound in-active s
20670 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20 69 74 20  lot %lu, but it 
20680 77 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61  will be active a
20690 66 74 65 72 20 61 20 72 65 73 65 74 20 2d 2d 20  fter a reset -- 
206a0 6d 61 72 6b 69 6e 67 20 61 73 20 61 63 74 69 76  marking as activ
206b0 65 20 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e 67  e for accounting
206c0 20 70 75 72 70 6f 73 65 73 22 2c 20 28 75 6e 73   purposes", (uns
206d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
206e0 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 09 73  slot);.........s
206f0 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
20700 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09  ...}......}.....
20710 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09  .currslot++;....
20720 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
20730 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  += curr_reader_l
20740 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  en + 1;.....}...
20750 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
20760 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
20770 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
20780 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
20790 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
207a0 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
207b0 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
207c0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
207d0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
207e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
207f0 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 74 69  INTF("Found acti
20800 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20 72 65 61  ve slot %lu, rea
20810 64 65 72 20 3d 20 25 73 22 2c 20 28 75 6e 73 69  der = %s", (unsi
20820 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73  gned long) currs
20830 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  lot, cackey_slot
20840 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
20850 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09  _reader);.......
20860 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09  .slot_count++;..
20870 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d  ....}.....}....}
20880 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
20890 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
208a0 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20  "Second call to 
208b0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
208c0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
208d0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
208e0 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
208f0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
20900 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
20910 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
20920 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
20930 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28  ;....}.....free(
20940 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b  pcsc_readers_s);
20950 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
20960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20970 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74  TF("First call t
20980 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
20990 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
209a0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
209b0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
209c0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
209d0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
209e0 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
209f0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20a00 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  t);...}..}...mut
20a10 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20a20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20a30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20a40 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20a50 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
20a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20a70 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
20a80 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
20a90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
20aa0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
20ab0 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20  ..if (pSlotList 
20ac0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
20ad0 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
20ae0 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  unt;....CACKEY_D
20af0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20b00 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
20b10 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72  i).  Found %lu r
20b20 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20  eaders, but not 
20b30 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c  storing IDs (pSl
20b40 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22  otList == NULL)"
20b50 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67  , CKR_OK, (unsig
20b60 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63  ned long) slot_c
20b70 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
20b80 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63  (CKR_OK);..}...c
20b90 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74  ount = *pulCount
20ba0 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73  ;..if (count < s
20bb0 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43  lot_count) {...C
20bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20bd0 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
20be0 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
20bf0 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61  tries, but we ha
20c00 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22  ve %lu entries."
20c10 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  , count, slot_co
20c20 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  unt);....CACKEY_
20c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20c40 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
20c50 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a  ER_TOO_SMALL");.
20c60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55  ...return(CKR_BU
20c70 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b  FFER_TOO_SMALL);
20c80 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ...}...mutex_ret
20c90 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20ca0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
20cb0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
20cc0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
20cd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20ce0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20cf0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
20d00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20d10 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20d20 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78  );..}...slot_idx
20d30 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
20d40 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73  slot = 0; (currs
20d50 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
20d60 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
20d70 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
20d80 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f  s[0]))); currslo
20d90 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  t++) {...if (!ca
20da0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
20db0 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
20dc0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
20dd0 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20  ...if (slot_idx 
20de0 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  >= count) {....C
20df0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20e00 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
20e10 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
20e20 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75  tries, but we ju
20e30 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69 74  st tried to writ
20e40 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64  e to the %lu ind
20e50 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c  ex -- ignoring",
20e60 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78   count, slot_idx
20e70 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
20e80 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73  ...}....pSlotLis
20e90 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75  t[slot_idx] = cu
20ea0 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69  rrslot;...slot_i
20eb0 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  dx++;..}...mutex
20ec0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
20ed0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20ee0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20ef0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
20f00 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
20f10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20f20 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
20f30 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20f40 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20f50 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20f60 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74  *pulCount = slot
20f70 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59  _count;...CACKEY
20f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
20f90 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
20fa0 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75  (%i).  Found %lu
20fb0 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f   readers.", CKR_
20fc0 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  OK, (unsigned lo
20fd0 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  ng) slot_count);
20fe0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
20ff0 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e  );...tokenPresen
21000 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74  t = tokenPresent
21010 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
21020 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
21030 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45  ning */.}..CK_DE
21040 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
21050 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e  _RV, C_GetSlotIn
21060 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
21070 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49  lotID, CK_SLOT_I
21080 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
21090 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
210a0 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70  CHAR slotDescrip
210b0 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
210c0 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74   Slot";..int mut
210d0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
210e0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a  bytes_to_copy;..
210f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21100 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21110 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
21120 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
21130 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21140 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
21150 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
21160 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
21170 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
21180 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
21190 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
211a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
211b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
211c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
211d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
211e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
211f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
21200 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
21210 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21220 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21230 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21240 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21250 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21260 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21270 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21280 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
21290 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
212a0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
212b0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
212c0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
212d0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
212e0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
212f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21300 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21310 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21330 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21340 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21350 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21360 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
21370 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21380 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
21390 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
213a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
213b0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
213c0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
213d0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
213e0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
213f0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
21400 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21410 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
21420 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
21430 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21440 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
21450 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69  CKF_HW_SLOT;...i
21460 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
21470 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61  [slotID].interna
21480 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  l) {...pInfo->fl
21490 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56  ags |= CKF_REMOV
214a0 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a  ABLE_DEVICE;..}.
214b0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
214c0 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
214d0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
214e0 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) == CACKEY_PCSC
214f0 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
21500 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
21510 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50  s |= CKF_TOKEN_P
21520 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74  RESENT;..}...byt
21530 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72  es_to_copy = str
21540 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  len(cackey_slots
21550 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65  [slotID].pcsc_re
21560 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65  ader);..if (size
21570 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
21580 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65  cturerID) < byte
21590 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62  s_to_copy) {...b
215a0 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
215b0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
215c0 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d  ufacturerID);..}
215d0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
215e0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
215f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
21600 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
21610 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
21620 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
21630 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
21640 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21650 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
21660 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
21670 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21680 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21690 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
216a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
216b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
216c0 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  R);..}...memset(
216d0 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
216e0 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a  iption, ' ', siz
216f0 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  eof(pInfo->slotD
21700 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
21710 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f  emcpy(pInfo->slo
21720 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c  tDescription, sl
21730 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
21740 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69  izeof(slotDescri
21750 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d  ption) - 1);...m
21760 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
21770 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
21780 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
21790 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
217a0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
217b0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
217c0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
217d0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
217e0 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
217f0 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
21800 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
21810 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
21820 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
21830 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
21840 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
21850 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
21860 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
21870 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f   0x00;...CACKEY_
21880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21890 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
218a0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
218b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
218c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
218d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
218e0 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b  GetTokenInfo)(CK
218f0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
21900 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50   CK_TOKEN_INFO_P
21910 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61  TR pInfo) {..sta
21920 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
21930 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d  manufacturerID[]
21940 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d   = "U.S. Governm
21950 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ent";..static CK
21960 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c  _UTF8CHAR defaul
21970 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e  tLabel[] = "Unkn
21980 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61  own Token";..sta
21990 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
219a0 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54  model[] = "CAC T
219b0 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63  oken";..struct c
219c0 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
219d0 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
219e0 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
219f0 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a  long num_certs;.
21a00 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72  .ssize_t label_r
21a10 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
21a20 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f  etval;..int use_
21a30 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a  default_label;..
21a40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21a50 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21a60 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
21a70 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
21a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21a90 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
21aa0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
21ab0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
21ac0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
21ad0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
21ae0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
21af0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21b00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
21b10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
21b20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
21b30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
21b40 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
21b50 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
21b60 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21b70 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21b80 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21b90 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21ba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21bb0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21bc0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21bd0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
21be0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
21bf0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
21c00 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
21c10 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
21c20 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21c30 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
21c40 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21c50 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21c60 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21c70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21c80 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21c90 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21ca0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21cb0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
21cc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21cd0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
21ce0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21cf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21d00 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21d10 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21d20 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
21d30 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
21d40 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
21d50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21d60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
21d70 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
21d80 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21d90 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
21da0 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
21db0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
21dc0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
21dd0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
21de0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21df0 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65  _PRINTF("No toke
21e00 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  n is present in 
21e10 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73  slotID = %lu", s
21e20 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
21e30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21e40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21e50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
21e60 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29  KEN_NOT_PRESENT)
21e70 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21e80 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21e90 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21ea0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
21eb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
21ec0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21ed0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21ee0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
21ef0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
21f00 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
21f10 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  RROR);..}.../* D
21f20 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c  etermine token l
21f30 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66  abel from certif
21f40 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65  icates */..memse
21f50 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  t(pInfo->label, 
21f60 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
21f70 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65  o->label));..use
21f80 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
21f90 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79   1;...if (cackey
21fa0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
21fb0 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  abel == NULL) {.
21fc0 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
21fd0 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
21fe0 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c  certs(&cackey_sl
21ff0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c  ots[slotID], NUL
22000 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
22010 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
22020 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
22030 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  ....if (num_cert
22040 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62  s > 0) {.....lab
22050 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  el_ret = cackey_
22060 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f  pcsc_identity_to
22070 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e  _label(pcsc_iden
22080 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c  tities, pInfo->l
22090 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
220a0 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
220b0 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e  .if (label_ret >
220c0 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64   0) {......use_d
220d0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
220e0 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
220f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
22100 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  el = malloc(size
22110 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
22120 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  );.......memcpy(
22130 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22140 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66  tID].label, pInf
22150 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  o->label, sizeof
22160 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
22170 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
22180 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
22190 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  s(pcsc_identitie
221a0 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29  s, num_certs, 1)
221b0 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
221c0 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
221d0 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c  label, cackey_sl
221e0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
221f0 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
22200 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65  >label));....use
22210 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
22220 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65   0;..}...if (use
22230 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20  _default_label) 
22240 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
22250 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74  ->label, default
22260 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65  Label, sizeof(de
22270 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29  faultLabel) - 1)
22280 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
22290 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
222a0 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
222b0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
222c0 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
222d0 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
222e0 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
222f0 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
22300 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
22310 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
22320 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27  Info->model, ' '
22330 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
22340 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79  model));..memcpy
22350 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d  (pInfo->model, m
22360 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64  odel, sizeof(mod
22370 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  el) - 1);...mems
22380 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  et(pInfo->serial
22390 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a  Number, ' ', siz
223a0 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  eof(pInfo->seria
223b0 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d  lNumber));...mem
223c0 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  set(pInfo->utcTi
223d0 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  me, ' ', sizeof(
223e0 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29  pInfo->utcTime))
223f0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
22400 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
22410 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
22420 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
22430 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
22440 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
22450 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
22460 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
22470 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
22480 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
22490 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
224a0 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
224b0 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
224c0 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0x00;...pInfo->
224d0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54  flags = CKF_WRIT
224e0 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b  E_PROTECTED | CK
224f0 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49  F_USER_PIN_INITI
22500 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b  ALIZED | CKF_TOK
22510 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  EN_INITIALIZED |
22520 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
22530 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
22540 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  s;...if (cackey_
22550 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e  pin_command != N
22560 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  ULL) {...pInfo->
22570 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f  flags |= CKF_PRO
22580 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43  TECTED_AUTHENTIC
22590 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a  ATION_PATH;..}..
225a0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73  .pInfo->ulMaxSes
225b0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a  sionCount = (siz
225c0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
225d0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
225e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
225f0 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e  )) - 1;..pInfo->
22600 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  ulSessionCount =
22610 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
22620 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
22630 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73  nfo->ulMaxRwSess
22640 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70  ionCount = 0;..p
22650 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f  Info->ulRwSessio
22660 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56  nCount = CK_UNAV
22670 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
22680 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ION;..pInfo->ulM
22690 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a  axPinLen = 128;.
226a0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e  .pInfo->ulMinPin
226b0 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  Len = 0;..pInfo-
226c0 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65  >ulTotalPublicMe
226d0 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
226e0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
226f0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
22700 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  ePublicMemory = 
22710 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
22720 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
22730 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61  fo->ulTotalPriva
22740 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
22750 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
22760 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
22770 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f  lFreePrivateMemo
22780 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
22790 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
227a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
227b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
227c0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
227d0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
227e0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
227f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22800 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f  (CK_RV, C_WaitFo
22810 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46  rSlotEvent)(CK_F
22820 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53  LAGS flags, CK_S
22830 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
22840 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ID, CK_VOID_PTR 
22850 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41  pReserved) {..CA
22860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22870 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22880 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
22890 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
228a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
228b0 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
228c0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
228d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
228e0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
228f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
22900 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22920 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22930 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22940 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22950 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22960 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22970 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d  /* XXX: TODO: Im
22980 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20  plement this... 
22990 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  */..CACKEY_DEBUG
229a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
229b0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
229c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
229d0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
229e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
229f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
22a00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22a10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
22a20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22a30 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e  _RV, C_GetMechan
22a40 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54  ismList)(CK_SLOT
22a50 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d  _ID slotID, CK_M
22a60 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54  ECHANISM_TYPE_PT
22a70 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  R pMechanismList
22a80 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
22a90 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
22aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22ab0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22ac0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22ad0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22ae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22af0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22b00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22b10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22b20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22b30 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
22b40 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
22b50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22b60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22b70 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
22b80 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
22b90 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
22ba0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
22bb0 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e  chanismList == N
22bc0 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
22bd0 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45  nt = 1;....CACKE
22be0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22bf0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
22c00 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
22c10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
22c20 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75  K);..}...if (*pu
22c30 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09  lCount < 1) {...
22c40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22c50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66  NTF("Error.  Buf
22c60 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29  fer too small.")
22c70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22c80 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
22c90 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69  );..}...pMechani
22ca0 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f  smList[0] = CKM_
22cb0 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43  RSA_PKCS;..*pulC
22cc0 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  ount = 1;...CACK
22cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22ce0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
22cf0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
22d00 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
22d10 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
22d20 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22d30 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
22d40 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
22d50 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
22d60 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20  NISM_TYPE type, 
22d70 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46  CK_MECHANISM_INF
22d80 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
22d90 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22da0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22db0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22dc0 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
22dd0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
22de0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22df0 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
22e00 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
22e10 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
22e20 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
22e30 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22e40 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22e60 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22e70 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22e80 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22e90 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22ea0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
22eb0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
22ec0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
22ed0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
22ee0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
22ef0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
22f00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22f10 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
22f20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
22f30 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
22f40 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
22f50 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
22f60 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
22f70 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
22f80 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22f90 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22fa0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22fb0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22fc0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22fd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22fe0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
22ff0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
23000 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
23010 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
23020 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
23030 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
23040 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
23050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23060 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
23070 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
23080 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
23090 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
230a0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
230b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
230c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
230d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
230e0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
230f0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
23100 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
23110 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23120 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
23130 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
23140 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23150 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23160 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
23170 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23180 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23190 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
231a0 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  (type) {...case 
231b0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
231c0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79  .pInfo->ulMinKey
231d0 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70  Size = 512;....p
231e0 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69  Info->ulMaxKeySi
231f0 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49  ze = 8192;....pI
23200 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
23210 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50  _HW | CKF_ENCRYP
23220 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20  T | CKF_DECRYPT 
23230 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46  | CKF_SIGN | CKF
23240 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61  _VERIFY;....brea
23250 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  k;..}...CACKEY_D
23260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23270 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
23280 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
23290 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
232a0 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
232b0 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
232c0 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
232d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
232e0 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b   C_InitToken)(CK
232f0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
23300 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
23310 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
23320 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ulPinLen, CK_UTF
23330 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c  8CHAR_PTR pLabel
23340 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
23350 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23360 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23370 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23380 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23390 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
233a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
233b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
233c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
233d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
233e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
233f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23400 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
23410 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
23420 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
23430 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
23440 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
23450 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
23460 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e  D);.}../* We don
23470 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20  't support this 
23480 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45  method. */.CK_DE
23490 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
234a0 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28  _RV, C_InitPIN)(
234b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
234c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
234d0 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
234e0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
234f0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
23500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23510 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23520 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23530 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23540 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23550 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
23560 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
23570 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
23580 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
23590 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
235a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
235b0 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
235c0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
235d0 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
235e0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
235f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
23600 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
23610 43 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  CTED);.}..CK_DEF
23620 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23630 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b  RV, C_SetPIN)(CK
23640 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
23650 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
23660 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69  8CHAR_PTR pOldPi
23670 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c  n, CK_ULONG ulOl
23680 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  dPinLen, CK_UTF8
23690 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e  CHAR_PTR pNewPin
236a0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77  , CK_ULONG ulNew
236b0 50 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20  PinLen) {..char 
236c0 6f 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e  oldpinbuf[64], n
236d0 65 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63  ewpinbuf[64];..c
236e0 61 63 6b 65 79 5f 72 65 74 20 73 65 74 5f 70 69  ackey_ret set_pi
236f0 6e 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72  n_ret, get_pin_r
23700 65 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  et;..CK_SLOT_ID 
23710 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
23720 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
23730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23740 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
23750 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
23760 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
23770 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23780 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
23790 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
237a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
237b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
237c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ZED);..}...mutex
237d0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
237e0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
237f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
23800 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
23810 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
23820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23830 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
23840 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23850 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23860 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
23870 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
23880 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
23890 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
238a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
238b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
238c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
238d0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
238e0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
238f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
23900 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
23910 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
23920 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
23930 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23940 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
23950 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
23960 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
23970 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
23980 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
23990 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
239a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
239b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
239c0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
239d0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
239e0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
239f0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
23a00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23a10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23a20 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
23a30 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
23a40 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
23a50 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
23a60 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
23a70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23a80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
23a90 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
23aa0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
23ab0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
23ac0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
23ad0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23ae0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23af0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
23b00 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23b10 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
23b20 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
23b30 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f  d != NULL) {.../
23b40 2a 20 47 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f  * Get old PIN */
23b50 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d  ...get_pin_ret =
23b60 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28   cackey_get_pin(
23b70 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69  oldpinbuf);....i
23b80 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21  f (get_pin_ret !
23b90 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
23ba0 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
23bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23bc0 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74 69 6e  ror while gettin
23bd0 67 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74 75 72  g Old PIN, retur
23be0 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43  ning CKR_PIN_INC
23bf0 4f 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63  ORRECT.");.....c
23c00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23c10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23c20 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 75 72  k);........retur
23c30 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
23c40 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c  ECT);...}....pOl
23c50 64 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43  dPin = (CK_UTF8C
23c60 48 41 52 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62  HAR_PTR) oldpinb
23c70 75 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65  uf;...ulOldPinLe
23c80 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69  n = strlen(oldpi
23c90 6e 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74  nbuf);..../* Get
23ca0 20 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65   new PIN */...ge
23cb0 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  t_pin_ret = cack
23cc0 65 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77 70 69  ey_get_pin(newpi
23cd0 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65  nbuf);....if (ge
23ce0 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  t_pin_ret != CAC
23cf0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
23d00 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23d10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 20 77  _PRINTF("Error w
23d20 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4e 65 77  hile getting New
23d30 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20   PIN, returning 
23d40 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e  CKR_PIN_INVALID.
23d50 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d  ");.....cackey_m
23d60 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23d70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
23d80 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
23d90 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d  IN_INVALID);...}
23da0 0a 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20 28 43  ....pNewPin = (C
23db0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 20  K_UTF8CHAR_PTR) 
23dc0 6e 65 77 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e  newpinbuf;...ulN
23dd0 65 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ewPinLen = strle
23de0 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d  n(newpinbuf);..}
23df0 0a 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d  ...if (pOldPin =
23e00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
23e10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23e20 22 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65 20 69  "Old PIN value i
23e30 73 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22  s wrong (null)."
23e40 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
23e50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23e60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
23e70 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
23e80 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66  ORRECT);..}...if
23e90 20 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d   (ulOldPinLen ==
23ea0 20 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65   0 || ulOldPinLe
23eb0 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45  n > 8) {...CACKE
23ec0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23ed0 4f 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68 20 69  Old PIN length i
23ee0 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20  s wrong: %lu.", 
23ef0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
23f00 75 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulOldPinLen);...
23f10 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23f20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23f30 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
23f40 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
23f50 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65  T);..}...if (pNe
23f60 77 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  wPin == NULL) {.
23f70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23f80 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e 20 76  RINTF("New PIN v
23f90 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 28 65  alue is wrong (e
23fa0 69 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74  ither NULL, or t
23fb0 6f 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22  oo long/short)."
23fc0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
23fd0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23fe0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
23ff0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56  turn(CKR_PIN_INV
24000 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
24010 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20  ulNewPinLen < 5 
24020 7c 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e  || ulNewPinLen >
24030 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   8) {...CACKEY_D
24040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 77  EBUG_PRINTF("New
24050 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77   PIN length is w
24060 72 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20  rong: %lu, must 
24070 62 65 20 61 74 6c 65 61 73 74 20 35 20 61 6e 64  be atleast 5 and
24080 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e   no more than 8.
24090 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
240a0 67 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b  g) ulNewPinLen);
240b0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
240c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
240d0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
240e0 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52  rn(CKR_PIN_LEN_R
240f0 41 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f  ANGE);..}...set_
24100 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  pin_ret = cackey
24110 5f 73 65 74 5f 70 69 6e 28 26 63 61 63 6b 65 79  _set_pin(&cackey
24120 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
24130 70 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69  pOldPin, ulOldPi
24140 6e 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75  nLen, pNewPin, u
24150 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69  lNewPinLen);...i
24160 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 21  f (set_pin_ret !
24170 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
24180 4f 4b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  OK) {...if (cack
24190 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
241a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63  = NULL) {....cac
241b0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
241c0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
241d0 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
241e0 52 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  RED;...}....if (
241f0 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43  set_pin_ret == C
24200 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
24210 4b 45 44 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  KED) {....cackey
24220 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
24230 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
24240 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45  F_USER_PIN_LOCKE
24250 44 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  D;...}..}...mute
24260 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
24270 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
24280 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24290 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
242a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
242b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
242c0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
242d0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
242e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
242f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
24300 09 73 77 69 74 63 68 20 28 73 65 74 5f 70 69 6e  .switch (set_pin
24310 5f 72 65 74 29 20 7b 0a 09 09 63 61 73 65 20 43  _ret) {...case C
24320 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a  ACKEY_PCSC_S_OK:
24330 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
24340 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
24350 66 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e 22 29  fully set PIN.")
24360 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
24370 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43 41 43  _OK);...case CAC
24380 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
24390 4e 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  N:....CACKEY_DEB
243a0 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 77  UG_PRINTF("PIN w
243b0 61 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a  as invalid.");..
243c0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
243d0 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61  N_INVALID);...ca
243e0 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  se CACKEY_PCSC_E
243f0 5f 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b  _LOCKED:....CACK
24400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24410 22 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64  "Token is locked
24420 20 6f 72 20 74 68 69 73 20 63 68 61 6e 67 65 20   or this change 
24430 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
24440 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
24450 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
24460 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43  ...default:....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 53 6f 6d 65 74 68 69 6e 67 20 65 6c  TF("Something el
24490 73 65 20 77 65 6e 74 20 77 72 6f 6e 67 20 63 68  se went wrong ch
244a0 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e 3a 20  anging the PIN: 
244b0 25 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74  %i", set_pin_ret
244c0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
244d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
244e0 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ;..}...return(CK
244f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
24500 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
24510 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
24520 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b  _OpenSession)(CK
24530 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
24540 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c   CK_FLAGS flags,
24550 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70   CK_VOID_PTR pAp
24560 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f  plication, CK_NO
24570 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f  TIFY notify, CK_
24580 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50  SESSION_HANDLE_P
24590 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a  TR phSession) {.
245a0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
245b0 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
245c0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e  etval;..int foun
245d0 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a  d_session = 0;..
245e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
245f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24600 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20  ...if ((flags & 
24610 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49  CKF_SERIAL_SESSI
24620 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41  ON) != CKF_SERIA
24630 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72  L_SESSION) {...r
24640 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
24650 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53  N_PARALLEL_NOT_S
24660 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09  UPPORTED);..}...
24670 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24680 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24690 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
246a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
246b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
246c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
246d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
246e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
246f0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
24700 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
24710 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
24720 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
24730 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
24740 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24750 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
24760 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
24770 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
24780 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
24790 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
247a0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
247b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
247c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
247d0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
247e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
247f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
24800 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
24810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24820 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
24830 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
24840 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24850 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
24860 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
24870 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
24880 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
24890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
248a0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
248b0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
248c0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
248d0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
248e0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
248f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24900 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24910 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
24920 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
24930 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
24940 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73  that the card is
24950 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65   actually in the
24960 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58   slot. */../* XX
24970 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  X: Check to make
24980 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e   sure this is in
24990 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65   the PKCS#11 spe
249a0 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69  cification */..i
249b0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
249c0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
249d0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
249e0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
249f0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
24a00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24a10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43  RINTF("Error.  C
24a20 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e  ard not present.
24a30 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f    Returning CKR_
24a40 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29  DEVICE_REMOVED")
24a50 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
24a60 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
24a70 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
24a80 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52  urn(CKR_DEVICE_R
24a90 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f  EMOVED);..}...fo
24aa0 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20  r (idx = 1; idx 
24ab0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
24ac0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
24ad0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
24ae0 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
24af0 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
24b00 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
24b10 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e  ctive) {....foun
24b20 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a  d_session = 1;..
24b30 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20  ...*phSession = 
24b40 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  idx;.....cackey_
24b50 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
24b60 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63  tive = 1;....cac
24b70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
24b80 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49  ].slotID = slotI
24b90 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  D;....cackey_ses
24ba0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65  sions[idx].state
24bb0 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
24bc0 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63  _SESSION;....cac
24bd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
24be0 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ].flags = flags;
24bf0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24c00 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63  ons[idx].ulDevic
24c10 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63  eError = 0;....c
24c20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
24c30 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e  dx].pApplication
24c40 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b   = pApplication;
24c50 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24c60 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20  ons[idx].Notify 
24c70 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61  = notify;.....ca
24c80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
24c90 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  x].identities = 
24ca0 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f  NULL;....cackey_
24cb0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
24cc0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
24cd0 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
24ce0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61  essions[idx].sea
24cf0 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
24d00 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24d10 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63  ons[idx].sign_ac
24d20 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
24d30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
24d40 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  x].decrypt_activ
24d50 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
24d60 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24d70 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
24d80 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
24d90 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
24da0 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
24db0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
24dc0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
24dd0 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  t);......break;.
24de0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
24df0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
24e00 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24e10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24e20 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24e30 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24e40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24e50 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
24e60 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
24e70 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24e80 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
24e90 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e   (!found_session
24ea0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24eb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24ec0 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e  ning CKR_SESSION
24ed0 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b  _COUNT (%i)", CK
24ee0 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
24ef0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24f00 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
24f10 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24f20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24f30 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
24f40 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
24f50 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
24f60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24f70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
24f80 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53  eSession)(CK_SES
24f90 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24fa0 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  sion) {..int mut
24fb0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
24fc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24fd0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24fe0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24ff0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25000 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25010 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25020 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25030 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25040 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25050 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
25060 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
25070 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
25080 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
25090 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
250a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
250b0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
250c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
250d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
250e0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
250f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
25100 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
25110 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
25120 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25130 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
25140 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25150 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25160 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
25170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25180 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
25190 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
251a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
251b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
251c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
251d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
251e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
251f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25200 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
25230 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
25240 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
25250 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
25260 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
25270 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
25280 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
25290 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f  ve = 0;..cackey_
252a0 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28  free_identities(
252b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
252c0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
252d0 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73  ties, cackey_ses
252e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
252f0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
25300 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
25310 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
25320 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25330 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
25340 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
25350 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25360 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25370 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
25380 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25390 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
253a0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
253b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
253c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
253d0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
253e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
253f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
25400 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
25410 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
25420 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  s)(CK_SLOT_ID sl
25430 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f  otID) {..uint32_
25440 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t idx;..int mute
25450 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
25460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25470 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25480 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25490 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
254a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
254b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
254c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
254d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
254e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
254f0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
25500 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
25510 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
25520 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
25530 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
25540 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
25550 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25560 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
25570 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
25580 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
25590 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
255a0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
255b0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
255c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
255d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
255e0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
255f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
25600 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
25610 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
25620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25630 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
25640 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
25650 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
25660 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
25670 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
25680 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
25690 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
256a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
256b0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
256c0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
256d0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
256e0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
256f0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
25700 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25710 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25720 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
25730 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
25740 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
25750 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
25760 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
25770 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
25780 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
25790 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
257a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
257b0 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
257c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
257d0 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
257e0 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09   != slotID) {...
257f0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
25800 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
25810 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25820 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43  biglock);....C_C
25830 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
25840 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
25850 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
25860 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  glock);...}..}..
25870 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
25880 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25890 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
258a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
258b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
258c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
258d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
258e0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
258f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25900 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25910 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
25920 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25930 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
25940 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
25950 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
25960 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25970 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
25980 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f  SessionInfo)(CK_
25990 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
259a0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53  Session, CK_SESS
259b0 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  ION_INFO_PTR pIn
259c0 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  fo) {..int mutex
259d0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
259e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
259f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
25a00 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
25a10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25a20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25a30 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
25a40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25a50 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
25a60 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
25a70 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
25a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25a90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
25aa0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
25ab0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25ac0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25ad0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25ae0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
25af0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
25b00 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
25b10 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
25b20 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
25b30 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
25b40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25b50 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
25b60 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
25b70 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
25b80 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
25b90 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
25ba0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
25bb0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
25bc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25bd0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
25be0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
25bf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25c00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
25c10 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
25c20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25c30 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
25c40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
25c50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25c60 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
25c70 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25c80 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25c90 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
25ca0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25cb0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
25cc0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
25cd0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
25ce0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
25cf0 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73  );..}...pInfo->s
25d00 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
25d10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25d20 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f  ].slotID;..pInfo
25d30 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79  ->state = cackey
25d40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25d50 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66  on].state;..pInf
25d60 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65  o->flags = cacke
25d70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25d80 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e  ion].flags;..pIn
25d90 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f  fo->ulDeviceErro
25da0 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  r = cackey_sessi
25db0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c  ons[hSession].ul
25dc0 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d  DeviceError;...m
25dd0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
25de0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25df0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25e00 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25e10 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
25e20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25e30 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
25e40 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
25e50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
25e60 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
25e70 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25e80 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25e90 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
25ea0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
25eb0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
25ec0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25ed0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70  N(CK_RV, C_GetOp
25ee0 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
25ef0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
25f00 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
25f10 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
25f20 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  State, CK_ULONG_
25f30 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e  PTR pulOperation
25f40 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43  StateLen) {..CAC
25f50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25f60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25f70 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25f80 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25f90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25fa0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25fb0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25fc0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25fd0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25fe0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
25ff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26000 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
26010 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26020 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
26030 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26040 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
26050 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
26060 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
26070 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26080 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
26090 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29  tOperationState)
260a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
260b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
260c0 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74  BYTE_PTR pOperat
260d0 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f  ionState, CK_ULO
260e0 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  NG ulOperationSt
260f0 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ateLen, CK_OBJEC
26100 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70  T_HANDLE hEncryp
26110 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  tionKey, CK_OBJE
26120 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65  CT_HANDLE hAuthe
26130 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a  nticationKey) {.
26140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26150 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
26160 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
26170 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
26180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26190 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
261a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
261b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
261c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
261d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
261e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
261f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26200 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26210 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
26220 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26230 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
26240 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
26250 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26260 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26270 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26280 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67  _C_LoginMutexArg
26290 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
262a0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
262b0 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54  _USER_TYPE userT
262c0 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ype, CK_UTF8CHAR
262d0 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
262e0 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e  ONG ulPinLen, in
262f0 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a  t lock_mutex) {.
26300 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
26310 49 44 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ID;..cackey_ret 
26320 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 63 68  get_pin_ret;..ch
26330 61 72 20 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09  ar pinbuf[64];..
26340 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
26350 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
26360 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67  aining;..int log
26370 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  in_ret;...CACKEY
26380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
26390 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
263a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
263b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
263c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
263d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
263e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
263f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26400 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26410 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
26420 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
26430 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
26440 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26450 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
26460 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
26470 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26480 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26490 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
264a0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
264b0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
264c0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
264d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  D);..}...if (use
264e0 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45  rType != CKU_USE
264f0 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  R) {...CACKEY_DE
26500 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26510 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  r.  We only supp
26520 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61  ort USER mode, a
26530 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64  sked for %lu mod
26540 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  e.", (unsigned l
26550 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a  ong) userType)..
26560 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45  ..return(CKR_USE
26570 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b  R_TYPE_INVALID);
26580 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d  ..}...if (lock_m
26590 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f  utex) {...mutex_
265a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
265b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
265c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66  y_biglock);...if
265d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
265e0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
265f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26600 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
26610 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
26620 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26630 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a  _ERROR);...}..}.
26640 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
26650 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26660 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 69 66 20  .active) {...if 
26670 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
26680 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26690 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
266a0 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  lock);...}....CA
266b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
266c0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
266d0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
266e0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
266f0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
26700 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
26710 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
26720 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26730 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
26740 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
26750 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
26760 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
26770 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
26780 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
26790 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
267a0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
267b0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
267c0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
267d0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
267e0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66  , slotID);....if
267f0 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
26800 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
26810 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26820 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72  glock);...}....r
26830 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
26840 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
26850 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
26860 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
26870 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
26880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26890 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
268a0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
268b0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
268c0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
268d0 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c  lotID);....if (l
268e0 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
268f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26900 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26910 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ck);...}....retu
26920 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
26930 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
26940 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
26950 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
26960 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c  if (pPin != NULL
26970 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
26980 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74  BUG_PRINTF("Prot
26990 65 63 74 65 64 20 61 75 74 68 65 6e 74 69 63 61  ected authentica
269a0 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66  tion path in eff
269b0 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76  ect and PIN prov
269c0 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a  ided !?");...}..
269d0 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20  ..get_pin_ret = 
269e0 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 70  cackey_get_pin(p
269f0 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67  inbuf);....if (g
26a00 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41  et_pin_ret != CA
26a10 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
26a20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
26a30 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
26a40 5f 67 65 74 5f 70 69 6e 28 29 20 72 65 74 75 72  _get_pin() retur
26a50 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ned in failure, 
26a60 61 73 73 75 6d 69 6e 67 20 74 68 65 20 50 49 4e  assuming the PIN
26a70 20 77 61 73 20 69 6e 63 6f 72 72 65 63 74 2e 22   was incorrect."
26a80 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f  );.....if (lock_
26a90 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63  mutex) {.....cac
26aa0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26ab0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26ac0 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
26ad0 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
26ae0 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 50 69  ECT);...}....pPi
26af0 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
26b00 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09  _PTR) pinbuf;...
26b10 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ulPinLen = strle
26b20 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  n(pinbuf);..}...
26b30 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  login_ret = cack
26b40 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79  ey_login(&cackey
26b50 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
26b60 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
26b70 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  &tries_remaining
26b80 2c 20 33 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e  , 3);..if (login
26b90 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
26ba0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
26bb0 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
26bc0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
26bd0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26be0 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69  glock);...}....i
26bf0 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
26c00 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
26c10 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CKED) {....CACKE
26c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26c30 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73  Error.  Token is
26c40 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09   locked.");.....
26c50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
26c60 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
26c70 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
26c80 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43  _LOCKED;.....CAC
26c90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26ca0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26cb0 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22  PIN_LOCKED (%i)"
26cc0 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f  , (int) CKR_PIN_
26cd0 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74  LOCKED);.....ret
26ce0 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  urn(CKR_PIN_LOCK
26cf0 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  ED);...} else if
26d00 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
26d10 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
26d20 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  PIN) {....CACKEY
26d30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26d40 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50  rror.  Invalid P
26d50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  IN.");.....cacke
26d60 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
26d70 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
26d80 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
26d90 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74  T_LOW;.....if (t
26da0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
26db0 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  = 1) {.....cacke
26dc0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
26dd0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
26de0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
26df0 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09  L_TRY;....}.....
26e00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26e10 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26e20 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
26e30 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b   (%i)", (int) CK
26e40 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
26e50 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
26e60 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
26e70 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
26e80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26e90 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72  or.  Unknown err
26ea0 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  or returned from
26eb0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20   cackey_login() 
26ec0 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74  (%i)", login_ret
26ed0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26ee0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
26ef0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
26f00 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
26f10 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f  _flags &= ~(CKF_
26f20 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20  USER_PIN_LOCKED 
26f30 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  | CKF_USER_PIN_C
26f40 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c  OUNT_LOW | CKF_L
26f50 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20  OGIN_REQUIRED | 
26f60 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
26f70 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65  AL_TRY);...cacke
26f80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26f90 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
26fa0 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f  _RO_USER_FUNCTIO
26fb0 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d  NS;...if (lock_m
26fc0 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f  utex) {...mutex_
26fd0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
26fe0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26ff0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
27000 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
27010 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
27020 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27030 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
27040 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27050 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
27060 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  ERAL_ERROR);...}
27070 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
27080 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
27090 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
270a0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
270b0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
270c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
270d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67  ION(CK_RV, C_Log
270e0 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  in)(CK_SESSION_H
270f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
27100 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65  CK_USER_TYPE use
27110 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48  rType, CK_UTF8CH
27120 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
27130 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
27140 7b 0a 09 72 65 74 75 72 6e 28 5f 43 5f 4c 6f 67  {..return(_C_Log
27150 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73  inMutexArg(hSess
27160 69 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c 20 70  ion, userType, p
27170 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31  Pin, ulPinLen, 1
27180 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  ));.}..CK_DEFINE
27190 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
271a0 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45   C_Logout)(CK_SE
271b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
271c0 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f  ssion) {..CK_SLO
271d0 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e  T_ID slotID;..in
271e0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
271f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27200 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27210 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27220 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27230 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27240 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27250 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27260 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27270 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27280 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27290 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
272a0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
272b0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
272c0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
272d0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
272e0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
272f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27300 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27310 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
27320 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27330 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
27340 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27350 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
27360 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
27370 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
27380 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
27390 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
273a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
273b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
273c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
273d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
273e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
273f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
27400 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27410 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
27420 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27430 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27440 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
27450 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27460 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
27470 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
27480 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
27490 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
274a0 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
274b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
274c0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
274d0 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
274e0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
274f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
27500 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
27510 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
27520 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27530 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27540 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
27550 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
27560 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
27570 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
27580 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27590 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
275a0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
275b0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
275c0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
275d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
275e0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
275f0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
27600 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
27610 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
27620 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
27630 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27640 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27650 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
27660 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
27670 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  R);..}...cackey_
27680 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27690 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  n].state = CKS_R
276a0 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e  O_PUBLIC_SESSION
276b0 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
276c0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55  in_command == NU
276d0 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  LL) {...cackey_s
276e0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
276f0 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
27700 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09  OGIN_REQUIRED;..
27710 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65  } else {...cacke
27720 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
27730 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
27740 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
27750 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
27760 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27770 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
27780 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
27790 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
277a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
277b0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
277c0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
277d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
277e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
277f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27800 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
27810 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
27820 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
27830 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
27840 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
27850 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28  C_CreateObject)(
27860 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27870 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41  E hSession, CK_A
27880 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
27890 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
278a0 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
278b0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
278c0 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
278d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
278e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
278f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
27900 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
27910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27920 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
27930 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
27940 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
27950 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
27960 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
27970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
27980 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning 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 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
279b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
279c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
279d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
279e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
279f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27a00 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70  ION(CK_RV, C_Cop
27a10 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  yObject)(CK_SESS
27a20 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27a30 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
27a40 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
27a50 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
27a60 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
27a70 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
27a80 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
27a90 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b  R phNewObject) {
27aa0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27ab0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27ac0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27ad0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27ae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27af0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27b00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27b10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27b20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27b30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27b40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27b50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27b60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27b70 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
27b80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27b90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
27ba0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
27bb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27bc0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
27bd0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27be0 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74   C_DestroyObject
27bf0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27c00 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27c10 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
27c20 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
27c30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27c40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
27c50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
27c60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
27c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27c80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
27c90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
27ca0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
27cb0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
27cc0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
27cd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27ce0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
27cf0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27d00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
27d10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27d20 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
27d30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27d40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
27d50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27d60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
27d70 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45  bjectSize)(CK_SE
27d80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27d90 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
27da0 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
27db0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
27dc0 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59  lSize) {..CACKEY
27dd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27de0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27df0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27e00 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27e10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27e20 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
27e30 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
27e40 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27e50 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27e60 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
27e70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27e80 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
27e90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27ea0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
27eb0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27ec0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
27ed0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27ee0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
27ef0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27f00 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74  N(CK_RV, C_GetAt
27f10 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b  tributeValue)(CK
27f20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
27f30 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
27f40 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
27f50 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
27f60 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
27f70 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
27f80 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ) {..CK_ATTRIBUT
27f90 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73  E *curr_attr;..s
27fa0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
27fb0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b  ntity *identity;
27fc0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
27fd0 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74  identity_idx, at
27fe0 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74  tr_idx, sess_att
27ff0 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a  r_idx, num_ids;.
28000 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
28010 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  l;..CK_RV retval
28020 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56   = CKR_OK;..CK_V
28030 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a  OID_PTR pValue;.
28040 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75  .CK_ULONG ulValu
28050 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  eLen;...CACKEY_D
28060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
28070 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
28080 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
28090 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
280a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
280b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
280c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
280d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
280e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
280f0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
28100 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
28110 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
28120 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
28130 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
28140 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
28150 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28160 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28170 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
28180 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
28190 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
281a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
281b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65  ;..}...if (hObje
281c0 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ct == 0) {...CAC
281d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
281e0 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74  ("Error.  Object
281f0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
28200 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
28210 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f  turn(CKR_OBJECT_
28220 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
28230 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e  ..}...if (ulCoun
28240 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  t == 0) {.../* S
28250 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66  hort circuit, if
28260 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65   zero objects we
28270 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74  re specified ret
28280 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69  urn zero items i
28290 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09  mmediately */...
282a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
282b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
282c0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
282d0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
282e0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
282f0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
28300 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e   (pTemplate == N
28310 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
28320 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28330 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20  ror.  pTemplate 
28340 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
28350 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
28360 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
28370 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f  dentity_idx = hO
28380 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74  bject - 1;...mut
28390 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
283a0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
283b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
283c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
283d0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
283e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
283f0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
28400 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
28410 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28420 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
28430 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
28440 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
28450 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
28460 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28470 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
28480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
284a0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
284b0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
284c0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
284d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
284e0 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63  ...num_ids = cac
284f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28500 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
28510 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69  s_count;...if (i
28520 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e  dentity_idx >= n
28530 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b  um_ids) {...cack
28540 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28550 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28560 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28570 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28580 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f   Object handle o
28590 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64  ut of range.  id
285a0 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75  entity_idx = %lu
285b0 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e  , num_ids = %lu.
285c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
285d0 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c  g) identity_idx,
285e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
285f0 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65   num_ids);....re
28600 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f  turn(CKR_OBJECT_
28610 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
28620 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d  ..}...identity =
28630 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
28640 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
28650 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f  tities[identity_
28660 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74  idx];...for (att
28670 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f  r_idx = 0; attr_
28680 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61  idx < ulCount; a
28690 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63  ttr_idx++) {...c
286a0 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d  urr_attr = &pTem
286b0 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b  plate[attr_idx];
286c0 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
286d0 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  L;...ulValueLen 
286e0 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
286f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28700 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20  PRINTF("Looking 
28710 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78  for attribute 0x
28720 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a  %08lx (identity:
28730 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  %lu) ...", (unsi
28740 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
28750 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73  attr->type, (uns
28760 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e  igned long) iden
28770 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f  tity_idx);....fo
28780 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
28790 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
287a0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e  idx < identity->
287b0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
287c0 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b  ; sess_attr_idx+
287d0 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e  +) {....if (iden
287e0 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
287f0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
28800 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74  type == curr_att
28810 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43  r->type) {.....C
28820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28830 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69  TF(" ... found i
28840 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20  t, pValue = %p, 
28850 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75  ulValueLen = %lu
28860 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  ", identity->att
28870 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
28880 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69  r_idx].pValue, i
28890 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
288a0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
288b0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
288c0 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20  .........pValue 
288d0 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  = identity->attr
288e0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
288f0 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09  _idx].pValue;...
28900 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69  ..ulValueLen = i
28910 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
28920 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
28930 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  x].ulValueLen;..
28940 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63  ..}...}....if (c
28950 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
28960 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09   && pValue) {...
28970 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
28980 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c  ulValueLen >= ul
28990 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09  ValueLen) {.....
289a0 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72  memcpy(curr_attr
289b0 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65  ->pValue, pValue
289c0 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  , ulValueLen);..
289d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75  ..} else {.....u
289e0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
289f0 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72  LONG) -1;......r
28a00 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
28a10 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
28a20 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61  .}...}....curr_a
28a30 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
28a40 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d  = ulValueLen;..}
28a50 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
28a60 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
28a70 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28a80 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
28a90 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
28aa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28ab0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28ac0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
28ad0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
28ae0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
28af0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76  );..}...if (retv
28b00 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42  al == CKR_ATTRIB
28b10 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
28b20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28b30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28b40 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55  ning CKR_ATTRIBU
28b50 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20  TE_TYPE_INVALID 
28b60 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
28b70 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66  val);..} else if
28b80 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f   (retval == CKR_
28b90 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
28ba0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28bb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28bc0 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f  ning CKR_BUFFER_
28bd0 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c  TOO_SMALL (%i)",
28be0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
28bf0 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76  .} else if (retv
28c00 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al == CKR_OK) {.
28c10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28c20 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28c30 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28   CKR_OK (%i)", (
28c40 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
28c50 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59   else {...CACKEY
28c60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
28c70 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
28c80 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a  nt) retval);..}.
28c90 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
28ca0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
28cb0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
28cc0 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
28cd0 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ue)(CK_SESSION_H
28ce0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28cf0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
28d00 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
28d10 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
28d20 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
28d30 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45  lCount) {..CACKE
28d40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28d50 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
28d60 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28d70 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28d80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28d90 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
28da0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
28db0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28dc0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28dd0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
28de0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
28df0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
28e00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28e10 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
28e20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28e30 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
28e40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28e50 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
28e60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
28e70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
28e80 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f  ObjectsInit)(CK_
28e90 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
28ea0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52  Session, CK_ATTR
28eb0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
28ec0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
28ed0 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f  Count) {..CK_SLO
28ee0 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b  T_ID slotID;..CK
28ef0 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74  _ULONG idx;..int
28f00 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
28f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28f20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
28f30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
28f40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
28f50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28f60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
28f70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
28f80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
28f90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
28fa0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
28fb0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
28fc0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
28fd0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
28fe0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
28ff0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
29000 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
29010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29020 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
29030 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
29040 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
29050 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
29060 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
29070 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
29080 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
29090 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
290a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
290b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
290c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
290d0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
290e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
290f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
29100 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
29110 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
29120 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29130 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
29140 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
29150 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
29160 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
29170 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29180 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
29190 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
291a0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
291b0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
291c0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
291d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
291e0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
291f0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
29200 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29210 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
29220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29230 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
29240 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  ch already activ
29250 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29260 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
29270 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c  ACTIVE);..}...sl
29280 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
29290 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
292a0 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
292b0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
292c0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
292d0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
292e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
292f0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
29300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29310 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
29320 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
29330 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
29340 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
29350 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
29360 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29370 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
29380 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
29390 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
293a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
293b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
293c0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
293d0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
293e0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
293f0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
29400 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
29410 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
29420 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
29430 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
29440 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
29450 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
29460 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65  [slotID].slot_re
29470 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  set) {...CACKEY_
29480 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68  DEBUG_PRINTF("Th
29490 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20  e slot has been 
294a0 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c  reset since we l
294b0 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69  ast looked for i
294c0 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73  dentities -- res
294d0 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66  canning");....if
294e0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
294f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
29500 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
29510 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  {....cackey_free
29520 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b  _identities(cack
29530 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29540 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
29550 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
29560 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
29570 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
29580 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29590 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
295a0 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
295b0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
295c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
295d0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20  ntities_count = 
295e0 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61  0;...}....if (ca
295f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
29600 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c  D].label != NULL
29610 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
29620 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
29630 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b  .label);....cack
29640 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
29650 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  .label = NULL;..
29660 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  .}....cackey_mar
29670 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61  k_slot_reset(&ca
29680 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
29690 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  D]);...cackey_sl
296a0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74  ots[slotID].slot
296b0 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a  _reset = 0;..}..
296c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
296d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
296e0 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
296f0 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  L) {...cackey_se
29700 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29710 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
29720 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
29730 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
29740 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  ts[slotID], &cac
29750 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29760 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
29770 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69  s_count);..}...i
29780 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20  f (pTemplate != 
29790 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c  NULL) {...if (ul
297a0 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
297b0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
297c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
297d0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
297e0 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b  ulCount;....cack
297f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29800 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
29810 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f  ry = malloc(ulCo
29820 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54  unt * sizeof(*pT
29830 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d  emplate));.....m
29840 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
29850 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29860 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54  search_query, pT
29870 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74  emplate, ulCount
29880 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70   * sizeof(*pTemp
29890 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28  late));....for (
298a0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75  idx = 0; idx < u
298b0 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b  lCount; idx++) {
298c0 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61  .....if (pTempla
298d0 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
298e0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09  en == 0) {......
298f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29900 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
29910 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
29920 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  ue = NULL;......
29930 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d  .continue;.....}
29940 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ......cackey_ses
29950 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29960 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
29970 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f  ].pValue = mallo
29980 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  c(pTemplate[idx]
29990 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
299a0 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
299b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
299c0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
299d0 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  x].pValue) {....
299e0 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
299f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29a00 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
29a10 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65  idx].pValue, pTe
29a20 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c  mplate[idx].pVal
29a30 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64  ue, pTemplate[id
29a40 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
29a50 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65  ....}....}...} e
29a60 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  lse {....cackey_
29a70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29a80 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
29a90 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61  count = 0;....ca
29aa0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29ab0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
29ac0 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  uery = NULL;...}
29ad0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
29ae0 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b  (ulCount != 0) {
29af0 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
29b00 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29b10 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43  iglock);.....CAC
29b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29b30 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
29b40 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64   query specified
29b50 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75   as NULL, but nu
29b60 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65  mber of query te
29b70 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65  rms not specifie
29b80 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72  d as 0.");.....r
29b90 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
29ba0 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09  NTS_BAD);...}...
29bb0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
29bc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
29bd0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
29be0 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  0;...cackey_sess
29bf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29c00 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55  earch_query = NU
29c10 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  LL;..}...cackey_
29c20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29c30 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
29c40 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65   = 1;..cackey_se
29c50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29c60 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20  .search_curr_id 
29c70 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  = 0;...mutex_ret
29c80 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
29c90 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
29ca0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
29cb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
29cc0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
29cd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29ce0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
29cf0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
29d00 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29d10 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
29d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29d30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
29d40 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
29d50 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
29d60 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  K);.}..static in
29d70 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f  t cackey_pkcs11_
29d80 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74  compare_attribut
29d90 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20  es(CK_ATTRIBUTE 
29da0 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  *a, CK_ATTRIBUTE
29db0 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64   *b) {..unsigned
29dc0 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c   char *smallbuf,
29dd0 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a   *largebuf;..siz
29de0 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  e_t smallbuf_len
29df0 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a  , largebuf_len;.
29e00 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d  ..if (a->type !=
29e10 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65   b->type) {...re
29e20 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41  turn(0);..}...CA
29e30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29e40 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64  F("    ... found
29e50 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e   matching type .
29e60 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ..");...CACKEY_D
29e70 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
29e80 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65     ... our value
29e90 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61  :", a->pValue, a
29ea0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ->ulValueLen);..
29eb0 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d  .if (b->pValue =
29ec0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
29ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29ee0 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
29ef0 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68  d wildcard match
29f00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29  ");....return(1)
29f10 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56  ;..}...if (a->pV
29f20 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  alue == NULL) {.
29f30 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
29f40 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75  . .if (b->ulValu
29f50 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c  eLen == a->ulVal
29f60 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28  ueLen && memcmp(
29f70 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56  a->pValue, b->pV
29f80 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65  alue, b->ulValue
29f90 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43  Len) == 0) {...C
29fa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29fb0 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
29fc0 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68  ound exact match
29fd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29  ");....return(1)
29fe0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61  ;..}...switch (a
29ff0 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  ->type) {...case
2a000 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09   CKA_MODULUS:...
2a010 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c  .if (a->ulValueL
2a020 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65  en == b->ulValue
2a030 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  Len) {.....break
2a040 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61  ;....}.....if (a
2a050 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62  ->ulValueLen > b
2a060 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a  ->ulValueLen) {.
2a070 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62  ....smallbuf = b
2a080 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d  ->pValue;.....sm
2a090 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e  allbuf_len = b->
2a0a0 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
2a0b0 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70  .largebuf = a->p
2a0c0 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65  Value;.....large
2a0d0 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56  buf_len = a->ulV
2a0e0 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c  alueLen;....} el
2a0f0 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  se {.....smallbu
2a100 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = a->pValue;..
2a110 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20  ...smallbuf_len 
2a120 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = a->ulValueLen;
2a130 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d  ......largebuf =
2a140 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   b->pValue;.....
2a150 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62  largebuf_len = b
2a160 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ->ulValueLen;...
2a170 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61  .}.....for (; la
2a180 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d  rgebuf_len != sm
2a190 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67  allbuf_len; larg
2a1a0 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f  ebuf++,largebuf_
2a1b0 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20  len--) {.....if 
2a1c0 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20  (largebuf[0] != 
2a1d0 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b  0) {......break;
2a1e0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
2a1f0 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e  if (largebuf_len
2a200 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e   != smallbuf_len
2a210 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
2a220 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63  ..}.....if (memc
2a230 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61  mp(largebuf, sma
2a240 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f  llbuf, smallbuf_
2a250 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  len) == 0) {....
2a260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a270 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
2a280 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61   found approxima
2a290 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09  te match");.....
2a2a0 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d  .return(1);....}
2a2b0 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
2a2c0 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43  .return(0);.}..C
2a2d0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a2e0 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
2a2f0 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49  bjects)(CK_SESSI
2a300 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2a310 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
2a320 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63  NDLE_PTR phObjec
2a330 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61  t, CK_ULONG ulMa
2a340 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b  xObjectCount, CK
2a350 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62  _ULONG_PTR pulOb
2a360 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74  jectCount) {..st
2a370 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
2a380 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09  tity *curr_id;..
2a390 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
2a3a0 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f  rr_attr;..CK_ULO
2a3b0 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20  NG curr_id_idx, 
2a3c0 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c  curr_out_id_idx,
2a3d0 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20   curr_attr_idx, 
2a3e0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09  sess_attr_idx;..
2a3f0 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64  CK_ULONG matched
2a400 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74  _count, prev_mat
2a410 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74  ched_count;..int
2a420 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23   mutex_retval;.#
2a430 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42  ifdef CACKEY_DEB
2a440 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54  UG_SEARCH_SPEEDT
2a450 45 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65  EST..struct time
2a460 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a  val start, end;.
2a470 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f  .uint64_t start_
2a480 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65  int, end_int;.#e
2a490 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
2a4a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a4b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a4c0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a4d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a4e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a4f0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a500 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a510 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a520 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a530 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65  .}...if (pulObje
2a540 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ctCount == NULL)
2a550 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a560 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a570 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74    pulObjectCount
2a580 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2a590 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2a5a0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2a5b0 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20  if (phObject == 
2a5c0 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a  NULL && ulMaxObj
2a5d0 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
2a5e0 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
2a5f0 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a  uit, if zero obj
2a600 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66  ects were specif
2a610 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20  ied return zero 
2a620 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c  items immediatel
2a630 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63  y */...*pulObjec
2a640 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43  tCount = 0;....C
2a650 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a660 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a670 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
2a680 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
2a690 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
2a6a0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
2a6b0 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
2a6c0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2a6d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a6e0 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20  r.  phObject is 
2a6f0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2a700 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2a710 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2a720 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
2a730 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2a740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a750 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20  Error.  Maximum 
2a760 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
2a770 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a  s specified as z
2a780 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ero.");....retur
2a790 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2a7a0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
2a7b0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2a7c0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2a7d0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2a7e0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2a7f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2a800 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2a810 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a820 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2a830 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2a840 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2a850 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2a860 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2a870 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2a880 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2a890 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2a8a0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2a8b0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2a8c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a8d0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2a8e0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2a8f0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2a900 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2a910 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2a920 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2a930 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2a940 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2a950 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2a960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a970 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2a980 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2a990 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2a9a0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2a9b0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2a9c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2a9d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a9e0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
2a9f0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2aa00 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2aa10 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2aa20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2aa30 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
2aa40 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2aa50 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2aa60 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2aa70 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23  TIALIZED);..}..#
2aa80 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42  ifdef CACKEY_DEB
2aa90 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54  UG_SEARCH_SPEEDT
2aaa0 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61  EST..gettimeofda
2aab0 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b  y(&start, NULL);
2aac0 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f  .#endif...curr_o
2aad0 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09  ut_id_idx = 0;..
2aae0 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78  for (curr_id_idx
2aaf0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
2ab00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2ab10 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72  rch_curr_id; cur
2ab20 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65  r_id_idx < cacke
2ab30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ab40 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2ab50 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62  count && ulMaxOb
2ab60 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f  jectCount; curr_
2ab70 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75  id_idx++) {...cu
2ab80 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f  rr_id = &cackey_
2ab90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2aba0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75  n].identities[cu
2abb0 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43  rr_id_idx];....C
2abc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2abd0 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69  TF("Processing i
2abe0 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75  dentity:%lu", (u
2abf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
2ac00 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d  rr_id_idx);....m
2ac10 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30  atched_count = 0
2ac20 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61  ;....for (curr_a
2ac30 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72  ttr_idx = 0; cur
2ac40 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63  r_attr_idx < cac
2ac50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ac60 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2ac70 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f  ery_count; curr_
2ac80 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
2ac90 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f  .prev_matched_co
2aca0 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f  unt = matched_co
2acb0 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74  unt;.....curr_at
2acc0 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  tr = &cackey_ses
2acd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ace0 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72  search_query[cur
2acf0 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09  r_attr_idx];....
2ad00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ad10 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67  INTF("  Checking
2ad20 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 25   for attribute %
2ad30 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69  s (0x%08lx) in i
2ad40 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20  dentity:%i...", 
2ad50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2ad60 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
2ad70 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  TR(curr_attr->ty
2ad80 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  pe), (unsigned l
2ad90 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e  ong) curr_attr->
2ada0 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72  type, (int) curr
2adb0 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43  _id_idx);....CAC
2adc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
2add0 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f  UF("    Value lo
2ade0 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72  oking for:", cur
2adf0 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20  r_attr->pValue, 
2ae00 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
2ae10 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20  ueLen);.....for 
2ae20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d  (sess_attr_idx =
2ae30 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64   0; sess_attr_id
2ae40 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74  x < curr_id->att
2ae50 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73  ributes_count; s
2ae60 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  ess_attr_idx++) 
2ae70 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  {.....if (cackey
2ae80 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f  _pkcs11_compare_
2ae90 61 74 74 72 69 62 75 74 65 73 28 26 63 75 72 72  attributes(&curr
2aea0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
2aeb0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20  sess_attr_idx], 
2aec0 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09  curr_attr)) {...
2aed0 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ...matched_count
2aee0 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ++;.......break;
2aef0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
2af00 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62  /* If the attrib
2af10 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ute could not be
2af20 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74   matched, do not
2af30 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64   try to match ad
2af40 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75  ditional attribu
2af50 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72  tes */....if (pr
2af60 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
2af70 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e   == matched_coun
2af80 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  t) {.....break;.
2af90 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
2afa0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
2afb0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2afc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2afd0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b  h_query_count) {
2afe0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2aff0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41  _PRINTF("  ... A
2b000 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73  ll %i attributes
2b010 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
2b020 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74  nd, adding ident
2b030 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e  ity:%i to return
2b040 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20  ed list", (int) 
2b050 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b060 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b070 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
2b080 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
2b090 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63  ;.....phObject[c
2b0a0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20  urr_out_id_idx] 
2b0b0 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20  = curr_id_idx + 
2b0c0 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65  1;.....ulMaxObje
2b0d0 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63  ctCount--;.....c
2b0e0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b  urr_out_id_idx++
2b0f0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
2b100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b110 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61  NTF("  ... Not a
2b120 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e  ll %i (only foun
2b130 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73  d %i) attributes
2b140 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
2b150 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69  nd, not adding i
2b160 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e  dentity:%i", (in
2b170 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  t) cackey_sessio
2b180 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b190 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c  rch_query_count,
2b1a0 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63   (int) matched_c
2b1b0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
2b1c0 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d  _id_idx);...}..}
2b1d0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b1e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b1f0 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72  ch_curr_id = cur
2b200 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f  r_id_idx;..*pulO
2b210 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72  bjectCount = cur
2b220 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23  r_out_id_idx;..#
2b230 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42  ifdef CACKEY_DEB
2b240 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54  UG_SEARCH_SPEEDT
2b250 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61  EST..gettimeofda
2b260 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09  y(&end, NULL);..
2b270 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61  start_int = (sta
2b280 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30  rt.tv_sec * 1000
2b290 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f  000) + start.tv_
2b2a0 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d  usec;..end_int =
2b2b0 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31   (end.tv_sec * 1
2b2c0 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76  000000) + end.tv
2b2d0 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28  _usec;..fprintf(
2b2e0 73 74 64 65 72 72 2c 20 22 53 65 61 72 63 68 20  stderr, "Search 
2b2f0 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65  took %lu microse
2b300 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67  conds\n", (unsig
2b310 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69  ned long) (end_i
2b320 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29  nt - start_int))
2b330 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78  ;.#endif...mutex
2b340 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2b350 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b360 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2b370 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2b380 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2b390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b3a0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2b3b0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2b3c0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2b3d0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2b3e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b3f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2b400 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20  KR_OK (%i), num 
2b410 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20  objects = %lu", 
2b420 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65  CKR_OK, *pulObje
2b430 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75  ctCount);...retu
2b440 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2b450 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2b460 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
2b470 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f  bjectsFinal)(CK_
2b480 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b490 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55  Session) {..CK_U
2b4a0 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d  LONG idx;..int m
2b4b0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2b4c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b4d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2b4e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2b4f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2b500 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b510 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2b520 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2b530 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2b540 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2b550 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2b560 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2b570 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2b580 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2b590 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2b5a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b5b0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2b5c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b5d0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2b5e0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2b5f0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2b600 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2b610 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2b620 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2b630 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2b640 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2b650 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2b660 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2b670 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b680 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2b690 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2b6a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2b6b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2b6c0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2b6d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2b6e0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2b6f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b700 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2b710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b720 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2b730 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2b740 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2b750 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2b760 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2b770 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2b780 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b790 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
2b7a0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2b7b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2b7c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2b7d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b7e0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
2b7f0 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
2b800 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2b810 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2b820 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2b830 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b840 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b850 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  ch_active = 0;..
2b860 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
2b870 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
2b880 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b890 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
2b8a0 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  t; idx++) {...if
2b8b0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2b8c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b8d0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
2b8e0 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28  alue) {....free(
2b8f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b900 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b910 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
2b920 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  ue);...}..}...if
2b930 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2b940 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b950 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72  ch_query) {...fr
2b960 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
2b970 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b980 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a  rch_query);..}..
2b990 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2b9a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2b9b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2b9c0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2b9d0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2b9e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b9f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2ba00 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2ba10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ba20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2ba30 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2ba40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2ba50 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2ba60 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2ba70 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2ba80 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2ba90 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
2baa0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
2bab0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2bac0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2bad0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2bae0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2baf0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
2bb00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bb10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2bb20 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2bb30 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2bb40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bb50 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2bb60 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2bb70 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2bb80 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2bb90 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2bba0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bbb0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2bbc0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bbd0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2bbe0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2bbf0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2bc00 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2bc10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2bc20 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2bc30 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
2bc40 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
2bc50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2bc60 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2bc70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
2bc80 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
2bc90 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2bca0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
2bcb0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44  TR pulEncryptedD
2bcc0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
2bcd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bce0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2bcf0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2bd00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2bd10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2bd20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2bd30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2bd40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2bd50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2bd60 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2bd70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2bd80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2bd90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2bda0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2bdb0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bdc0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2bdd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bde0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2bdf0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2be00 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
2be10 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
2be20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2be30 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2be40 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2be50 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
2be60 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2be70 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2be80 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
2be90 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
2bea0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2beb0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2bec0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2bed0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2bee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bef0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2bf00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2bf10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2bf20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2bf30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2bf40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bf50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2bf60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2bf70 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2bf80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bf90 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2bfa0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2bfb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2bfc0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2bfd0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2bfe0 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  EncryptFinal)(CK
2bff0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c000 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2c010 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79  E_PTR pLastEncry
2c020 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2c030 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e  NG_PTR pulLastEn
2c040 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
2c050 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2c060 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2c070 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2c080 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2c090 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c0a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2c0b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2c0c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c0d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2c0e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2c0f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c100 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2c110 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c120 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2c130 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2c140 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2c150 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2c160 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c170 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2c180 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2c190 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29  , C_DecryptInit)
2c1a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2c1b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2c1c0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2c1d0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
2c1e0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
2c1f0 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
2c200 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
2c210 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c220 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2c230 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2c240 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2c250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c260 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2c270 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2c280 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c290 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2c2a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2c2b0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
2c2c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2c2d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c2e0 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
2c2f0 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
2c300 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2c310 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2c320 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
2c330 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
2c340 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09  KM_RSA_PKCS) {..
2c350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c360 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
2c370 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
2c380 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  sm not specified
2c390 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   as CKM_RSA_PKCS
2c3a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c3b0 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
2c3c0 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
2c3d0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
2c3e0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
2c3f0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2c400 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
2c410 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2c420 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
2c430 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c440 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2c450 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
2c460 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2c470 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2c480 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2c490 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2c4a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2c4b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2c4c0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2c4d0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2c4e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c4f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2c500 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2c510 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2c520 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2c530 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2c540 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c550 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
2c560 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2c570 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c580 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2c590 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c5a0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2c5b0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2c5c0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2c5d0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2c5e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
2c5f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c600 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2c610 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2c620 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2c630 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2c640 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c650 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2c660 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69  ecrypt already i
2c670 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
2c680 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2c690 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
2c6a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
2c6b0 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
2c6c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2c6d0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
2c6e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2c6f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2c700 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2c710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c720 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
2c730 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
2c740 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
2c750 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
2c760 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
2c770 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
2c780 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
2c790 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
2c7a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c7b0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2c7c0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
2c7d0 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
2c7e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2c7f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2c800 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2c810 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  pt_active = 1;..
2c820 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2c830 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2c840 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  pt_mechanism = p
2c850 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
2c860 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65  nism;..cackey_se
2c870 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c880 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
2c890 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d  rm = pMechanism-
2c8a0 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61  >pParameter;..ca
2c8b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c8c0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2c8d0 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70  mech_parmlen = p
2c8e0 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72  Mechanism->ulPar
2c8f0 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b  ameterLen;..cack
2c900 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c910 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
2c920 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
2c930 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c940 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
2c950 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  Key];...mutex_re
2c960 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2c970 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2c980 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2c990 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2c9a0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2c9b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c9c0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2c9d0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2c9e0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2c9f0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2ca00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ca10 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ca20 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2ca30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ca40 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2ca50 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2ca60 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f  , C_Decrypt)(CK_
2ca70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ca80 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2ca90 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
2caa0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2cab0 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
2cac0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2cad0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
2cae0 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a  R pulDataLen) {.
2caf0 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65  .CK_ULONG datale
2cb00 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65  n_update, datale
2cb10 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20  n_final;..CK_RV 
2cb20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e  decrypt_ret;..in
2cb30 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2cb40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cb50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2cb60 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2cb70 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2cb80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cb90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2cba0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2cbb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2cbc0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2cbd0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2cbe0 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d  if (pulDataLen =
2cbf0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2cc00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cc10 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c  "Error. pulDataL
2cc20 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
2cc30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2cc40 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2cc50 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  ..datalen_update
2cc60 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a   = *pulDataLen;.
2cc70 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20  ..decrypt_ret = 
2cc80 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28  C_DecryptUpdate(
2cc90 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79  hSession, pEncry
2cca0 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72  ptedData, ulEncr
2ccb0 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44  yptedDataLen, pD
2ccc0 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70  ata, &datalen_up
2ccd0 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72  date);..if (decr
2cce0 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
2ccf0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
2cd00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cd10 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74  r.  DecryptUpdat
2cd20 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  e() returned fai
2cd30 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
2cd40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2cd50 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
2cd60 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 5f  ....if (decrypt_
2cd70 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45  ret != CKR_BUFFE
2cd80 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
2cd90 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64  ../* Terminate d
2cda0 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74  ecryption operat
2cdb0 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78  ion */.....mutex
2cdc0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2cdd0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2cde0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
2cdf0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2ce00 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   != 0) {.....CAC
2ce10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ce20 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2ce30 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2ce40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2ce50 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  ERAL_ERROR);....
2ce60 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
2ce70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ce80 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2ce90 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2cea0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2ceb0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
2cec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ced0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2cee0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2cef0 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
2cf00 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2cf10 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d  E_INVALID);....}
2cf20 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
2cf30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cf40 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2cf50 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
2cf60 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2cf70 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2cf80 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2cf90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2cfa0 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2cfb0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
2cfc0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2cfd0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2cfe0 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  ZED);....}.....c
2cff0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d000 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2d010 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
2d020 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2d030 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2d040 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2d050 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
2d060 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2d070 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2d080 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d090 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2d0a0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
2d0b0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2d0c0 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
2d0d0 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
2d0e0 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  t_ret);..}...if 
2d0f0 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74  (pData) {...pDat
2d100 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  a += datalen_upd
2d110 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e  ate;..}..datalen
2d120 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74  _final = *pulDat
2d130 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75  aLen - datalen_u
2d140 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74  pdate;...decrypt
2d150 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
2d160 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
2d170 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
2d180 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63  final);..if (dec
2d190 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
2d1a0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
2d1b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d1c0 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61  or.  DecryptFina
2d1d0 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
2d1e0 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
2d1f0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2d200 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
2d210 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
2d220 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70  pt_ret);..}...*p
2d230 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61  ulDataLen = data
2d240 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74  len_update + dat
2d250 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41  alen_final;...CA
2d260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d270 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2d280 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2d290 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2d2a0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2d2b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2d2c0 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61  V, C_DecryptUpda
2d2d0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2d2e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2d2f0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2d300 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2d310 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
2d320 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2d330 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2d340 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
2d350 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
2d360 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34  K_BYTE buf[16384
2d370 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c  ];..ssize_t bufl
2d380 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  en;..CK_SLOT_ID 
2d390 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72  slotID;..CK_RV r
2d3a0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
2d3b0 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20  RAL_ERROR;..int 
2d3c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2d3d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d3e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2d3f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2d400 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2d410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d420 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2d430 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2d440 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2d450 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2d460 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2d470 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2d480 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2d490 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2d4a0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2d4b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2d4c0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2d4d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d4e0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2d4f0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2d500 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2d510 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2d520 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2d530 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
2d540 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45  t == NULL && ulE
2d550 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2d560 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
2d570 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65  rt circuit if we
2d580 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65   are asked to de
2d590 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e  crypt nothing...
2d5a0 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
2d5b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2d5c0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2d5d0 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
2d5e0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
2d5f0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
2d600 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74  }...if (pEncrypt
2d610 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  edPart == NULL) 
2d620 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d630 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d640 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69  pEncryptedPart i
2d650 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e  s NULL, but ulEn
2d660 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
2d670 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
2d680 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2d690 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2d6a0 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61  f (ulEncryptedPa
2d6b0 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
2d6c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d6d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e  NTF("Error. ulEn
2d6e0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
2d6f0 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69  s 0, but pPart i
2d700 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
2d710 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2d720 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2d730 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e  ..if (pulPartLen
2d740 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2d750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d760 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72  F("Error. pulPar
2d770 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
2d780 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2d790 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2d7a0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2d7b0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2d7c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2d7d0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2d7e0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2d7f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d800 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2d810 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2d820 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d830 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2d840 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2d850 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d860 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2d870 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2d880 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2d890 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2d8a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d8b0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2d8c0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2d8d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2d8e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2d8f0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
2d900 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d910 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2d920 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2d930 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2d940 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2d950 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2d960 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d970 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
2d980 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2d990 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2d9a0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2d9b0 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
2d9c0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
2d9d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
2d9e0 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
2d9f0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
2da00 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2da10 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
2da20 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
2da30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2da40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2da50 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
2da60 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
2da70 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
2da80 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
2da90 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
2daa0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2dab0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
2dac0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2dad0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
2dae0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2daf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
2db00 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
2db10 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
2db20 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
2db30 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
2db40 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2db50 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2db60 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
2db70 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2db80 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
2db90 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
2dba0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2dbb0 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29  crypt_mechanism)
2dbc0 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
2dbd0 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
2dbe0 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70  k card to decryp
2dbf0 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d  t */....buflen =
2dc00 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
2dc10 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
2dc20 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
2dc30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2dc40 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
2dc50 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
2dc60 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
2dc70 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
2dc80 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
2dc90 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c  1);.....if (bufl
2dca0 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
2dcb0 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26  C_E_NEEDLOGIN &&
2dcc0 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d   cackey_pin_comm
2dcd0 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
2dce0 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e 4d  ...if (_C_LoginM
2dcf0 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e  utexArg(hSession
2dd00 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c  , CKU_USER, NULL
2dd10 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f  , 0, 0) == CKR_O
2dd20 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c 65 6e  K) {......buflen
2dd30 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
2dd40 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
2dd50 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
2dd60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2dd70 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
2dd80 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70  dentity, pEncryp
2dd90 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
2dda0 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
2ddb0 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30  , sizeof(buf), 0
2ddc0 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  , 1);.....}....}
2ddd0 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2dde0 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65  < 0) {...../* De
2ddf0 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e  cryption failed.
2de00 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c   */.....if (bufl
2de10 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
2de20 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b  C_E_NEEDLOGIN) {
2de30 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2de40 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47  KR_USER_NOT_LOGG
2de50 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73  ED_IN;.....} els
2de60 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  e if (buflen == 
2de70 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
2de80 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
2de90 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44  ..retval = CKR_D
2dea0 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09  EVICE_REMOVED;..
2deb0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
2dec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ded0 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
2dee0 73 65 6e 64 20 41 50 44 55 2c 20 65 72 72 6f 72  send APDU, error
2def0 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e 67 20 69   = %li", (long i
2df00 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09  nt) buflen);....
2df10 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2df20 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
2df30 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
2df40 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
2df50 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70  ng) buflen) > *p
2df60 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61  ulPartLen && pPa
2df70 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63  rt) {...../* Dec
2df80 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20  rypted data too 
2df90 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74  large */.....ret
2dfa0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
2dfb0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
2dfc0 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
2dfd0 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65  pPart) {......me
2dfe0 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c  mcpy(pPart, buf,
2dff0 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a   buflen);.....}.
2e000 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e  .....*pulPartLen
2e010 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09   = buflen;......
2e020 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
2e030 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
2e040 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2e050 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2e060 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2e070 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2e080 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2e090 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e0a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e0b0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2e0c0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2e0d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2e0e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2e0f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e100 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
2e110 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
2e120 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2e130 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2e140 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2e150 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ecryptFinal)(CK_
2e160 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2e170 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2e180 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20  _PTR pLastPart, 
2e190 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2e1a0 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09  LastPartLen) {..
2e1b0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2e1c0 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65  ;..int terminate
2e1d0 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09  _decrypt = 1;...
2e1e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e1f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e200 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2e210 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2e220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e230 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2e240 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2e250 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2e260 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2e270 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2e280 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2e290 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2e2a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2e2b0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2e2c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2e2d0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2e2e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e2f0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2e300 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2e310 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2e320 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2e330 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2e340 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  f (pulLastPartLe
2e350 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
2e360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e370 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61  TF("Error. pulLa
2e380 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c  stPartLen is NUL
2e390 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2e3a0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2e3b0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2e3c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2e3d0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2e3e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2e3f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2e400 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2e410 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e420 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2e430 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2e440 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2e450 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2e460 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2e470 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2e480 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2e490 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2e4a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2e4b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e4c0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2e4d0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2e4e0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2e4f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2e500 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2e510 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2e520 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2e530 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
2e540 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2e550 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e560 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2e570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e580 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e  rror.  Decrypt n
2e590 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2e5a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2e5b0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2e5c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a  IALIZED);..}...*
2e5d0 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
2e5e0 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50   0;...if (pLastP
2e5f0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
2e600 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  .terminate_decry
2e610 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  pt = 0;..}...if 
2e620 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  (terminate_decry
2e630 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  pt) {...cackey_s
2e640 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e650 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
2e660 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
2e670 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2e680 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2e690 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2e6a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2e6b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2e6c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e6d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2e6e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2e6f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2e700 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2e710 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e720 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2e730 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2e740 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2e750 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2e760 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e770 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69  _RV, C_DigestIni
2e780 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2e790 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2e7a0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2e7b0 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43  pMechanism) {..C
2e7c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e7d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e7e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e7f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...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 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e820 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e830 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e840 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2e850 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2e860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e870 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2e880 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e890 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2e8a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e8b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2e8c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2e8d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e8e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2e8f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2e900 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49  Digest)(CK_SESSI
2e910 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e920 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2e930 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
2e940 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
2e950 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
2e960 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2e970 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
2e980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e990 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2e9a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2e9b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2e9c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e9d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2e9e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2e9f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2ea00 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2ea10 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2ea20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ea30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2ea40 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ea50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2ea60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ea70 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2ea80 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2ea90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2eaa0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2eab0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2eac0 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
2ead0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2eae0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2eaf0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2eb00 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
2eb10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2eb20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2eb30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2eb40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2eb50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2eb60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2eb70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2eb80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2eb90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2eba0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2ebb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ebc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2ebd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ebe0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2ebf0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2ec00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2ec10 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2ec20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ec30 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2ec40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2ec50 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43  , C_DigestKey)(C
2ec60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2ec70 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
2ec80 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2ec90 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2eca0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2ecb0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2ecc0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2ecd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ece0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ecf0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2ed00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ed10 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ed20 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2ed30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ed40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ed50 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ed60 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ed70 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ed80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ed90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2eda0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2edb0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2edc0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2edd0 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61  RV, C_DigestFina
2ede0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
2edf0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2ee00 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
2ee10 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
2ee20 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
2ee30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ee40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2ee50 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2ee60 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2ee70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ee80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2ee90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2eea0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2eeb0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2eec0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2eed0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2eee0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2eef0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ef00 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2ef10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ef20 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2ef30 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2ef40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ef50 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2ef60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2ef70 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f   C_SignInit)(CK_
2ef80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ef90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2efa0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2efb0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2efc0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2efd0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2efe0 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
2eff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f000 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2f010 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2f020 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2f030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f040 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2f050 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2f060 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2f070 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2f080 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2f090 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
2f0a0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2f0b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f0c0 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
2f0d0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2f0e0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2f0f0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2f100 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
2f110 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
2f120 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
2f130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f140 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
2f150 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
2f160 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
2f170 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  CKM_RSA_PKCS");.
2f180 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
2f190 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
2f1a0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2f1b0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2f1c0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2f1d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2f1e0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2f1f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2f200 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2f210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f220 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2f230 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2f240 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2f250 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2f260 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2f270 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2f280 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2f290 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2f2a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2f2b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2f2c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f2d0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2f2e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2f2f0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2f300 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2f310 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2f320 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2f330 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2f340 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2f350 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2f360 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f370 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2f380 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2f390 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2f3a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2f3b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2f3c0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
2f3d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f3e0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2f3f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2f400 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2f410 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2f420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f430 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72  Error.  Sign alr
2f440 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73  eady in progress
2f450 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2f460 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
2f470 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20  CTIVE);..}...if 
2f480 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f  (hKey >= cackey_
2f490 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f4a0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
2f4b0 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  unt) {...cackey_
2f4c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2f4d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2f4e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f4f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65  INTF("Error.  Ke
2f500 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  y handle out of 
2f510 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64  range (requested
2f520 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25   key %lu, only %
2f530 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76  lu identities av
2f540 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73  ailable).", (uns
2f550 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
2f560 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2f570 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
2f580 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2f590 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
2f5a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59  ..return(CKR_KEY
2f5b0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2f5c0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
2f5d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f5e0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31  .sign_active = 1
2f5f0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
2f600 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2f610 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  gn_mechanism = p
2f620 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
2f630 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  nism;...cackey_s
2f640 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f650 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
2f660 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  128;..cackey_ses
2f670 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f680 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30  sign_bufused = 0
2f690 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
2f6a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2f6b0 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73  n_buf = malloc(s
2f6c0 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65  izeof(*cackey_se
2f6d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f6e0 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63  .sign_buf) * cac
2f6f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2f700 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
2f710 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  en);...CACKEY_DE
2f720 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73  BUG_PRINTF("Sess
2f730 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65  ion %lu sign_ide
2f740 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65  ntity is %p (ide
2f750 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75  ntity #%lu)", (u
2f760 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
2f770 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29  ession, (void *)
2f780 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
2f790 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2f7a0 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75  tities[hKey], (u
2f7b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
2f7c0 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ey);..cackey_ses
2f7d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f7e0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20  sign_identity = 
2f7f0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2f800 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2f810 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
2f820 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2f830 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2f840 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2f850 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2f860 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2f870 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f880 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2f890 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2f8a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2f8b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2f8c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2f8d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2f8e0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2f8f0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2f900 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2f910 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2f920 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29  N(CK_RV, C_Sign)
2f930 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2f940 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2f950 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2f960 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
2f970 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2f980 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2f990 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
2f9a0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73  atureLen) {..uns
2f9b0 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74  igned long start
2f9c0 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09  _sign_bufused;..
2f9d0 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a  CK_RV sign_ret;.
2f9e0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2f9f0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
2fa00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2fa10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2fa20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2fa30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2fa40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2fa50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2fa60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2fa70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2fa80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2fa90 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
2faa0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
2fab0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2fac0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
2fad0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2fae0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
2faf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2fb00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2fb10 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
2fb20 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2fb30 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2fb40 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2fb50 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62  }...start_sign_b
2fb60 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f  ufused = cackey_
2fb70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2fb80 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  n].sign_bufused;
2fb90 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f  ...sign_ret = C_
2fba0 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73  SignUpdate(hSess
2fbb0 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61  ion, pData, ulDa
2fbc0 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67  taLen);..if (sig
2fbd0 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  n_ret != CKR_OK)
2fbe0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2fbf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2fc00 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72    SignUpdate() r
2fc10 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2fc20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2fc30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
2fc40 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28  gn_ret);....if (
2fc50 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
2fc60 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2fc70 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  ) {....mutex_ret
2fc80 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2fc90 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2fca0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
2fcb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2fcc0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
2fcd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2fce0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2fcf0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2fd00 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2fd10 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09  _ERROR);....}...
2fd20 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2fd30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2fd40 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
2fd50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2fd60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2fd70 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
2fd80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2fd90 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2fda0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2fdb0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2fdc0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2fdd0 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  VALID);....}....
2fde0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2fdf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2fe00 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
2fe10 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2fe20 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2fe30 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
2fe40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fe50 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
2fe60 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2fe70 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2fe80 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2fe90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d  ITIALIZED);....}
2fea0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2feb0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2fec0 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
2fed0 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
2fee0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2fef0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2ff00 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2ff10 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2ff20 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2ff30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ff40 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2ff50 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2ff60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2ff70 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09  L_ERROR);....}..
2ff80 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  .}....return(sig
2ff90 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67  n_ret);..}...sig
2ffa0 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69  n_ret = C_SignFi
2ffb0 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53  nal(hSession, pS
2ffc0 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67  ignature, pulSig
2ffd0 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20  natureLen);..if 
2ffe0 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
2fff0 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67  _OK) {...if (sig
30000 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46  n_ret == CKR_BUF
30010 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
30020 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
30030 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e  _PRINTF("SignFin
30040 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b  al() returned CK
30050 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
30060 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75  LL (rv = %lu), u
30070 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
30080 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65  ate()", (unsigne
30090 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
300a0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
300b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
300c0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
300d0 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
300e0 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73  ed;.....return(s
300f0 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09  ign_ret);...}...
30100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30110 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
30120 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
30130 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
30140 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
30150 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
30160 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  t);....return(si
30170 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66  gn_ret);..}...if
30180 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20   (pSignature == 
30190 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
301a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
301b0 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 69 66  Signature specif
301c0 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64  ied as NULL, und
301d0 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
301e0 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  e()");....cackey
301f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30200 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
30210 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75   = start_sign_bu
30220 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e  fused;....return
30230 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a  (sign_ret);..}..
30240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30250 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
30260 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
30270 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
30280 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
30290 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
302a0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61  K_RV, C_SignUpda
302b0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
302c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
302d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
302e0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
302f0 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
30300 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
30310 20 72 65 73 69 7a 65 52 65 74 72 79 3b 0a 09 69   resizeRetry;..i
30320 6e 74 20 6e 65 65 64 52 65 73 69 7a 65 3b 0a 0a  nt needResize;..
30330 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30340 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
30350 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
30360 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
30370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30380 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
30390 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
303a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
303b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
303c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
303d0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
303e0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
303f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
30400 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
30410 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
30420 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
30430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30440 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
30450 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
30460 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
30470 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
30480 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
30490 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c  if (pPart == NUL
304a0 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d  L && ulPartLen =
304b0 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
304c0 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
304d0 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67  are asked to sig
304e0 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  n nothing... */.
304f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30500 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30510 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
30520 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
30530 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
30540 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
30550 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c  if (pPart == NUL
30560 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
30570 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30580 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c  r. pPart is NULL
30590 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20  , but ulPartLen 
305a0 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
305b0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
305c0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
305d0 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d  if (ulPartLen ==
305e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
305f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30600 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  or. ulPartLen is
30610 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
30620 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
30630 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
30640 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
30650 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
30660 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
30670 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
30680 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
30690 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
306a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
306b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
306c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
306d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
306e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
306f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
30700 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30710 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
30720 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
30730 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
30740 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
30750 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
30760 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
30770 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
30780 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
30790 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
307a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
307b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
307c0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
307d0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
307e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
307f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
30800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30810 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
30820 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
30830 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
30840 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
30850 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
30860 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
30870 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30880 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
30890 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
308a0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
308b0 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63  Accumulate direc
308c0 74 6c 79 20 2a 2f 0a 09 09 09 66 6f 72 20 28 72  tly */....for (r
308d0 65 73 69 7a 65 52 65 74 72 79 20 3d 20 30 3b 20  esizeRetry = 0; 
308e0 72 65 73 69 7a 65 52 65 74 72 79 20 3c 20 31 31  resizeRetry < 11
308f0 3b 20 72 65 73 69 7a 65 52 65 74 72 79 2b 2b 29  ; resizeRetry++)
30900 20 7b 0a 09 09 09 09 6e 65 65 64 52 65 73 69 7a   {.....needResiz
30910 65 20 3d 20 30 3b 0a 09 09 09 09 69 66 20 28 28  e = 0;.....if ((
30920 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30930 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
30940 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c  ufused + ulPartL
30950 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73  en) > cackey_ses
30960 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30970 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09  sign_buflen) {..
30980 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65 20 3d  ....needResize =
30990 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69   1;.....}......i
309a0 66 20 28 21 6e 65 65 64 52 65 73 69 7a 65 29 20  f (!needResize) 
309b0 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
309c0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
309d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
309e0 73 69 7a 69 6e 67 20 73 69 67 6e 69 6e 67 20 62  sizing signing b
309f0 75 66 66 65 72 20 28 74 72 79 20 23 25 69 20 6f  uffer (try #%i o
30a00 66 20 31 30 20 2d 2d 20 31 31 74 68 20 69 73 20  f 10 -- 11th is 
30a10 66 61 74 61 6c 29 22 2c 20 72 65 73 69 7a 65 52  fatal)", resizeR
30a20 65 74 72 79 29 3b 0a 0a 09 09 09 09 69 66 20 28  etry);......if (
30a30 72 65 73 69 7a 65 52 65 74 72 79 20 3d 3d 20 31  resizeRetry == 1
30a40 30 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  0) {......free(c
30a50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30a60 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30a70 66 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79  f);.......cackey
30a80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30a90 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
30aa0 3d 20 30 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 0;......cackey
30ab0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30ac0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 4e  on].sign_buf = N
30ad0 55 4c 4c 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  ULL;.......break
30ae0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
30af0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30b00 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
30b10 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61  en *= 2;......ca
30b20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30b30 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
30b40 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65   = realloc(cacke
30b50 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30b60 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73  ion].sign_buf, s
30b70 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65  izeof(*cackey_se
30b80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30b90 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63  .sign_buf) * cac
30ba0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30bb0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
30bc0 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  en);....}.....if
30bd0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
30be0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
30bf0 5f 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  _buf == NULL) {.
30c00 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
30c10 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
30c20 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
30c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30c40 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 69  F("Error.  Signi
30c50 6e 67 20 62 75 66 66 65 72 20 69 73 20 4e 55 4c  ng buffer is NUL
30c60 4c 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  L.");......retur
30c70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
30c80 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  ROR);....}.....m
30c90 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
30ca0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30cb0 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65  sign_buf + cacke
30cc0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30cd0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
30ce0 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74  d, pPart, ulPart
30cf0 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  Len);.....cackey
30d00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30d10 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
30d20 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a   += ulPartLen;..
30d30 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
30d40 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
30d50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
30d60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
30d70 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
30d80 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
30d90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30da0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
30db0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
30dc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
30dd0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
30de0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
30df0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
30e00 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
30e10 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
30e20 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
30e30 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
30e40 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46  N(CK_RV, C_SignF
30e50 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
30e60 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
30e70 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
30e80 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
30e90 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
30ea0 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69  ureLen) {..stati
30eb0 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66  c CK_BYTE sigbuf
30ec0 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74  [1024];..ssize_t
30ed0 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f   sigbuflen;..CK_
30ee0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
30ef0 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
30f00 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
30f10 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  R;..int terminat
30f20 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74  e_sign = 1;..int
30f30 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
30f40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30f50 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
30f60 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
30f70 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
30f80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30f90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
30fa0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
30fb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
30fc0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
30fd0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
30fe0 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  f (pulSignatureL
30ff0 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
31000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31010 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53  NTF("Error. pulS
31020 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e  ignatureLen is N
31030 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
31040 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
31050 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
31060 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
31070 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
31080 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
31090 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
310a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
310b0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
310c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
310d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
310e0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
310f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
31100 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
31110 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
31120 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
31130 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
31140 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
31150 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
31160 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
31170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31180 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
31190 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
311a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
311b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
311c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
311d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
311e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
311f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
31200 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
31210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
31230 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
31240 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
31250 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
31260 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
31270 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
31280 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31290 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
312a0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
312b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
312c0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
312d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
312e0 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
312f0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
31300 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
31310 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
31320 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  IZED);..}...slot
31330 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
31340 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31350 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
31360 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
31370 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
31380 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
31390 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
313a0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
313b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
313c0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
313d0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
313e0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
313f0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
31400 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
31410 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
31420 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
31430 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
31440 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
31450 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
31460 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
31470 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
31480 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
31490 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
314a0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
314b0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
314c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
314d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
314e0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
314f0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
31500 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
31510 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31520 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
31530 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
31540 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
31550 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f   card to sign */
31560 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
31570 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20  _PRINTF("Asking 
31580 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65  to sign from ide
31590 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73 73  ntity %p in sess
315a0 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20  ion %lu", (void 
315b0 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  *) cackey_sessio
315c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
315d0 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73  n_identity, (uns
315e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
315f0 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66  sion);....sigbuf
31600 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
31610 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
31620 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
31630 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31640 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
31650 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f  dentity, cackey_
31660 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31670 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63  n].sign_buf, cac
31680 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31690 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
316a0 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a  sed, sigbuf, siz
316b0 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20  eof(sigbuf), 1, 
316c0 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62  0);.....if (sigb
316d0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
316e0 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
316f0 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63   && cackey_pin_c
31700 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20  ommand != NULL) 
31710 7b 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67  {.....if (_C_Log
31720 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73  inMutexArg(hSess
31730 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e  ion, CKU_USER, N
31740 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b  ULL, 0, 0) == CK
31750 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73 69 67  R_OK) {......sig
31760 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
31770 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
31780 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
31790 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
317a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
317b0 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b  n_identity, cack
317c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
317d0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
317e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
317f0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
31800 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20  ufused, sigbuf, 
31810 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20  sizeof(sigbuf), 
31820 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09  1, 0);.....}....
31830 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  }.....if (sigbuf
31840 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f  len < 0) {...../
31850 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64  * Signing failed
31860 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67  . */.....if (sig
31870 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
31880 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
31890 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  N) {......retval
318a0 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f   = CKR_USER_NOT_
318b0 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d  LOGGED_IN;.....}
318c0 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 66   else if (sigbuf
318d0 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
318e0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
318f0 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
31900 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  = CKR_DEVICE_REM
31910 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65  OVED;.....} else
31920 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
31930 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
31940 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  OR;.....}....} e
31950 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e  lse if (((unsign
31960 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
31970 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74  en) > *pulSignat
31980 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61  ureLen && pSigna
31990 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53  ture) {...../* S
319a0 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  igned data too l
319b0 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b  arge */.....CACK
319c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
319d0 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  "retval = CKR_BU
319e0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20  FFER_TOO_SMALL; 
319f0 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75   sigbuflen = %lu
31a00 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
31a10 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  n = %lu", (unsig
31a20 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66  ned long) sigbuf
31a30 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
31a40 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75  ong) *pulSignatu
31a50 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74  reLen);......ret
31a60 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
31a70 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09  _TOO_SMALL;.....
31a80 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
31a90 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  = 0;....} else {
31aa0 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
31ab0 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66  ign = 0;......if
31ac0 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a   (pSignature) {.
31ad0 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67  .....memcpy(pSig
31ae0 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20  nature, sigbuf, 
31af0 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  sigbuflen);.....
31b00 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
31b10 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   = 1;.....}.....
31b20 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  .*pulSignatureLe
31b30 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a  n = sigbuflen;..
31b40 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
31b50 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  _OK;....}.....br
31b60 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  eak;..}...if (te
31b70 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a  rminate_sign) {.
31b80 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
31b90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31ba0 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66  sign_buf) {....f
31bb0 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
31bc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31bd0 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09  gn_buf);...}....
31be0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31bf0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
31c00 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
31c10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
31c20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
31c30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
31c40 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
31c50 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
31c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31c70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
31c80 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
31c90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
31ca0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
31cb0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
31cc0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
31cd0 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
31ce0 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
31cf0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
31d00 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
31d10 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
31d20 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
31d30 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
31d40 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
31d50 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
31d60 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
31d70 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
31d80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31d90 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
31da0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
31db0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
31dc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31dd0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
31de0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
31df0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
31e00 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
31e10 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
31e20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31e30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
31e40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
31e50 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
31e60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
31e70 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
31e80 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
31e90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
31ea0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
31eb0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
31ec0 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45  gnRecover)(CK_SE
31ed0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
31ee0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
31ef0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
31f00 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
31f10 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
31f20 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
31f30 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
31f40 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
31f50 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
31f60 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
31f70 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
31f80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
31f90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31fa0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
31fb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
31fc0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
31fd0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
31fe0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
31ff0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
32000 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
32010 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
32020 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
32030 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
32040 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
32050 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32060 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
32070 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
32080 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e  K_RV, C_VerifyIn
32090 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
320a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
320b0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
320c0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
320d0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
320e0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
320f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
32100 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
32110 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
32120 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
32130 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32140 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
32150 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
32160 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
32170 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
32180 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
32190 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
321a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
321b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
321c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
321d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
321e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
321f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32200 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
32210 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
32220 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28  K_RV, C_Verify)(
32230 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
32240 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
32250 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
32260 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
32270 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
32280 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
32290 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
322a0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
322b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
322c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
322d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
322e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
322f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32300 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
32310 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
32320 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
32330 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
32340 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
32350 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
32360 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
32370 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
32380 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
32390 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
323a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
323b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
323c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
323d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
323e0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70  K_RV, C_VerifyUp
323f0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
32400 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
32410 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
32420 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
32430 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
32440 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32450 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
32460 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
32470 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
32480 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32490 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
324a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
324b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
324c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
324d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
324e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
324f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
32500 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32510 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
32520 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
32530 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
32540 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
32550 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
32560 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
32570 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
32580 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ifyFinal)(CK_SES
32590 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
325a0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
325b0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
325c0 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
325d0 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
325e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
325f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
32600 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
32610 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
32620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32630 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
32640 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
32650 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
32660 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
32670 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
32680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
32690 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
326a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
326b0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
326c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
326d0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
326e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
326f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
32700 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
32710 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
32720 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b  yRecoverInit)(CK
32730 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
32740 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
32750 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
32760 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
32770 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
32780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32790 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
327a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
327b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
327c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
327d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
327e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
327f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
32800 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
32810 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
32820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32830 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
32840 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32850 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
32860 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
32870 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
32880 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
32890 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
328a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
328b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
328c0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29  C_VerifyRecover)
328d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
328e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
328f0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
32900 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
32910 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b  SignatureLen, CK
32920 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
32930 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
32940 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  lDataLen) {..CAC
32950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32960 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
32970 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
32980 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
32990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
329a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
329b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
329c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
329d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
329e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
329f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32a00 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
32a10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
32a20 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
32a30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32a40 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
32a50 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
32a60 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
32a70 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
32a80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
32a90 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
32aa0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
32ab0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
32ac0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
32ad0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
32ae0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
32af0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
32b00 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
32b10 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
32b20 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
32b30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
32b40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
32b50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
32b60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
32b70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32b80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
32b90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
32ba0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
32bb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
32bc0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
32bd0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
32be0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
32bf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
32c00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
32c10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
32c20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
32c30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32c40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
32c50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
32c60 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44  K_RV, C_DecryptD
32c70 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
32c80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
32c90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
32ca0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
32cb0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
32cc0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
32cd0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
32ce0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
32cf0 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
32d00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32d10 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
32d20 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
32d30 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
32d40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32d50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
32d60 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
32d70 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
32d80 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
32d90 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
32da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32db0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
32dc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32dd0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
32de0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
32df0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
32e00 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
32e10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
32e20 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
32e30 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
32e40 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
32e50 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
32e60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
32e70 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
32e80 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
32e90 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
32ea0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
32eb0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
32ec0 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
32ed0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
32ee0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
32ef0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
32f00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
32f10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
32f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32f30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
32f40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
32f50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
32f60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
32f70 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
32f80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
32f90 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
32fa0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
32fb0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
32fc0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32fd0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
32fe0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32ff0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
33000 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
33010 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
33020 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  tVerifyUpdate)(C
33030 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
33040 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
33050 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
33060 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
33070 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
33080 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
33090 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
330a0 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
330b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
330c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
330d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
330e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
330f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33100 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
33110 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
33120 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33130 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33140 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
33150 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33160 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
33170 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33180 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
33190 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
331a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
331b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
331c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
331d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
331e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
331f0 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29  , C_GenerateKey)
33200 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33210 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33220 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
33230 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
33240 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
33250 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
33260 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
33270 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
33280 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
33290 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
332a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
332b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
332c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
332d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
332e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
332f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
33300 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
33310 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
33320 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
33330 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
33340 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
33350 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
33360 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
33370 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33380 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
33390 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
333a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
333b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
333c0 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
333d0 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53  KeyPair)(CK_SESS
333e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
333f0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
33400 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
33410 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
33420 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d  TR pPublicKeyTem
33430 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
33440 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69  ulPublicKeyAttri
33450 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54  buteCount, CK_AT
33460 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69  TRIBUTE_PTR pPri
33470 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c  vateKeyTemplate,
33480 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76   CK_ULONG ulPriv
33490 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43  ateKeyAttributeC
334a0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
334b0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62  HANDLE_PTR phPub
334c0 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  licKey, CK_OBJEC
334d0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
334e0 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41  rivateKey) {..CA
334f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33500 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
33510 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
33520 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
33530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33540 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
33550 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
33560 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
33570 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
33580 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
33590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
335a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
335b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
335c0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
335d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
335e0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
335f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
33600 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33610 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
33620 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
33630 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  rapKey)(CK_SESSI
33640 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
33650 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
33660 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
33670 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
33680 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20  E hWrappingKey, 
33690 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
336a0 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50   hKey, CK_BYTE_P
336b0 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
336c0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
336d0 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b  WrappedKeyLen) {
336e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
336f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
33700 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
33710 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
33720 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33730 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
33740 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
33750 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
33760 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
33770 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
33780 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33790 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
337a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
337b0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
337c0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
337d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
337e0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
337f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33800 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
33810 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
33820 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b   C_UnwrapKey)(CK
33830 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
33840 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
33850 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
33860 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
33870 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70  _HANDLE hUnwrapp
33880 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  ingKey, CK_BYTE_
33890 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
338a0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70   CK_ULONG ulWrap
338b0 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54  pedKeyLen, CK_AT
338c0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
338d0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
338e0 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  ulAttributeCount
338f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
33900 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
33910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33920 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
33930 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
33940 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
33950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33960 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
33970 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
33980 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
33990 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
339a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
339b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
339c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
339d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
339e0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
339f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33a00 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
33a10 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
33a20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33a30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
33a40 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
33a50 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f  C_DeriveKey)(CK_
33a60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
33a70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
33a80 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
33a90 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
33aa0 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c  HANDLE hBaseKey,
33ab0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
33ac0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
33ad0 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
33ae0 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
33af0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
33b00 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
33b10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
33b20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
33b30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
33b40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
33b50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
33b60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
33b70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
33b80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
33b90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
33ba0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
33bb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
33bc0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
33bd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
33be0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
33bf0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33c00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
33c10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33c20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
33c30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
33c40 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64  K_RV, C_SeedRand
33c50 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
33c60 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
33c70 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65  CK_BYTE_PTR pSee
33c80 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65  d, CK_ULONG ulSe
33c90 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  edLen) {..CACKEY
33ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
33cb0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
33cc0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
33cd0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
33ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33cf0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
33d00 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
33d10 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
33d20 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
33d30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
33d40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33d50 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33d60 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33d70 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
33d80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33d90 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
33da0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33db0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
33dc0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
33dd0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
33de0 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  ateRandom)(CK_SE
33df0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
33e00 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
33e10 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20  TR pRandomData, 
33e20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f  CK_ULONG ulRando
33e30 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  mLen) {..CACKEY_
33e40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
33e50 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
33e60 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
33e70 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
33e80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
33e90 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
33ea0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
33eb0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
33ec0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
33ed0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
33ee0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
33ef0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
33f00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33f10 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
33f20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33f30 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
33f40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33f50 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  UPPORTED);.}../*
33f60 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
33f70 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
33f80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
33f90 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  , C_GetFunctionS
33fa0 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f  tatus)(CK_SESSIO
33fb0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33fc0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
33fd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
33fe0 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
33ff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
34000 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
34010 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
34020 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
34030 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
34040 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
34050 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
34060 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
34070 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
34080 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
34090 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
340a0 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72  ng */.}../* Depr
340b0 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
340c0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
340d0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
340e0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43  ancelFunction)(C
340f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
34100 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
34110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34120 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
34130 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34140 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
34150 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34160 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
34170 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34180 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
34190 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
341a0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
341b0 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
341c0 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
341d0 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
341e0 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
341f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
34200 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
34210 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b  FunctionList)(CK
34220 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
34230 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f  TR_PTR ppFunctio
34240 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e  nList) {..CK_FUN
34250 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70  CTION_LIST_PTR p
34260 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
34270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34280 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
34290 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e  ..if (ppFunction
342a0 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
342b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
342c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70  RINTF("Error. pp
342d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20  FunctionList is 
342e0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
342f0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
34300 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  _BAD);..}...pFun
34310 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
34320 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
34330 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
34340 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
34350 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
34360 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
34370 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
34380 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
34390 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
343a0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
343b0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
343c0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
343d0 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
343e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
343f0 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
34400 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
34410 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
34420 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
34430 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34440 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
34450 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
34460 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
34470 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
34480 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
34490 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
344a0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
344b0 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
344c0 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
344d0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
344e0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
344f0 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
34500 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
34510 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
34520 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34530 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
34540 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
34550 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
34560 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
34570 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
34580 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
34590 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
345a0 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
345b0 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
345c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
345d0 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
345e0 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
345f0 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
34600 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
34610 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
34620 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
34630 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
34640 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
34650 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
34660 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
34670 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
34680 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
34690 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
346a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
346b0 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
346c0 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
346d0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
346e0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
346f0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
34700 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
34710 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34720 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
34730 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
34740 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
34750 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
34760 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
34770 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34780 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
34790 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
347a0 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
347b0 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
347c0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
347d0 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
347e0 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
347f0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
34800 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
34810 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
34820 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
34830 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
34840 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
34850 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
34860 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
34870 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
34880 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
34890 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
348a0 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
348b0 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
348c0 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
348d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
348e0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
348f0 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
34900 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
34910 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
34920 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
34930 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
34940 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
34950 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
34960 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
34970 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34980 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
34990 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
349a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
349b0 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
349c0 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
349d0 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
349e0 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
349f0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
34a00 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
34a10 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
34a20 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
34a30 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
34a40 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
34a50 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
34a60 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
34a70 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
34a80 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34a90 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
34aa0 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
34ab0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34ac0 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
34ad0 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
34ae0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34af0 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
34b00 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
34b10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34b20 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
34b30 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
34b40 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
34b50 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
34b60 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
34b70 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
34b80 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
34b90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34ba0 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
34bb0 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
34bc0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34bd0 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
34be0 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
34bf0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
34c00 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
34c10 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
34c20 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
34c30 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
34c40 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
34c50 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
34c60 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34c70 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
34c80 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
34c90 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
34ca0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
34cb0 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
34cc0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
34cd0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
34ce0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
34cf0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
34d00 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
34d10 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
34d20 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
34d30 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
34d40 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
34d50 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
34d60 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
34d70 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
34d80 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
34d90 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  yRecoverInit = C
34da0 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
34db0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
34dc0 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
34dd0 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65  ver = C_VerifyRe
34de0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
34df0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45  nList->C_DigestE
34e00 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
34e10 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
34e20 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
34e30 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44  List->C_DecryptD
34e40 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
34e50 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
34e60 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
34e70 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79  ist->C_SignEncry
34e80 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  ptUpdate = C_Sig
34e90 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  nEncryptUpdate;.
34ea0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34eb0 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
34ec0 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
34ed0 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  tVerifyUpdate;..
34ee0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34ef0 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43  _GenerateKey = C
34f00 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70  _GenerateKey;..p
34f10 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34f20 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20  GenerateKeyPair 
34f30 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  = C_GenerateKeyP
34f40 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  air;..pFunctionL
34f50 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d  ist->C_WrapKey =
34f60 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75   C_WrapKey;..pFu
34f70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e  nctionList->C_Un
34f80 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72  wrapKey = C_Unwr
34f90 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
34fa0 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b  nList->C_DeriveK
34fb0 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79  ey = C_DeriveKey
34fc0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34fd0 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d  ->C_SeedRandom =
34fe0 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09   C_SeedRandom;..
34ff0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35000 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20  _GenerateRandom 
35010 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  = C_GenerateRand
35020 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
35030 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
35040 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46  nStatus = C_GetF
35050 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09  unctionStatus;..
35060 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35070 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20  _CancelFunction 
35080 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  = C_CancelFuncti
35090 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
350a0 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
350b0 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e  nList = C_GetFun
350c0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70  ctionList;...*pp
350d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70  FunctionList = p
350e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
350f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35100 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
35110 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
35120 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
35130 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a                 KR_OK);.}..