Hex Artifact Content

Artifact 6ee4372cd902e51eab8a154f2665df2a8b738bf6:


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 53 49 47 4e 20 20 20 20 20 20 20 20  STR_SIGN        
0790: 20 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69        0x2A.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47  ne GSCIS_INSTR_G
07b0: 45 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20  ET_PROP         
07c0: 20 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53   0x56.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43  CIS_INSTR_GET_AC
07e0: 52 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43  R           0x4C
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 52 45 41 44 5f 42 55 46 46 45 52  NSTR_READ_BUFFER
0810: 20 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66         0x52.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 53 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20  SIGNDECRYPT     
0840: 20 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20    0x42..#define 
0850: 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45  GSCIS_PARAM_SELE
0860: 43 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78  CT_APPLET     0x
0870: 30 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f  04../** Tags **/
0880: 0a 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a  ./*** CCC Tags *
0890: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
08a0: 53 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20  S_TAG_CARDID    
08b0: 20 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23            0xF0.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20  _CCC_VER        
08e0: 20 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e       0xF1.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF2.#define GSC
0920: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20  IS_TAG_CARDURL  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a             0xF3.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20  G_PKCS15        
0960: 20 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69        0xF4.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47  ne GSCIS_TAG_REG
0980: 5f 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20  _DATA_MODEL     
0990: 20 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53   0xF5.#define GS
09a0: 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c  CIS_TAG_ACR_TABL
09b0: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36  E           0xF6
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20  AG_CARD_APDU    
09e0: 20 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66         0xF7.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45  ine GSCIS_TAG_RE
0a00: 44 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20  DIRECTION       
0a10: 20 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47    0xFA.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20  SCIS_TAG_CT     
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46               0xF
0a40: 42 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  B.#define GSCIS_
0a50: 54 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20  TAG_ST          
0a60: 20 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65          0xFC.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e  fine GSCIS_TAG_N
0a80: 45 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20  EXTCCC          
0a90: 20 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65     0xFD../*** Ge
0aa0: 6e 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20  neral - EF 2200 
0ab0: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
0ac0: 49 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20  IS_TAG_FNAME    
0ad0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a             0x01.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_MNAME         
0b00: 20 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69        0x02.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41  ne GSCIS_TAG_LNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53   0x03.#define GS
0b40: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20  CIS_TAG_SUFFIX  
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34              0x04
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20  AG_GOVT_AGENCY  
0b80: 20 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66         0x05.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0ba0: 52 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20  REAU            
0bb0: 20 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47    0x06.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f  SCIS_TAG_BUREAU_
0bd0: 43 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30  CODE         0x0
0be0: 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  7.#define GSCIS_
0bf0: 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20  TAG_DEPT_CODE   
0c00: 20 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65          0x08.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54  fine GSCIS_TAG_T
0c20: 49 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  ITLE            
0c30: 20 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20     0x09.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49  GSCIS_TAG_BUILDI
0c50: 4e 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78  NG            0x
0c60: 31 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  10.#define GSCIS
0c70: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
0c80: 31 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64  1        0x11.#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 32 20 20 20 20  OFFICE_ADDR2    
0cb0: 20 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65      0x12.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30  E_CITY         0
0ce0: 78 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x13.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41  S_TAG_OFFICE_STA
0d00: 54 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23  TE        0x14.#
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 5a 49 50 20 20 20 20 20  _OFFICE_ZIP     
0d30: 20 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e       0x15.#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 43 4f 55 4e 54 52 59 20 20 20 20 20 20  CE_COUNTRY      
0d60: 30 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x16.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
0d80: 4f 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a  ONE        0x17.
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 5f 45  G_OFFICE_PHONE_E
0db0: 58 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69  XT    0x18.#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 46 41 58 20 20 20 20 20 20 20 20 20  ICE_FAX         
0de0: 20 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53   0x19.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45  CIS_TAG_OFFICE_E
0e00: 4d 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41  MAIL        0x1A
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 52 4f 4f 4d 20 20  AG_OFFICE_ROOM  
0e30: 20 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66         0x1B.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f  ine GSCIS_TAG_NO
0e50: 4e 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20  NGOV_AGENCY     
0e60: 20 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47    0x1C.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53  SCIS_TAG_SSN_DES
0e80: 49 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31  IGNATOR      0x1
0e90: 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46  D../*** PII - EF
0ea0: 20 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69   2100 ***/.#defi
0eb0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53   0x20.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20  CIS_TAG_DOB     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31              0x21
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20  AG_GENDER       
0f20: 20 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a         0x22../**
0f30: 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74  * Login Informat
0f40: 69 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a  ion - EF 4000 **
0f50: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0f60: 5f 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20  _TAG_USERID     
0f70: 20 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64           0x40.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 44 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20  DOMAIN          
0fa0: 20 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65      0x41.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57   GSCIS_TAG_PASSW
0fc0: 4f 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30  ORD            0
0fd0: 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49  x42../*** Card I
0fe0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20  nformation - EF 
0ff0: 35 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  5000 ***/.#defin
1000: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
1010: 45 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20  ERID            
1020: 30 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x50.#define GSC
1030: 49 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20  IS_TAG_SERNO    
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a             0x51.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  G_ISSUE_DATE    
1070: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50  ne GSCIS_TAG_EXP
1090: 49 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20  IRE_DATE        
10a0: 20 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53   0x53.#define GS
10b0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
10c0: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34  E           0x54
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45  AG_SECURITY_CODE
10f0: 20 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66         0x57.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
1110: 52 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20  RDID_AID        
1120: 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56    0x58../*** PIV
1130: 20 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66   Codes ***/.#def
1140: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1150: 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54  _3_INSTR_GET_DAT
1160: 41 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e  A 0xCB.#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 4e 41 55 54 48 20 20 30 78 38  STR_GENAUTH  0x8
1190: 37 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f  7../*** PKI Info
11a0: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30  rmation - EF 700
11b0: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
11c0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
11d0: 43 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37  CATE         0x7
11e0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
1200: 41 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65  ATE     0x71.#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 45 58 50 49 52 45 5f 44 41 54 45 20  ERT_EXPIRE_DATE 
1230: 20 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70     0x72../** App
1240: 6c 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66  let IDs **/.#def
1250: 69 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43  ine GSCIS_AID_CC
1260: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C               
1270: 20 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78    0xA0, 0x00, 0x
1280: 30 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20  00, 0x01, 0x16, 
1290: 30 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69  0xDB, 0x00.#defi
12a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
12b0: 33 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20  3_PIV_AID       
12c0: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
12d0: 30 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30  0, 0x03, 0x08, 0
12e0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c  x00, 0x00, 0x10,
12f0: 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30   0x00, 0x01, 0x0
1300: 30 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f  0../* PIV IDs */
1310: 0a 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66  ./** Key Identif
1320: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1330: 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d  0-78-3, Table 6-
1340: 31 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49  1 **/.#define NI
1350: 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
1360: 5f 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a  _PIVAUTH   0x9A.
1370: 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30  #define NISTSP80
1380: 30 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41  0_78_3_KEY_SIGNA
1390: 54 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e  TURE 0x9C.#defin
13a0: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
13b0: 5f 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30  _KEY_KEYMGT    0
13c0: 78 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x9D.#define NIST
13d0: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43  SP800_78_3_KEY_C
13e0: 41 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f  ARDAUTH  0x9E../
13f0: 2a 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65  ** Algorithm Ide
1400: 6e 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53  ntifiers (NIST S
1410: 50 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c  P 800-78-3, Tabl
1420: 65 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e  e 6-2 **/.#defin
1430: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
1440: 5f 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30  _ALGO_RSA1024  0
1450: 78 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x06.#define NIST
1460: 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f  SP800_78_3_ALGO_
1470: 52 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f  RSA2048  0x07../
1480: 2a 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69  ** Object Identi
1490: 66 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38  fiers (NIST SP 8
14a0: 30 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20  00-73-3 Part 1, 
14b0: 54 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65  Table 2) **/.#de
14c0: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37  fine NISTSP800_7
14d0: 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20  3_3_OID_PIVAUTH 
14e0: 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78    0x5F, 0xC1, 0x
14f0: 30 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  05.#define NISTS
1500: 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49  P800_73_3_OID_SI
1510: 47 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78  GNATURE 0x5F, 0x
1520: 43 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65  C1, 0x0A.#define
1530: 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
1540: 4f 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  OID_KEYMGT    0x
1550: 35 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23  5F, 0xC1, 0x0B.#
1560: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1570: 5f 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55  _73_3_OID_CARDAU
1580: 54 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20  TH  0x5F, 0xC1, 
1590: 30 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d  0x01../* Maximum
15a0: 20 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f   size of data po
15b0: 72 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a  rtion of APDUs *
15c0: 2f 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74  /./** Do not set
15d0: 20 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20   this above 250 
15e0: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b  **/.#define CACK
15f0: 45 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20  EY_APDU_MTU     
1600: 20 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f            250../
1610: 2a 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61  * ATR If not ava
1620: 69 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65  ilable */.#ifnde
1630: 66 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23  f MAX_ATR_SIZE.#
1640: 64 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53  define MAX_ATR_S
1650: 49 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a  IZE 1024.#endif.
1660: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
1670: 45 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41  EBUG.#  ifdef HA
1680: 56 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69  VE_TIME_H.#    i
1690: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
16a0: 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61  static time_t ca
16b0: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
16c0: 5f 74 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69  _time = 0;.stati
16d0: 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
16e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54  CACKEY_DEBUG_GET
16f0: 54 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09 69 66  TIME(void) {..if
1700: 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73   (cackey_debug_s
1710: 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29 20  tart_time == 0) 
1720: 7b 0a 09 09 63 61 63 6b 65 79 5f 64 65 62 75 67  {...cackey_debug
1730: 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69  _start_time = ti
1740: 6d 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72  me(NULL);..}...r
1750: 65 74 75 72 6e 28 74 69 6d 65 28 4e 55 4c 4c 29  eturn(time(NULL)
1760: 20 2d 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f   - cackey_debug_
1770: 73 74 61 72 74 5f 74 69 6d 65 29 3b 0a 7d 0a 23  start_time);.}.#
1780: 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20 75 6e    else.static un
1790: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b  signed long CACK
17a0: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
17b0: 28 76 6f 69 64 29 20 7b 0a 09 72 65 74 75 72 6e  (void) {..return
17c0: 28 30 29 3b 0a 7d 0a 23 20 20 65 6e 64 69 66 0a  (0);.}.#  endif.
17d0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
17e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78  Y_DEBUG_PRINTF(x
17f0: 2e 2e 2e 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  ...) { \..static
1800: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1810: 30 39 36 5d 20 3d 20 7b 30 7d 3b 20 5c 0a 09 73  096] = {0}; \..s
1820: 6e 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72  nprintf(buf_user
1830: 2c 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  , sizeof(buf_use
1840: 72 29 2c 20 78 29 3b 20 5c 0a 09 62 75 66 5f 75  r), x); \..buf_u
1850: 73 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75  ser[sizeof(buf_u
1860: 73 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27  ser) - 1] = '\0'
1870: 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63  ; \..fprintf(cac
1880: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
1890: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a  "[%lu]: %s():%i:
18a0: 20 25 73 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44   %s\n", CACKEY_D
18b0: 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20  EBUG_GETTIME(), 
18c0: 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45  __func__, __LINE
18d0: 5f 5f 2c 20 62 75 66 5f 75 73 65 72 29 3b 20 5c  __, buf_user); \
18e0: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
18f0: 64 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d  debug_fd()); \.}
1900: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
1910: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
1920: 28 66 2c 20 78 2c 20 79 29 20 7b 20 5c 0a 09 73  (f, x, y) { \..s
1930: 74 61 74 69 63 20 63 68 61 72 20 62 75 66 5f 75  tatic char buf_u
1940: 73 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 2c  ser[4096] = {0},
1950: 20 2a 62 75 66 5f 75 73 65 72 5f 70 3b 20 5c 0a   *buf_user_p; \.
1960: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62  .unsigned long b
1970: 75 66 5f 75 73 65 72 5f 73 69 7a 65 3b 20 5c 0a  uf_user_size; \.
1980: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
1990: 54 4d 50 42 55 46 3b 20 5c 0a 09 75 6e 73 69 67  TMPBUF; \..unsig
19a0: 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a  ned long idx; \.
19b0: 09 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72 65  .int snprintf_re
19c0: 74 3b 20 5c 0a 09 54 4d 50 42 55 46 20 3d 20 28  t; \..TMPBUF = (
19d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
19e0: 20 28 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65   (x); \..buf_use
19f0: 72 5b 30 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66  r[0] = 0; \..buf
1a00: 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73  _user_p = buf_us
1a10: 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f  er; \..buf_user_
1a20: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75  size = sizeof(bu
1a30: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20  f_user); \..for 
1a40: 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20  (idx = 1; idx < 
1a50: 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a  (y); idx++) { \.
1a60: 09 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73  ..if (buf_user_s
1a70: 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09  ize <= 0) { \...
1a80: 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c  .break; \...}; \
1a90: 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  ...snprintf_ret 
1aa0: 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75  = snprintf(buf_u
1ab0: 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f  ser_p, buf_user_
1ac0: 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20  size, ", %02x", 
1ad0: 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a  TMPBUF[idx]); \.
1ae0: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72  ..if (snprintf_r
1af0: 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09  et <= 0) { \....
1b00: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a  break; \...}; \.
1b10: 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20  ..buf_user_p += 
1b20: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
1b30: 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1b40: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b  -= snprintf_ret;
1b50: 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73   \..}; \..buf_us
1b60: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
1b70: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1b80: 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b   \..fprintf(cack
1b90: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1ba0: 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20  [%lu]: %s():%i: 
1bb0: 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25  %s  (%s/%lu = {%
1bc0: 30 32 78 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b  02x%s})\n", CACK
1bd0: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
1be0: 28 29 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f  (), __func__, __
1bf0: 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28  LINE__, f, #x, (
1c00: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
1c10: 79 29 2c 20 54 4d 50 42 55 46 5b 30 5d 2c 20 62  y), TMPBUF[0], b
1c20: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1c30: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1c40: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1c50: 65 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b 20  efine free(x) { 
1c60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c70: 4e 54 46 28 22 46 52 45 45 28 25 70 29 20 28 25  NTF("FREE(%p) (%
1c80: 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78 2c  s)", (void *) x,
1c90: 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20 7d   #x); free(x); }
1ca0: 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 63  ..static FILE *c
1cb0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 76  ackey_debug_fd(v
1cc0: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 46  oid) {..static F
1cd0: 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b 0a  ILE *fd = NULL;.
1ce0: 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b 0a  .char *logfile;.
1cf0: 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c 4c  ..if (fd != NULL
1d00: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 29  ) {...return(fd)
1d10: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c 6f  ;..}.../*.. * Lo
1d20: 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69 74  g to stderr init
1d30: 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e 20  ially so we can 
1d40: 75 73 65 20 64 65 62 75 67 67 69 6e 67 20 77 69  use debugging wi
1d50: 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66 75  thin.. * this fu
1d60: 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 67  nction without g
1d70: 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20 69  etting into an i
1d80: 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20 2a  nfinite loop.. *
1d90: 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b 0a  /..fd = stderr;.
1da0: 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65  ..logfile = gete
1db0: 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47  nv("CACKEY_DEBUG
1dc0: 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66 20  _LOGFILE");..if 
1dd0: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1de0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1df0: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1e00: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
1e10: 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66  iable: %s", logf
1e20: 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c 65  ile);....logfile
1e30: 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69 6c   = strchr(logfil
1e40: 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28 6c  e, '=');...if (l
1e50: 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  ogfile == NULL) 
1e60: 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20 67  {....logfile = g
1e70: 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45  etenv("CACKEY_DE
1e80: 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09  BUG_LOGFILE");..
1e90: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f 67  .} else {....log
1ea0: 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a  file++;...}..}..
1eb0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1ec0: 42 55 47 5f 4c 4f 47 46 49 4c 45 0a 09 69 66 20  BUG_LOGFILE..if 
1ed0: 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (logfile == NULL
1ee0: 29 20 7b 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20  ) {...logfile = 
1ef0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1f00: 46 49 4c 45 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  FILE;..}.#endif.
1f10: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1f20: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1f30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f40: 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20  Found log file: 
1f50: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1f60: 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67  ..fd = fopen(log
1f70: 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a  file, "a");..}..
1f80: 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29  .if (fd == NULL)
1f90: 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72   {...fd = stderr
1fa0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d  ;..}...if (fd ==
1fb0: 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43   stderr) {...CAC
1fc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fd0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65  ("Returning stde
1fe0: 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  rr");..} else {.
1ff0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2000: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2010: 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66   %p", (void *) f
2020: 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  d);..}...return(
2030: 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  fd);.}..static v
2040: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
2050: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69  G_FUNC_MALLOC(si
2060: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74  ze_t size, const
2070: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74   char *func, int
2080: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a   line) {..void *
2090: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
20a0: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b   = malloc(size);
20b0: 0a 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65  ...fprintf(cacke
20c0: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b  y_debug_fd(), "[
20d0: 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 4d  %lu]: %s():%i: M
20e0: 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e 22 2c  ALLOC() = %p\n",
20f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45   CACKEY_DEBUG_GE
2100: 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c  TTIME(), func, l
2110: 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66  ine, retval);..f
2120: 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62  flush(cackey_deb
2130: 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74 75  ug_fd());...retu
2140: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
2150: 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b  tatic void *CACK
2160: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45  EY_DEBUG_FUNC_RE
2170: 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c  ALLOC(void *ptr,
2180: 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f   size_t size, co
2190: 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20  nst char *func, 
21a0: 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69  int line) {..voi
21b0: 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74  d *retval;...ret
21c0: 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74  val = realloc(pt
21d0: 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28  r, size);...if (
21e0: 72 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b  retval != ptr) {
21f0: 0a 09 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65  ...fprintf(cacke
2200: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b  y_debug_fd(), "[
2210: 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 52  %lu]: %s():%i: R
2220: 45 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25 70 5c  EALLOC(%p) = %p\
2230: 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  n", CACKEY_DEBUG
2240: 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63  _GETTIME(), func
2250: 2c 20 6c 69 6e 65 2c 20 70 74 72 2c 20 72 65 74  , line, ptr, ret
2260: 76 61 6c 29 3b 0a 09 09 66 66 6c 75 73 68 28 63  val);...fflush(c
2270: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
2280: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76  );..}...if (retv
2290: 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  al == NULL) {...
22a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22b0: 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f 52 20  NTF(" *** ERROR 
22c0: 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65 74 75  *** realloc retu
22d0: 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a 65 20  rned NULL (size 
22e0: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
22f0: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a  ed long) size);.
2300: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
2310: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  al);.}..static c
2320: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
2330: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 63 6f  G_FUNC_STRDUP(co
2340: 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c 20 63  nst char *ptr, c
2350: 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c  onst char *func,
2360: 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 63 68   int line) {..ch
2370: 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65  ar *retval;...re
2380: 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28 70 74  tval = strdup(pt
2390: 72 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 63 61  r);...fprintf(ca
23a0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
23b0: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69   "[%lu]: %s():%i
23c0: 3a 20 53 54 52 44 55 50 5f 4d 41 4c 4c 4f 43 28  : STRDUP_MALLOC(
23d0: 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45  ) = %p\n", CACKE
23e0: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
23f0: 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72  ), func, line, r
2400: 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28  etval);..fflush(
2410: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2420: 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ));...return(ret
2430: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
2440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
2450: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
2460: 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65  G_TO_STR(unsigne
2470: 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73  d char tag) {..s
2480: 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09  witch (tag) {...
2490: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
24a0: 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  ARDID:....return
24b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
24c0: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ID");...case GSC
24d0: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a  IS_TAG_CCC_VER:.
24e0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
24f0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a  _TAG_CCC_VER");.
2500: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2510: 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74  _CCG_VER:....ret
2520: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2530: 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  CG_VER");...case
2540: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
2550: 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  RL:....return("G
2560: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
2570: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2580: 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09  _TAG_PKCS15:....
2590: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
25a0: 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61  G_PKCS15");...ca
25b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47  se GSCIS_TAG_REG
25c0: 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09  _DATA_MODEL:....
25d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
25e0: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
25f0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2600: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a  _TAG_ACR_TABLE:.
2610: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2620: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29  _TAG_ACR_TABLE")
2630: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2640: 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09  AG_CARD_APDU:...
2650: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2660: 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a  AG_CARD_APDU");.
2670: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2680: 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09  _REDIRECTION:...
2690: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
26a0: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29  AG_REDIRECTION")
26b0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
26c0: 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e  AG_CT:....return
26d0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29  ("GSCIS_TAG_CT")
26e0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
26f0: 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e  AG_ST:....return
2700: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29  ("GSCIS_TAG_ST")
2710: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2720: 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72  AG_NEXTCCC:....r
2730: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2740: 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61  _NEXTCCC");...ca
2750: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41  se GSCIS_TAG_FNA
2760: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ME:....return("G
2770: 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29  SCIS_TAG_FNAME")
2780: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2790: 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74  AG_MNAME:....ret
27a0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d  urn("GSCIS_TAG_M
27b0: 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47  NAME");...case G
27c0: 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a  SCIS_TAG_LNAME:.
27d0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
27e0: 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09  _TAG_LNAME");...
27f0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2800: 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e  UFFIX:....return
2810: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  ("GSCIS_TAG_SUFF
2820: 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  IX");...case GSC
2830: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
2840: 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  CY:....return("G
2850: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47  SCIS_TAG_GOVT_AG
2860: 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47  ENCY");...case G
2870: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a  SCIS_TAG_BUREAU:
2880: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2890: 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a  S_TAG_BUREAU");.
28a0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
28b0: 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09  _BUREAU_CODE:...
28c0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
28d0: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29  AG_BUREAU_CODE")
28e0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
28f0: 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09  AG_DEPT_CODE:...
2900: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2910: 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a  AG_DEPT_CODE");.
2920: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2930: 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72  _TITLE:....retur
2940: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54  n("GSCIS_TAG_TIT
2950: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  LE");...case GSC
2960: 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a  IS_TAG_BUILDING:
2970: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2980: 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29  S_TAG_BUILDING")
2990: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
29a0: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a  AG_OFFICE_ADDR1:
29b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
29c0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
29d0: 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  R1");...case GSC
29e0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44  IS_TAG_OFFICE_AD
29f0: 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DR2:....return("
2a00: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2a10: 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65  _ADDR2");...case
2a20: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2a30: 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72  E_CITY:....retur
2a40: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2a50: 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61  ICE_CITY");...ca
2a60: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2a70: 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65  ICE_STATE:....re
2a80: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2a90: 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a  OFFICE_STATE");.
2aa0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2ab0: 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09  _OFFICE_ZIP:....
2ac0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2ad0: 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a  G_OFFICE_ZIP");.
2ae0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2af0: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a  _OFFICE_COUNTRY:
2b00: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2b10: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
2b20: 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47  NTRY");...case G
2b30: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2b40: 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e  PHONE:....return
2b50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2b60: 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61  CE_PHONE");...ca
2b70: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2b80: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09  ICE_PHONE_EXT:..
2b90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2ba0: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2bb0: 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47  _EXT");...case G
2bc0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2bd0: 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FAX:....return("
2be0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2bf0: 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47  _FAX");...case G
2c00: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2c10: 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e  EMAIL:....return
2c20: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2c30: 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61  CE_EMAIL");...ca
2c40: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2c50: 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74  ICE_ROOM:....ret
2c60: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2c70: 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09  FFICE_ROOM");...
2c80: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e  case GSCIS_TAG_N
2c90: 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09  ONGOV_AGENCY:...
2ca0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2cb0: 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59  AG_NONGOV_AGENCY
2cc0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2cd0: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2ce0: 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TOR:....return("
2cf0: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
2d00: 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61  SIGNATOR");...ca
2d10: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  se GSCIS_TAG_SSN
2d20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2d30: 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09  IS_TAG_SSN");...
2d40: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44  case GSCIS_TAG_D
2d50: 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OB:....return("G
2d60: 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a  SCIS_TAG_DOB");.
2d70: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2d80: 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75  _GENDER:....retu
2d90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45  rn("GSCIS_TAG_GE
2da0: 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47  NDER");...case G
2db0: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a  SCIS_TAG_USERID:
2dc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2dd0: 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a  S_TAG_USERID");.
2de0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2df0: 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75  _DOMAIN:....retu
2e00: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2e10: 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47  MAIN");...case G
2e20: 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52  SCIS_TAG_PASSWOR
2e30: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
2e40: 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44  CIS_TAG_PASSWORD
2e50: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2e60: 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09  _TAG_ISSUERID:..
2e70: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2e80: 54 41 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a  TAG_ISSUERID");.
2e90: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2ea0: 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72  _SERNO:....retur
2eb0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52  n("GSCIS_TAG_SER
2ec0: 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  NO");...case GSC
2ed0: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54  IS_TAG_ISSUE_DAT
2ee0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2ef0: 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41  CIS_TAG_ISSUE_DA
2f00: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TE");...case GSC
2f10: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41  IS_TAG_EXPIRE_DA
2f20: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
2f30: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f  SCIS_TAG_EXPIRE_
2f40: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
2f50: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59  SCIS_TAG_CARD_TY
2f60: 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  PE:....return("G
2f70: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59  SCIS_TAG_CARD_TY
2f80: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  PE");...case GSC
2f90: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
2fa0: 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  CODE:....return(
2fb0: 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52  "GSCIS_TAG_SECUR
2fc0: 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61  ITY_CODE");...ca
2fd0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2fe0: 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75  DID_AID:....retu
2ff0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
3000: 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61  RDID_AID");...ca
3010: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
3020: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74  TIFICATE:....ret
3030: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
3040: 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09  ERTIFICATE");...
3050: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
3060: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a  ERT_ISSUE_DATE:.
3070: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
3080: 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f  _TAG_CERT_ISSUE_
3090: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
30a0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58  SCIS_TAG_CERT_EX
30b0: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  PIRE_DATE:....re
30c0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
30d0: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45  CERT_EXPIRE_DATE
30e0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
30f0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
3100: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3110: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3120: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
3130: 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65  STR(LONG retcode
3140: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74  ) {..switch (ret
3150: 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53  code) {...case S
3160: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a  CARD_S_SUCCESS:.
3170: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3180: 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09  _S_SUCCESS");...
3190: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e  case SCARD_E_CAN
31a0: 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72  CELLED:....retur
31b0: 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45  n("SCARD_E_CANCE
31c0: 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  LLED");...case S
31d0: 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50  CARD_E_CANT_DISP
31e0: 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OSE:....return("
31f0: 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53  SCARD_E_CANT_DIS
3200: 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53  POSE");...case S
3210: 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49  CARD_E_INSUFFICI
3220: 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72  ENT_BUFFER:....r
3230: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3240: 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46  NSUFFICIENT_BUFF
3250: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
3260: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52  RD_E_INVALID_ATR
3270: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3280: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52  RD_E_INVALID_ATR
3290: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
32a0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
32b0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
32c0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
32d0: 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53  NDLE");...case S
32e0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50  CARD_E_INVALID_P
32f0: 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74  ARAMETER:....ret
3300: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
3310: 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29  ALID_PARAMETER")
3320: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3330: 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a  _INVALID_TARGET:
3340: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3350: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47  D_E_INVALID_TARG
3360: 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ET");...case SCA
3370: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c  RD_E_INVALID_VAL
3380: 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  UE:....return("S
3390: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56  CARD_E_INVALID_V
33a0: 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53  ALUE");...case S
33b0: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59  CARD_E_NO_MEMORY
33c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
33d0: 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29  RD_E_NO_MEMORY")
33e0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
33f0: 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a  _UNKNOWN_READER:
3400: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3410: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44  D_E_UNKNOWN_READ
3420: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
3430: 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09  RD_E_TIMEOUT:...
3440: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3450: 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61  _TIMEOUT");...ca
3460: 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49  se SCARD_E_SHARI
3470: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09  NG_VIOLATION:...
3480: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3490: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49  _SHARING_VIOLATI
34a0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ON");...case SCA
34b0: 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52  RD_E_NO_SMARTCAR
34c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
34d0: 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41  ARD_E_NO_SMARTCA
34e0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
34f0: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52  RD_E_UNKNOWN_CAR
3500: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3510: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41  ARD_E_UNKNOWN_CA
3520: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
3530: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
3540: 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TCH:....return("
3550: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
3560: 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65  SMATCH");...case
3570: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41   SCARD_E_NOT_REA
3580: 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  DY:....return("S
3590: 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59  CARD_E_NOT_READY
35a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
35b0: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
35c0: 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  LED:....return("
35d0: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
35e0: 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61  ANCELLED");...ca
35f0: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54  se SCARD_E_NOT_T
3600: 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65  RANSACTED:....re
3610: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3620: 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a  T_TRANSACTED");.
3630: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52  ..case SCARD_E_R
3640: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c  EADER_UNAVAILABL
3650: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
3660: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41  ARD_E_READER_UNA
3670: 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61  VAILABLE");...ca
3680: 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  se SCARD_W_UNSUP
3690: 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09  PORTED_CARD:....
36a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
36b0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
36c0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
36d0: 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f  _W_UNRESPONSIVE_
36e0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
36f0: 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f  "SCARD_W_UNRESPO
3700: 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09  NSIVE_CARD");...
3710: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50  case SCARD_W_UNP
3720: 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09  OWERED_CARD:....
3730: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3740: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29  UNPOWERED_CARD")
3750: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  ;...case SCARD_W
3760: 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09  _RESET_CARD:....
3770: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3780: 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09  RESET_CARD");...
3790: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d  case SCARD_W_REM
37a0: 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  OVED_CARD:....re
37b0: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45  turn("SCARD_W_RE
37c0: 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09  MOVED_CARD");...
37d0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49  case SCARD_E_PCI
37e0: 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72  _TOO_SMALL:....r
37f0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50  eturn("SCARD_E_P
3800: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a  CI_TOO_SMALL");.
3810: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52  ..case SCARD_E_R
3820: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45  EADER_UNSUPPORTE
3830: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3840: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53  ARD_E_READER_UNS
3850: 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61  UPPORTED");...ca
3860: 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  se SCARD_E_DUPLI
3870: 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09  CATE_READER:....
3880: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3890: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
38a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
38b0: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
38c0: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
38d0: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
38e0: 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61  UPPORTED");...ca
38f0: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45  se SCARD_E_NO_SE
3900: 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e  RVICE:....return
3910: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52  ("SCARD_E_NO_SER
3920: 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53  VICE");...case S
3930: 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53  CARD_E_SERVICE_S
3940: 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72  TOPPED:....retur
3950: 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49  n("SCARD_E_SERVI
3960: 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09  CE_STOPPED");...
3970: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53  case SCARD_E_UNS
3980: 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45  UPPORTED_FEATURE
3990: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
39a0: 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_E_UNSUPPORTED
39b0: 5f 46 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64  _FEATURE");.#ifd
39c0: 65 66 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52  ef SCARD_W_INSER
39d0: 54 45 44 5f 43 41 52 44 0a 09 09 63 61 73 65 20  TED_CARD...case 
39e0: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
39f0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3a00: 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  ("SCARD_W_INSERT
3a10: 45 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e 64 69  ED_CARD");.#endi
3a20: 66 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 45  f.#ifdef SCARD_E
3a30: 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49  _NO_READERS_AVAI
3a40: 4c 41 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41  LABLE...case SCA
3a50: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f  RD_E_NO_READERS_
3a60: 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65  AVAILABLE:....re
3a70: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3a80: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42  _READERS_AVAILAB
3a90: 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  LE");.#endif..}.
3aa0: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
3ab0: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
3ac0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3ad0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
3ae0: 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36  ID_TO_STR(uint16
3af0: 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69  _t objid) {..swi
3b00: 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09  tch (objid) {...
3b10: 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09  case 0x2000:....
3b20: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3b30: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c  LV_OBJID_GENERAL
3b40: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3b50: 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x2100:....return
3b60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3b70: 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e  ID_PROPERSONALIN
3b80: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33  FO");...case 0x3
3b90: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3ba0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3bb0: 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29  _ACCESSCONTROL")
3bc0: 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30 30 3a  ;...case 0x4000:
3bd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3be0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47  EY_TLV_OBJID_LOG
3bf0: 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35  IN");...case 0x5
3c00: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3c10: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3c20: 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63  _CARDINFO");...c
3c30: 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72  ase 0x6000:....r
3c40: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c50: 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49  V_OBJID_BIOMETRI
3c60: 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37  CS");...case 0x7
3c70: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3c80: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3c90: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 22  _DIGITALSIGCERT"
3ca0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 30  );...case 0x0200
3cb0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3cc0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3cd0: 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61  C_PERSON");...ca
3ce0: 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65  se 0x0202:....re
3cf0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d00: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46  _OBJID_CAC_BENEF
3d10: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ITS");...case 0x
3d20: 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0203:....return(
3d30: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d40: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46  D_CAC_OTHERBENEF
3d50: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ITS");...case 0x
3d60: 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0201:....return(
3d70: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d80: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22  D_CAC_PERSONNEL"
3d90: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 46 45  );...case 0x02FE
3da0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3db0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3dc0: 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a  C_PKICERT");..}.
3dd0: 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f  ...return("UNKNO
3de0: 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  WN");.}..static 
3df0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
3e00: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
3e10: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e  PTYPE_TO_STR(uin
3e20: 74 38 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a  t8_t apptype) {.
3e30: 09 73 77 69 74 63 68 20 28 61 70 70 74 79 70 65  .switch (apptype
3e40: 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a  ) {...case 0x00:
3e50: 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45  ....return("NONE
3e60: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a  ");...case 0x01:
3e70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3e80: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3e90: 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  IC");...case 0x0
3ea0: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  2:....return("CA
3eb0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
3ec0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a  ");...case 0x03:
3ed0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3ee0: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3ef0: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
3f00: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
3f10: 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72  e 0x04:....retur
3f20: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3f30: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
3f40: 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x05:....return(
3f50: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3f60: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
3f70: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3f80: 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09  ..case 0x06:....
3f90: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3fa0: 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43  LV_APP_SKI | CAC
3fb0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
3fc0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a  );...case 0x07:.
3fd0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3fe0: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3ff0: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
4000: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
4010: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
4020: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41  }...return("INVA
4030: 4c 49 44 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  LID");.}..static
4040: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
4050: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
4060: 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28  TTRIBUTE_TO_STR(
4070: 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  CK_ATTRIBUTE_TYP
4080: 45 20 61 74 74 72 29 20 7b 0a 09 73 77 69 74 63  E attr) {..switc
4090: 68 20 28 61 74 74 72 29 20 7b 0a 09 09 63 61 73  h (attr) {...cas
40a0: 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09  e CKA_CLASS:....
40b0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4c 41 53  return("CKA_CLAS
40c0: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
40d0: 54 4f 4b 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e  TOKEN:....return
40e0: 28 22 43 4b 41 5f 54 4f 4b 45 4e 22 29 3b 0a 09  ("CKA_TOKEN");..
40f0: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54  .case CKA_PRIVAT
4100: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4110: 41 5f 50 52 49 56 41 54 45 22 29 3b 0a 09 09 63  A_PRIVATE");...c
4120: 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09  ase CKA_LABEL:..
4130: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 41  ..return("CKA_LA
4140: 42 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  BEL");...case CK
4150: 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 3a 0a 09  A_APPLICATION:..
4160: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 50  ..return("CKA_AP
4170: 50 4c 49 43 41 54 49 4f 4e 22 29 3b 0a 09 09 63  PLICATION");...c
4180: 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09  ase CKA_VALUE:..
4190: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41  ..return("CKA_VA
41a0: 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  LUE");...case CK
41b0: 41 5f 4f 42 4a 45 43 54 5f 49 44 3a 0a 09 09 09  A_OBJECT_ID:....
41c0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 42 4a 45  return("CKA_OBJE
41d0: 43 54 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20  CT_ID");...case 
41e0: 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
41f0: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
4200: 22 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45  "CKA_CERTIFICATE
4210: 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20  _TYPE");...case 
4220: 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 72  CKA_ISSUER:....r
4230: 65 74 75 72 6e 28 22 43 4b 41 5f 49 53 53 55 45  eturn("CKA_ISSUE
4240: 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  R");...case CKA_
4250: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09  SERIAL_NUMBER:..
4260: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45  ..return("CKA_SE
4270: 52 49 41 4c 5f 4e 55 4d 42 45 52 22 29 3b 0a 09  RIAL_NUMBER");..
4280: 09 63 61 73 65 20 43 4b 41 5f 41 43 5f 49 53 53  .case CKA_AC_ISS
4290: 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UER:....return("
42a0: 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 22 29 3b  CKA_AC_ISSUER");
42b0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 57 4e 45  ...case CKA_OWNE
42c0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
42d0: 41 5f 4f 57 4e 45 52 22 29 3b 0a 09 09 63 61 73  A_OWNER");...cas
42e0: 65 20 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53  e CKA_ATTR_TYPES
42f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4300: 5f 41 54 54 52 5f 54 59 50 45 53 22 29 3b 0a 09  _ATTR_TYPES");..
4310: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45  .case CKA_TRUSTE
4320: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4330: 41 5f 54 52 55 53 54 45 44 22 29 3b 0a 09 09 63  A_TRUSTED");...c
4340: 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ase CKA_KEY_TYPE
4350: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4360: 5f 4b 45 59 5f 54 59 50 45 22 29 3b 0a 09 09 63  _KEY_TYPE");...c
4370: 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a  ase CKA_SUBJECT:
4380: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4390: 53 55 42 4a 45 43 54 22 29 3b 0a 09 09 63 61 73  SUBJECT");...cas
43a0: 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 72 65 74  e CKA_ID:....ret
43b0: 75 72 6e 28 22 43 4b 41 5f 49 44 22 29 3b 0a 09  urn("CKA_ID");..
43c0: 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54  .case CKA_SENSIT
43d0: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
43e0: 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 22 29 3b  CKA_SENSITIVE");
43f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 43 52  ...case CKA_ENCR
4400: 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPT:....return("
4410: 43 4b 41 5f 45 4e 43 52 59 50 54 22 29 3b 0a 09  CKA_ENCRYPT");..
4420: 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50  .case CKA_DECRYP
4430: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4440: 41 5f 44 45 43 52 59 50 54 22 29 3b 0a 09 09 63  A_DECRYPT");...c
4450: 61 73 65 20 43 4b 41 5f 57 52 41 50 3a 0a 09 09  ase CKA_WRAP:...
4460: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 57 52 41  .return("CKA_WRA
4470: 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  P");...case CKA_
4480: 55 4e 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72  UNWRAP:....retur
4490: 6e 28 22 43 4b 41 5f 55 4e 57 52 41 50 22 29 3b  n("CKA_UNWRAP");
44a0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
44b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
44c0: 5f 53 49 47 4e 22 29 3b 0a 09 09 63 61 73 65 20  _SIGN");...case 
44d0: 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
44e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
44f0: 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 22 29 3b  _SIGN_RECOVER");
4500: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49  ...case CKA_VERI
4510: 46 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  FY:....return("C
4520: 4b 41 5f 56 45 52 49 46 59 22 29 3b 0a 09 09 63  KA_VERIFY");...c
4530: 61 73 65 20 43 4b 41 5f 56 45 52 49 46 59 5f 52  ase CKA_VERIFY_R
4540: 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72  ECOVER:....retur
4550: 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 5f 52 45  n("CKA_VERIFY_RE
4560: 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  COVER");...case 
4570: 43 4b 41 5f 44 45 52 49 56 45 3a 0a 09 09 09 72  CKA_DERIVE:....r
4580: 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 52 49 56  eturn("CKA_DERIV
4590: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
45a0: 53 54 41 52 54 5f 44 41 54 45 3a 0a 09 09 09 72  START_DATE:....r
45b0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 54 41 52 54  eturn("CKA_START
45c0: 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  _DATE");...case 
45d0: 43 4b 41 5f 45 4e 44 5f 44 41 54 45 3a 0a 09 09  CKA_END_DATE:...
45e0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 44  .return("CKA_END
45f0: 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  _DATE");...case 
4600: 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
4610: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55  return("CKA_MODU
4620: 4c 55 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  LUS");...case CK
4630: 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53 3a 0a  A_MODULUS_BITS:.
4640: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d  ...return("CKA_M
4650: 4f 44 55 4c 55 53 5f 42 49 54 53 22 29 3b 0a 09  ODULUS_BITS");..
4660: 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43  .case CKA_PUBLIC
4670: 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65  _EXPONENT:....re
4680: 74 75 72 6e 28 22 43 4b 41 5f 50 55 42 4c 49 43  turn("CKA_PUBLIC
4690: 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63  _EXPONENT");...c
46a0: 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 5f  ase CKA_PRIVATE_
46b0: 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74  EXPONENT:....ret
46c0: 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45  urn("CKA_PRIVATE
46d0: 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63  _EXPONENT");...c
46e0: 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 31 3a  ase CKA_PRIME_1:
46f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4700: 50 52 49 4d 45 5f 31 22 29 3b 0a 09 09 63 61 73  PRIME_1");...cas
4710: 65 20 43 4b 41 5f 50 52 49 4d 45 5f 32 3a 0a 09  e CKA_PRIME_2:..
4720: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
4730: 49 4d 45 5f 32 22 29 3b 0a 09 09 63 61 73 65 20  IME_2");...case 
4740: 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 3a 0a  CKA_EXPONENT_1:.
4750: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4760: 58 50 4f 4e 45 4e 54 5f 31 22 29 3b 0a 09 09 63  XPONENT_1");...c
4770: 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  ase CKA_EXPONENT
4780: 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  _2:....return("C
4790: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 22 29 3b  KA_EXPONENT_2");
47a0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4f 45 46  ...case CKA_COEF
47b0: 46 49 43 49 45 4e 54 3a 0a 09 09 09 72 65 74 75  FICIENT:....retu
47c0: 72 6e 28 22 43 4b 41 5f 43 4f 45 46 46 49 43 49  rn("CKA_COEFFICI
47d0: 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ENT");...case CK
47e0: 41 5f 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75  A_PRIME:....retu
47f0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 22 29 3b  rn("CKA_PRIME");
4800: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 50  ...case CKA_SUBP
4810: 52 49 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  RIME:....return(
4820: 22 43 4b 41 5f 53 55 42 50 52 49 4d 45 22 29 3b  "CKA_SUBPRIME");
4830: 0a 09 09 63 61 73 65 20 43 4b 41 5f 42 41 53 45  ...case CKA_BASE
4840: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4850: 5f 42 41 53 45 22 29 3b 0a 09 09 63 61 73 65 20  _BASE");...case 
4860: 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a  CKA_PRIME_BITS:.
4870: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
4880: 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63  RIME_BITS");...c
4890: 61 73 65 20 43 4b 41 5f 53 55 42 5f 50 52 49 4d  ase CKA_SUB_PRIM
48a0: 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72  E_BITS:....retur
48b0: 6e 28 22 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45  n("CKA_SUB_PRIME
48c0: 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  _BITS");...case 
48d0: 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 3a 0a  CKA_VALUE_BITS:.
48e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56  ...return("CKA_V
48f0: 41 4c 55 45 5f 42 49 54 53 22 29 3b 0a 09 09 63  ALUE_BITS");...c
4900: 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f 4c 45  ase CKA_VALUE_LE
4910: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  N:....return("CK
4920: 41 5f 56 41 4c 55 45 5f 4c 45 4e 22 29 3b 0a 09  A_VALUE_LEN");..
4930: 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43  .case CKA_EXTRAC
4940: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
4950: 28 22 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  ("CKA_EXTRACTABL
4960: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4970: 4c 4f 43 41 4c 3a 0a 09 09 09 72 65 74 75 72 6e  LOCAL:....return
4980: 28 22 43 4b 41 5f 4c 4f 43 41 4c 22 29 3b 0a 09  ("CKA_LOCAL");..
4990: 09 63 61 73 65 20 43 4b 41 5f 4e 45 56 45 52 5f  .case CKA_NEVER_
49a0: 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09  EXTRACTABLE:....
49b0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4e 45 56 45  return("CKA_NEVE
49c0: 52 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b  R_EXTRACTABLE");
49d0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 4c 57 41  ...case CKA_ALWA
49e0: 59 53 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09  YS_SENSITIVE:...
49f0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 4c 57  .return("CKA_ALW
4a00: 41 59 53 5f 53 45 4e 53 49 54 49 56 45 22 29 3b  AYS_SENSITIVE");
4a10: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f  ...case CKA_KEY_
4a20: 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 3a 0a 09  GEN_MECHANISM:..
4a30: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45  ..return("CKA_KE
4a40: 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 22  Y_GEN_MECHANISM"
4a50: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  );...case CKA_MO
4a60: 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 72 65 74  DIFIABLE:....ret
4a70: 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 49 46 49 41  urn("CKA_MODIFIA
4a80: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  BLE");...case CK
4a90: 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53 3a 0a  A_ECDSA_PARAMS:.
4aa0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4ab0: 43 44 53 41 5f 50 41 52 41 4d 53 22 29 3b 0a 09  CDSA_PARAMS");..
4ac0: 09 63 61 73 65 20 43 4b 41 5f 45 43 5f 50 4f 49  .case CKA_EC_POI
4ad0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
4ae0: 4b 41 5f 45 43 5f 50 4f 49 4e 54 22 29 3b 0a 09  KA_EC_POINT");..
4af0: 09 63 61 73 65 20 43 4b 41 5f 53 45 43 4f 4e 44  .case CKA_SECOND
4b00: 41 52 59 5f 41 55 54 48 3a 0a 09 09 09 72 65 74  ARY_AUTH:....ret
4b10: 75 72 6e 28 22 43 4b 41 5f 53 45 43 4f 4e 44 41  urn("CKA_SECONDA
4b20: 52 59 5f 41 55 54 48 22 29 3b 0a 09 09 63 61 73  RY_AUTH");...cas
4b30: 65 20 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46  e CKA_AUTH_PIN_F
4b40: 4c 41 47 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  LAGS:....return(
4b50: 22 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c  "CKA_AUTH_PIN_FL
4b60: 41 47 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  AGS");...case CK
4b70: 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50  A_HW_FEATURE_TYP
4b80: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4b90: 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50  A_HW_FEATURE_TYP
4ba0: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4bb0: 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 3a 0a 09  RESET_ON_INIT:..
4bc0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 52 45  ..return("CKA_RE
4bd0: 53 45 54 5f 4f 4e 5f 49 4e 49 54 22 29 3b 0a 09  SET_ON_INIT");..
4be0: 09 63 61 73 65 20 43 4b 41 5f 48 41 53 5f 52 45  .case CKA_HAS_RE
4bf0: 53 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  SET:....return("
4c00: 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 22 29 3b  CKA_HAS_RESET");
4c10: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45 4e 44  ...case CKA_VEND
4c20: 4f 52 5f 44 45 46 49 4e 45 44 3a 0a 09 09 09 72  OR_DEFINED:....r
4c30: 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 4e 44 4f  eturn("CKA_VENDO
4c40: 52 5f 44 45 46 49 4e 45 44 22 29 3b 0a 09 7d 0a  R_DEFINED");..}.
4c50: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
4c60: 4e 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e  N");.}..#  defin
4c70: 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b  e malloc(x) CACK
4c80: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41  EY_DEBUG_FUNC_MA
4c90: 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f  LLOC(x, __func__
4ca0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64  , __LINE__).#  d
4cb0: 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c  efine realloc(x,
4cc0: 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47   y) CACKEY_DEBUG
4cd0: 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c  _FUNC_REALLOC(x,
4ce0: 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f   y, __func__, __
4cf0: 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66  LINE__).#  ifdef
4d00: 20 73 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64   strdup.#    und
4d10: 65 66 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64  ef strdup.#  end
4d20: 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72  if.#  define str
4d30: 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45  dup(x) CACKEY_DE
4d40: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28  BUG_FUNC_STRDUP(
4d50: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  x, __func__, __L
4d60: 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20  INE__).#else.#  
4d70: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4d80: 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29  BUG_PRINTF(x...)
4d90: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4db0: 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f  NTBUF(f, x, y) /
4dc0: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
4dd0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4de0: 54 41 47 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  TAG_TO_STR(x) "D
4df0: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
4e00: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e10: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
4e20: 45 52 52 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  ERR_TO_STR(x) "D
4e30: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
4e40: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e50: 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
4e60: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4e70: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4e80: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4e90: 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
4ea0: 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47  TO_STR(x) "DEBUG
4eb0: 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65  _DISABLED".#  de
4ec0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4ed0: 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45  G_FUNC_ATTRIBUTE
4ee0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4ef0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 65 6e 64  G_DISABLED".#end
4f00: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 6e 63 6c 75 64  if../*. * Includ
4f10: 65 20 74 68 65 73 65 20 73 6f 75 72 63 65 20 66  e these source f
4f20: 69 6c 65 73 20 69 6e 20 74 68 69 73 20 74 72 61  iles in this tra
4f30: 6e 73 6c 61 74 69 6f 6e 20 75 6e 69 74 20 73 6f  nslation unit so
4f40: 20 74 68 61 74 20 77 65 20 63 61 6e 20 62 69 6e   that we can bin
4f50: 64 20 74 6f 0a 20 2a 20 66 75 6e 63 74 69 6f 6e  d to. * function
4f60: 73 20 61 6e 64 20 6e 6f 74 20 69 6e 63 6c 75 64  s and not includ
4f70: 65 20 61 6e 79 20 73 79 6d 62 6f 6c 73 20 69 6e  e any symbols in
4f80: 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 61 72   the output shar
4f90: 65 64 20 6f 62 6a 65 63 74 2e 0a 20 2a 2f 0a 23  ed object.. */.#
4fa0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
4fb0: 30 39 2e 63 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.c".#include "
4fc0: 73 68 61 31 2e 63 22 0a 23 69 6e 63 6c 75 64 65  sha1.c".#include
4fd0: 20 22 6d 64 35 2e 63 22 0a 0a 74 79 70 65 64 65   "md5.c"..typede
4fe0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
4ff0: 5f 49 44 5f 54 59 50 45 5f 43 41 43 2c 0a 09 43  _ID_TYPE_CAC,..C
5000: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
5010: 56 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59  V,..CACKEY_ID_TY
5020: 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 0a 7d 20 63  PE_CERT_ONLY.} c
5030: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
5040: 70 65 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  pe;..struct cack
5050: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
5060: 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f   {..cackey_pcsc_
5070: 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b  id_type id_type;
5080: 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69 66  ...size_t certif
5090: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69  icate_len;..unsi
50a0: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69  gned char *certi
50b0: 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65 5f  ficate;...ssize_
50c0: 74 20 6b 65 79 73 69 7a 65 3b 0a 0a 09 75 6e 69  t keysize;...uni
50d0: 6f 6e 20 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a  on {...struct {.
50e0: 09 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
50f0: 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09 09 09 75   applet[7];....u
5100: 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 09 09  int16_t file;...
5110: 7d 20 63 61 63 3b 0a 0a 09 09 73 74 72 75 63 74  } cac;....struct
5120: 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64 20 63   {....unsigned c
5130: 68 61 72 20 6b 65 79 5f 69 64 3b 0a 09 09 09 63  har key_id;....c
5140: 68 61 72 20 6c 61 62 65 6c 5b 33 32 5d 3b 0a 09  har label[32];..
5150: 09 7d 20 70 69 76 3b 0a 09 7d 20 63 61 72 64 3b  .} piv;..} card;
5160: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
5170: 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73  ey_identity {..s
5180: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5190: 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
51a0: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f  _identity;...CK_
51b0: 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69  ATTRIBUTE *attri
51c0: 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  butes;..CK_ULONG
51d0: 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e   attributes_coun
51e0: 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  t;.};..struct ca
51f0: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09  ckey_session {..
5200: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b  int active;...CK
5210: 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
5220: 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74  ...CK_STATE stat
5230: 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61  e;..CK_FLAGS fla
5240: 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  gs;..CK_ULONG ul
5250: 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b  DeviceError;..CK
5260: 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
5270: 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49  cation;..CK_NOTI
5280: 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72  FY Notify;...str
5290: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
52a0: 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
52b0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
52c0: 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
52d0: 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61  ;...int search_a
52e0: 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49  ctive;..CK_ATTRI
52f0: 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f  BUTE_PTR search_
5300: 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  query;..CK_ULONG
5310: 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f   search_query_co
5320: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  unt;..unsigned l
5330: 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f  ong search_curr_
5340: 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61  id;...int sign_a
5350: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
5360: 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d  NISM_TYPE sign_m
5370: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59  echanism;..CK_BY
5380: 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b  TE_PTR sign_buf;
5390: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
53a0: 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e  sign_buflen;..un
53b0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
53c0: 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63  _bufused;..struc
53d0: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
53e0: 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  y *sign_identity
53f0: 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f  ;...int decrypt_
5400: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
5410: 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79  ANISM_TYPE decry
5420: 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  pt_mechanism;..C
5430: 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79  K_VOID_PTR decry
5440: 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43  pt_mech_parm;..C
5450: 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f  K_ULONG decrypt_
5460: 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73  mech_parmlen;..s
5470: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5480: 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69  ntity *decrypt_i
5490: 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72  dentity;.};..str
54a0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
54b0: 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 09  {..int active;..
54c0: 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a 0a 09  int internal;...
54d0: 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
54e0: 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61  r;...int pcsc_ca
54f0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53  rd_connected;..S
5500: 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f  CARDHANDLE pcsc_
5510: 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e  card;...int tran
5520: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09  saction_depth;..
5530: 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f  int transaction_
5540: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09  need_hw_lock;...
5550: 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a  int slot_reset;.
5560: 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e  ..CK_FLAGS token
5570: 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e  _flags;...unsign
5580: 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a  ed char *label;.
5590: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c  ..DWORD protocol
55a0: 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;...unsigned int
55b0: 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f   cached_certs_co
55c0: 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63 61 63  unt;..struct cac
55d0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
55e0: 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74 73 3b  y *cached_certs;
55f0: 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .};..typedef enu
5600: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
5610: 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78  APP_GENERIC = 0x
5620: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
5630: 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78  APP_SKI     = 0x
5640: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
5650: 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78  APP_PKI     = 0x
5660: 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f  04.} cackey_tlv_
5670: 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65  apptype;..typede
5680: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
5690: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
56a0: 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30  ALINFO       = 0
56b0: 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2000,..CACKEY_T
56c0: 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53  LV_OBJID_PROPERS
56d0: 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32  ONALINFO   = 0x2
56e0: 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  100,..CACKEY_TLV
56f0: 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e  _OBJID_ACCESSCON
5700: 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30  TROL     = 0x300
5710: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5720: 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20  BJID_LOGIN      
5730: 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c         = 0x4000,
5740: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5750: 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20  ID_CARDINFO     
5760: 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09       = 0x5000,..
5770: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5780: 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20  _BIOMETRICS     
5790: 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41     = 0x6000,..CA
57a0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44  CKEY_TLV_OBJID_D
57b0: 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20 20  IGITALSIGCERT   
57c0: 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b   = 0x7000,..CACK
57d0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
57e0: 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d  _PERSON        =
57f0: 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59   0x0200,..CACKEY
5800: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42  _TLV_OBJID_CAC_B
5810: 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20 30  ENEFITS      = 0
5820: 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54  x0202,..CACKEY_T
5830: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
5840: 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30  ERBENEFITS = 0x0
5850: 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  203,..CACKEY_TLV
5860: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
5870: 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30  NNEL     = 0x020
5880: 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  1,..CACKEY_TLV_O
5890: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
58a0: 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a         = 0x02FE.
58b0: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  } cackey_tlv_obj
58c0: 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20  ectid;..typedef 
58d0: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50  enum {..CACKEY_P
58e0: 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
58f0: 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b  NT    = 1,..CACK
5900: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
5910: 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a 09            = 0,..
5920: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5930: 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d 20  NERIC         = 
5940: 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -1,..CACKEY_PCSC
5950: 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20 20  _E_BADPIN       
5960: 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59     = -2,..CACKEY
5970: 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20  _PCSC_E_LOCKED  
5980: 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09 43          = -3,..C
5990: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
59a0: 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d 20 2d  DLOGIN       = -
59b0: 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  4,..CACKEY_PCSC_
59c0: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 20  E_TOKENABSENT   
59d0: 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59 5f    = -6,..CACKEY_
59e0: 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20 20  PCSC_E_RETRY    
59f0: 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63 61         = -7.} ca
5a00: 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63  ckey_ret;..struc
5a10: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
5a20: 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64  durl {..unsigned
5a30: 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69 64   char        rid
5a40: 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  [5];..cackey_tlv
5a50: 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74 79  _apptype   appty
5a60: 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  pe;..cackey_tlv_
5a70: 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74  objectid  object
5a80: 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  id;..cackey_tlv_
5a90: 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b  objectid  appid;
5aa0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5ab0: 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b         pinid;.};
5ac0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5ad0: 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75  tlv_entity;.stru
5ae0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
5af0: 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20  tity {..uint8_t 
5b00: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
5b10: 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09  gth;...union {..
5b20: 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09  .void *value;...
5b30: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5b40: 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65  v_cardurl *value
5b50: 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74  _cardurl;...uint
5b60: 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a  8_t value_byte;.
5b70: 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  .};...struct cac
5b80: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
5b90: 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41  _next;.};../* CA
5ba0: 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64  CKEY Global Hand
5bb0: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  les */.static vo
5bc0: 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f  id *cackey_biglo
5bd0: 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69  ck = NULL;.stati
5be0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
5bf0: 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73  session cackey_s
5c00: 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74  essions[128];.st
5c10: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
5c20: 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73  ey_slot cackey_s
5c30: 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69  lots[128];.stati
5c40: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69  c int cackey_ini
5c50: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74  tialized = 0;.st
5c60: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
5c70: 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30  biglock_init = 0
5c80: 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a  ;.CK_C_INITIALIZ
5c90: 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72  E_ARGS cackey_ar
5ca0: 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63  gs;../** Extra c
5cb0: 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20 69  ertificates to i
5cc0: 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20  nclude in token 
5cd0: 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b 65  **/.struct cacke
5ce0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
5cf0: 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20  extra_certs[] = 
5d00: 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63 6b  {.#include "cack
5d10: 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 73  ey_builtin_certs
5d20: 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 72 6f 74 65  .h".};../* Prote
5d30: 63 74 65 64 20 41 75 74 68 65 6e 74 69 63 61 74  cted Authenticat
5d40: 69 6f 6e 20 50 61 74 68 20 63 6f 6d 6d 61 6e 64  ion Path command
5d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b   */.#define CACK
5d60: 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44  EY_PIN_COMMAND_D
5d70: 45 46 41 55 4c 54 5f 58 53 54 52 28 73 74 72 29  EFAULT_XSTR(str)
5d80: 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
5d90: 41 4e 44 5f 44 45 46 41 55 4c 54 5f 53 54 52 28  AND_DEFAULT_STR(
5da0: 73 74 72 29 0a 23 64 65 66 69 6e 65 20 43 41 43  str).#define CAC
5db0: 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
5dc0: 44 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29  DEFAULT_STR(str)
5dd0: 20 23 73 74 72 0a 73 74 61 74 69 63 20 63 68 61   #str.static cha
5de0: 72 20 2a 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  r *cackey_pin_co
5df0: 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f  mmand = NULL;../
5e00: 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61  * PCSC Global Ha
5e10: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
5e20: 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63  LPSCARDCONTEXT c
5e30: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
5e40: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69  e = NULL;..stati
5e50: 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
5e60: 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
5e70: 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69  n(void) {..stati
5e80: 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
5e90: 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75  retval = 255;..u
5ea0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a  nsigned long maj
5eb0: 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  or = 0;..unsigne
5ec0: 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30  d long minor = 0
5ed0: 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73  ;..char *major_s
5ee0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  tr = NULL;..char
5ef0: 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55   *minor_str = NU
5f00: 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  LL;...CACKEY_DEB
5f10: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
5f20: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  d.");...if (retv
5f30: 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43  al != 255) {...C
5f40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5f50: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78  TF("Returning 0x
5f60: 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20  %lx (cached).", 
5f70: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75  retval);....retu
5f80: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  rn(retval);..}..
5f90: 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69  .retval = 0;..#i
5fa0: 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52  fdef PACKAGE_VER
5fb0: 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a  SION.        maj
5fc0: 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45  or_str = PACKAGE
5fd0: 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d  _VERSION;..if (m
5fe0: 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20  ajor_str) {..   
5ff0: 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72       major = str
6000: 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20  toul(major_str, 
6010: 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b  &minor_str, 10);
6020: 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74  ....if (minor_st
6030: 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20  r) {....minor = 
6040: 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74  strtoul(minor_st
6050: 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29  r + 1, NULL, 10)
6060: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61  ;...}..}...retva
6070: 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36  l = (major << 16
6080: 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29  ) | (minor << 8)
6090: 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  ;.#endif...CACKE
60a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
60b0: 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22  Returning 0x%lx"
60c0: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  , retval);...ret
60d0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
60e0: 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64  /* PC/SC Related
60f0: 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a   Functions */./*
6100: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6110: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
6120: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6130: 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  _all(void);. *. 
6140: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6150: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
6160: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6170: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54    None. *. * NOT
6180: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
6190: 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65  unction disconne
61a0: 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72  cts from all car
61b0: 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  ds.. *. */.stati
61c0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c  c void cackey_sl
61d0: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
61e0: 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74  ll(void) {..uint
61f0: 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  32_t idx;...CACK
6200: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6210: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f  "Called.");...fo
6220: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
6230: 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
6240: 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
6250: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
6260: 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
6270: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
6280: 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  idx].internal) {
6290: 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65  ..../* Skip inte
62a0: 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09  rnal slots */...
62b0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
62c0: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
62d0: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72  ts[idx].pcsc_car
62e0: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
62f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6300: 52 49 4e 54 46 28 22 53 43 61 72 64 44 69 73 63  RINTF("SCardDisc
6310: 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c  onnect(%lu) call
6320: 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ed", (unsigned l
6330: 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53  ong) idx);.....S
6340: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63  CardDisconnect(c
6350: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6360: 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  .pcsc_card, SCAR
6370: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
6380: 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
6390: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
63a0: 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  l) {....free(cac
63b0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
63c0: 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65  abel);.....cacke
63d0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
63e0: 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  el = NULL;...}..
63f0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
6400: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  dx].pcsc_card_co
6410: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63  nnected = 0;...c
6420: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6430: 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  .transaction_dep
6440: 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  th = 0;...cackey
6450: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
6460: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
6470: 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20  lock = 0;....if 
6480: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6490: 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
64a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
64b0: 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74  NTF("Marking act
64c0: 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20  ive slot %lu as 
64d0: 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75  being reset", (u
64e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
64f0: 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  x);...}....cacke
6500: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f  y_slots[idx].slo
6510: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a  t_reset = 1;..}.
6520: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6530: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
6540: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ");...return;.}.
6550: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
6560: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
6570: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
6580: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
6590: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
65a0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
65b0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
65c0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
65d0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
65e0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
65f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6600: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
6610: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
6620: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
6630: 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65   connects to the
6640: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
6650: 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70  n Manager and up
6660: 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20  dates the. *    
6670: 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a   global handle..
6680: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
6690: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
66a0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69  pcsc_connect(voi
66b0: 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  d) {..LONG scard
66c0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
66d0: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43  ;.#ifdef HAVE_SC
66e0: 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58  ARDISVALIDCONTEX
66f0: 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73  T..LONG scard_is
6700: 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69  valid_ret;.#endi
6710: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
6720: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
6730: 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ");...if (cackey
6740: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
6750: 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
6760: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d  _pcsc_handle = m
6770: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
6780: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6790: 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ));...if (cackey
67a0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
67b0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  NULL) {....CACKE
67c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
67d0: 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29  Call to malloc()
67e0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
67f0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
6800: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6810: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
6820: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
6830: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6840: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  ERIC);...}....CA
6850: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6860: 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73  F("SCardEstablis
6870: 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65  hContext() calle
6880: 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74  d");...scard_est
6890: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53  _context_ret = S
68a0: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
68b0: 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45  text(SCARD_SCOPE
68c0: 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e  _SYSTEM, NULL, N
68d0: 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63  ULL, cackey_pcsc
68e0: 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28  _handle);...if (
68f0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6900: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
6910: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43  _SUCCESS) {....C
6920: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6930: 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72  TF("Call to SCar
6940: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6950: 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e  t failed (return
6960: 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75  ed %s/%li), retu
6970: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
6980: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
6990: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
69a0: 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63  _STR(scard_est_c
69b0: 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f  ontext_ret), (lo
69c0: 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ng) scard_est_co
69d0: 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09  ntext_ret);.....
69e0: 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63  free(cackey_pcsc
69f0: 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63  _handle);....cac
6a00: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6a10: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b  = NULL;.....cack
6a20: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
6a30: 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72  ect_all();.....r
6a40: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6a50: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
6a60: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56  }..}..#ifdef HAV
6a70: 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f  E_SCARDISVALIDCO
6a80: 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45  NTEXT..CACKEY_DE
6a90: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6aa0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
6ab0: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61  ) called");..sca
6ac0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d  rd_isvalid_ret =
6ad0: 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e   SCardIsValidCon
6ae0: 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  text(*cackey_pcs
6af0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28  c_handle);..if (
6b00: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6b10: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
6b20: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
6b30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48  _DEBUG_PRINTF("H
6b40: 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65  andle has become
6b50: 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49   invalid (SCardI
6b60: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20  sValidContext = 
6b70: 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20  %s/%li), trying 
6b80: 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e  to re-establish.
6b90: 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
6ba0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
6bb0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76  TO_STR(scard_isv
6bc0: 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  alid_ret), (long
6bd0: 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  ) scard_isvalid_
6be0: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
6bf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6c00: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6c10: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
6c20: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
6c30: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
6c40: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
6c50: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
6c60: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
6c70: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6c80: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
6c90: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6ca0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6cb0: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
6cc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6cd0: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
6ce0: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
6cf0: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
6d00: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
6d10: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
6d20: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
6d30: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
6d40: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6d50: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
6d60: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6d70: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
6d80: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6d90: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70  le);....cackey_p
6da0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
6db0: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  L;.....cackey_sl
6dc0: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6dd0: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
6de0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6df0: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
6e00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6e10: 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20  NTF("Handle has 
6e20: 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73  been re-establis
6e30: 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  hed");..}.#endif
6e40: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6e50: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75  PRINTF("Sucessfu
6e60: 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  lly connected to
6e70: 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e   PC/SC, returnin
6e80: 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a  g in success");.
6e90: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6ea0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
6eb0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6ec0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
6ed0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
6ee0: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a  onnect(void);. *
6ef0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
6f00: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
6f10: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
6f20: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
6f30: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
6f40: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
6f50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6f60: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
6f70: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
6f80: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
6f90: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
6fa0: 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e  om the PC/SC Con
6fb0: 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20  nection manager 
6fc0: 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20  and updates. *  
6fd0: 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61     the global ha
6fe0: 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ndle.. *. */.sta
6ff0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
7000: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
7010: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c  nnect(void) {..L
7020: 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f  ONG scard_rel_co
7030: 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43  ntext_ret;...CAC
7040: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7050: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
7060: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
7070: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
7080: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7090: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
70a0: 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74  ..scard_rel_cont
70b0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52  ext_ret = SCardR
70c0: 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63  eleaseContext(*c
70d0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
70e0: 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  e);...if (cackey
70f0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a  _pcsc_handle) {.
7100: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
7110: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09  sc_handle);.....
7120: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7130: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  le = NULL;..}...
7140: 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f  if (scard_rel_co
7150: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
7160: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
7170: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7180: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
7190: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ..}...return(CAC
71a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
71b0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
71c0: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
71d0: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
71e0: 65 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  eset(struct cack
71f0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
7200: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
7210: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
7220: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7230: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
7240: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
7250: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b  is function mark
7260: 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76  s a slot has hav
7270: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20  ing been reset, 
7280: 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61  to later be clea
7290: 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43  ned up.. *     C
72a0: 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70  leanup only happ
72b0: 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23  ens when a PKCS#
72c0: 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20  11 client calls 
72d0: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
72e0: 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  t.. *. */.static
72f0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72   void cackey_mar
7300: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72  k_slot_reset(str
7310: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7320: 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c  *slot) {..if (sl
7330: 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
7340: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43  return;..}...CAC
7350: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7360: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
7370: 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  f (slot->pcsc_ca
7380: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
7390: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
73a0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
73b0: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
73c0: 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  ARD);..}...slot-
73d0: 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  >slot_reset = 1;
73e0: 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
73f0: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
7400: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
7410: 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c  _command == NULL
7420: 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65  ) {...slot->toke
7430: 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
7440: 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d  GIN_REQUIRED;..}
7450: 20 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e   else {...slot->
7460: 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
7470: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
7480: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
7490: 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72  ning.");...retur
74a0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
74b0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47  OSIS. *     LONG
74c0: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
74d0: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61  t_card(struct ca
74e0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
74f0: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70   DWORD default_p
7500: 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20  rotocol);. *. * 
7510: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7520: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7530: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
7540: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
7550: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
7560: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70   DWORD default_p
7570: 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20  rotocol. *      
7580: 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61     Protocol to a
7590: 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a  ttempt first. *.
75a0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
75b0: 20 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72   *     The retur
75c0: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61  n value from SCa
75d0: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a  rdReconnect(). *
75e0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
75f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7600: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
7610: 6e 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  nd SCardReconnec
7620: 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68  t(). *. *     Th
7630: 65 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  e SCardReconnect
7640: 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  () function call
7650: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
7660: 66 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20  first with the. 
7670: 2a 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65  *     dwPreferre
7680: 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64  dProtocols of "d
7690: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22  efault_protocol"
76a0: 2e 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20  .  If that call 
76b0: 72 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53  returns. *     S
76c0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
76d0: 4d 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20  MATCH try again 
76e0: 77 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20  with a protocol 
76f0: 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c  of T=0, and fail
7700: 69 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20  ing. *     that 
7710: 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  T=1.. *. */.stat
7720: 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72  ic LONG cackey_r
7730: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74  econnect_card(st
7740: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
7750: 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65   *slot, DWORD de
7760: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20  fault_protocol) 
7770: 7b 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65  {..DWORD selecte
7780: 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e  d_protocol;..LON
7790: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
77a0: 3b 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f  ;...selected_pro
77b0: 74 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61  tocol = 0;...sca
77c0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
77d0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
77e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
77f0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7800: 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63  , default_protoc
7810: 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f  ol, SCARD_RESET_
7820: 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f  CARD, &selected_
7830: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20  protocol);...if 
7840: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7850: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
7860: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43  _MISMATCH) {...C
7870: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7880: 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65  TF("SCardReconne
7890: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
78a0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
78b0: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
78c0: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73  h just T=0")...s
78d0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
78e0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73  SCardReconnect(s
78f0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7900: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7910: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
7920: 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53  OL_T0, SCARD_RES
7930: 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74  ET_CARD, &select
7940: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  ed_protocol);...
7950: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7960: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7970: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
7980: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7990: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65  _PRINTF("SCardRe
79a0: 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  connect() return
79b0: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
79c0: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
79d0: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
79e0: 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  )....scard_conn_
79f0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
7a00: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7a10: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
7a20: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
7a30: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41  PROTOCOL_T1, SCA
7a40: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26  RD_RESET_CARD, &
7a50: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7a60: 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  l);...}..}...if 
7a70: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7a80: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
7a90: 53 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72  SS) {...slot->pr
7aa0: 6f 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65  otocol = selecte
7ab0: 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a  d_protocol;..}..
7ac0: 09 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f  .return(scard_co
7ad0: 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  nn_ret);.}../*. 
7ae0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
7af0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
7b00: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
7b10: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7b20: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
7b30: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
7b40: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
7b50: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
7b60: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
7b70: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
7b80: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
7b90: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
7ba0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
7bb0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
7bc0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7bd0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
7be0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
7bf0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
7c00: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
7c10: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
7c20: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
7c30: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
7c40: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
7c50: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
7c60: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a  DWORD protocol;.
7c70: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
7c80: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
7c90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
7ca0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
7cb0: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
7cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
7cd0: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
7ce0: 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  fied, returning 
7cf0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
7d00: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7d10: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7d20: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
7d30: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
7d40: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
7d50: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
7d60: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
7d70: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
7d80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7d90: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
7da0: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72   PC/SC failed, r
7db0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
7dc0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
7dd0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
7de0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
7df0: 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64   Connect to read
7e00: 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  er, if needed */
7e10: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
7e20: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
7e30: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
7e40: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7e50: 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c  Connect(%s) call
7e60: 65 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c  ed for slot %p",
7e70: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7e80: 65 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61  er, slot);...sca
7e90: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
7ea0: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
7eb0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
7ec0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
7ed0: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
7ee0: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
7ef0: 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44  TOCOL_T0 | SCARD
7f00: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
7f10: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7f20: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69  &protocol);....i
7f30: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7f40: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7f50: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7f60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7f70: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
7f80: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
7f90: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7fa0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
7fb0: 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09  th just T=0")...
7fc0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
7fd0: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
7fe0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7ff0: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8000: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8010: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
8020: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73  _PROTOCOL_T0, &s
8030: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8040: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09  &protocol);.....
8050: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
8060: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
8070: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
8080: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8090: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
80a0: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
80b0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
80c0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
80d0: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a  with just T=1").
80e0: 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
80f0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
8100: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
8110: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
8120: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
8130: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
8140: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
8150: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
8160: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  d, &protocol);..
8170: 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ..}...}....if (s
8180: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
8190: 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52   SCARD_W_UNPOWER
81a0: 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ED_CARD) {....CA
81b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
81c0: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
81d0: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
81e0: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
81f0: 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d  D, trying to re-
8200: 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09  connect...");...
8210: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
8220: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
8230: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
8240: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
8250: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
8260: 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52  ARE_DIRECT, SCAR
8270: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
8280: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8290: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
82a0: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
82b0: 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63  .....if (scard_c
82c0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
82d0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
82e0: 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  H) {.....CACKEY_
82f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
8300: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74  ardConnect() ret
8310: 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52  urned SCARD_E_PR
8320: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72  OTO_MISMATCH, tr
8330: 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54  ying with just T
8340: 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63  =0").....scard_c
8350: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
8360: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
8370: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
8380: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
8390: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
83a0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
83b0: 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T0, &slot->pcs
83c0: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
83d0: 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61  l);......if (sca
83e0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
83f0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
8400: 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41  MATCH) {......CA
8410: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8420: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
8430: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
8440: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
8450: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
8460: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73  ust T=1")......s
8470: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
8480: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
8490: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
84a0: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
84b0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
84c0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
84d0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f  ROTOCOL_T1, &slo
84e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
84f0: 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a  rotocol);.....}.
8500: 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63  ...}.....scard_c
8510: 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  onn_ret = cackey
8520: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
8530: 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b  slot, protocol);
8540: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
8550: 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43  d_conn_ret != SC
8560: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
8570: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8580: 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
8590: 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c  ion to card fail
85a0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
85b0: 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43   failure (SCardC
85c0: 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c  onnect() = %s/%l
85d0: 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  i)", CACKEY_DEBU
85e0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
85f0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e  TO_STR(scard_con
8600: 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  n_ret), (long) s
8610: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a  card_conn_ret);.
8620: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8630: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8640: 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e  );...}....slot->
8650: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
8660: 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d  ted = 1;...slot-
8670: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8680: 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e  th = 0;...slot->
8690: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
86a0: 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
86b0: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d  slot->protocol =
86c0: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09   protocol;..}...
86d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
86e0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
86f0: 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72  n success");...r
8700: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8710: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
8720: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
8730: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
8740: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
8750: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63  ction(struct cac
8760: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b  key_slot *slot);
8770: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
8780: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
8790: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
87a0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
87b0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
87c0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
87d0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
87e0: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
87f0: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
8800: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
8810: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
8820: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
8830: 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e  . *     The tran
8840: 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  saction should b
8850: 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69  e terminated usi
8860: 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ng "cackey_end_t
8870: 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20  ransaction". *. 
8880: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
8890: 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69  _ret cackey_begi
88a0: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  n_transaction(st
88b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
88c0: 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
88d0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e  y_ret cackey_con
88e0: 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61  n_ret;..LONG sca
88f0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
8900: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8910: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
8920: 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65  ..cackey_conn_re
8930: 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
8940: 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
8950: 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  if (cackey_conn_
8960: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
8970: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
8980: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8990: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
89a0: 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
89b0: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
89c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
89d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
89e0: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
89f0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8a00: 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h++;...if (slot-
8a10: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8a20: 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d  th > 1 && !slot-
8a30: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
8a40: 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43  d_hw_lock) {...C
8a50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8a60: 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61  TF("Already in a
8a70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65   transaction, pe
8a80: 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69  rforming no acti
8a90: 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20  on (new depth = 
8aa0: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
8ab0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
8ac0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8ad0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
8ae0: 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
8af0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
8b00: 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72   = 0;...scard_tr
8b10: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42  ans_ret = SCardB
8b20: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
8b30: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29  slot->pcsc_card)
8b40: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
8b50: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
8b60: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
8b70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8b80: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65  TF("Unable to be
8b90: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  gin transaction,
8ba0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
8bb0: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
8bc0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8bd0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
8be0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8bf0: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62  F("Sucessfully b
8c00: 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egan transaction
8c10: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
8c20: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8c30: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
8c40: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
8c50: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
8c60: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
8c70: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
8c80: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
8c90: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8ca0: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
8cb0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
8cc0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8cd0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8ce0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8cf0: 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  to. *. * RETURN 
8d00: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8d10: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8d20: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8d30: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8d40: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8d50: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
8d60: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
8d70: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69  s function requi
8d80: 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69  res "cackey_begi
8d90: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74  n_transaction" t
8da0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  o be called firs
8db0: 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  t. *. */.static 
8dc0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8dd0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
8de0: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
8df0: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c  slot *slot) {..L
8e00: 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f  ONG scard_trans_
8e10: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8e20: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8e30: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
8e40: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
8e50: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43  nnected) {...CAC
8e60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8e70: 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f  ("Card is not co
8e80: 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20  nnected, unable 
8e90: 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69  to end transacti
8ea0: 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09  on on card");...
8eb0: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
8ec0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
8ed0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8ee0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72  BUG_PRINTF("Decr
8ef0: 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69  easing transacti
8f00: 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b  on depth and ask
8f10: 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77 61  ing for a hardwa
8f20: 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e  re lock on the n
8f30: 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ext begin transa
8f40: 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64  ction (current d
8f50: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
8f60: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8f70: 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d  epth);.....slot-
8f80: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8f90: 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c  th--;.....if (sl
8fa0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8fb0: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
8fc0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8fd0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8fe0: 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  = 1;....}...}...
8ff0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9000: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
9010: 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .}...if (slot->t
9020: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9030: 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
9040: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9050: 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72  Terminating a tr
9060: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68  ansaction that h
9070: 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b  as not begun!");
9080: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
9090: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
90a0: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
90b0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
90c0: 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  -;...if (slot->t
90d0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
90e0: 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 0) {...CACKEY
90f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
9100: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
9110: 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e  l in progress, n
9120: 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f  ot terminating o
9130: 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  n-card Transacti
9140: 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74  on (current dept
9150: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
9160: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
9170: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
9180: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
9190: 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e  ..}...scard_tran
91a0: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64  s_ret = SCardEnd
91b0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  Transaction(slot
91c0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
91d0: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
91e0: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
91f0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
9200: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
9210: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9220: 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  ("Unable to end 
9230: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
9240: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
9250: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9260: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9270: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
9280: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
9290: 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69  ucessfully termi
92a0: 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  nated transactio
92b0: 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c  n on slot (%s)",
92c0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
92d0: 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  er);...return(CA
92e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
92f0: 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61  .}../* APDU Rela
9300: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
9310: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
9320: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
9330: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
9340: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
9350: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
9360: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
9370: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9380: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
9390: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
93a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
93b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
93c0: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
93d0: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
93e0: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
93f0: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
9400: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
9410: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
9420: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a  espdata_len);. *
9430: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
9440: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
9450: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
9460: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
9470: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
9480: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9490: 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20  ar class. *     
94a0: 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28      APDU Class (
94b0: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
94c0: 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41  816 or GSCIS_CLA
94d0: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
94e0: 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73  RM. *         us
94f0: 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a  ually), (CLA). *
9500: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9510: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
9520: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  n. *         APD
9530: 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49  U Instruction (I
9540: 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  NS). *. *     un
9550: 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20  signed char p1. 
9560: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50  *         APDU P
9570: 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a  arameter 1 (P1).
9580: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9590: 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20  ed char p2. *   
95a0: 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d        APDU Param
95b0: 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20  eter 2 (P2). *. 
95c0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
95d0: 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20  har lc. *       
95e0: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66    APDU Length of
95f0: 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d   Content (Lc) --
9600: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
9610: 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a  gth of "data". *
9620: 20 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74           paramet
9630: 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69  er.  If "data" i
9640: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  s specified as N
9650: 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65  ULL, this parame
9660: 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  ter will. *     
9670: 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a      be ignored..
9680: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9690: 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a  ed char *data. *
96a0: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
96b0: 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65   to buffer to se
96c0: 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62  nd.  It should b
96d0: 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e  e "Lc" bytes lon
96e0: 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20  g.  If. *       
96f0: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e    specified as N
9700: 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e  ULL, "Lc" will n
9710: 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20  ot be sent, and 
9720: 74 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c  this buffer will
9730: 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69   be. *         i
9740: 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  gnored.. *. *   
9750: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9760: 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  le. *         AP
9770: 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70  DU Length of Exp
9780: 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d  ectation (Le) --
9790: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
97a0: 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20  gth of the. *   
97b0: 20 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72        expected r
97c0: 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69  eply.  If this i
97d0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30  s specified as 0
97e0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
97f0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20  t. *         be 
9800: 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  sent.. *. *     
9810: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9820: 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  de. *         [O
9830: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT] Pointer to s
9840: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72  torage of APDU r
9850: 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49  esponse code.  I
9860: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20  f this is. *    
9870: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
9880: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70  s NULL, the resp
9890: 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62  onse code will b
98a0: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
98b0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
98c0: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20  char *respdata. 
98d0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
98e0: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61  Pointer to stora
98f0: 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f  ge of APDU respo
9900: 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68  nse data.  If th
9910: 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  is is. *        
9920: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
9930: 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65  LL, the response
9940: 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69   data will be di
9950: 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20  scarded.  If. * 
9960: 20 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73          the "res
9970: 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d  pdata_len" param
9980: 65 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65  eter is specifie
9990: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
99a0: 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20  buffer. *       
99b0: 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70    will not be up
99c0: 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  dated.. *. *    
99d0: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74   size_t *respdat
99e0: 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  a_len. *        
99f0: 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74   [IN, OUT] Point
9a00: 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f  er initialing co
9a10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a  ntaining the siz
9a20: 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61  e of the "respda
9a30: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62  ta". *         b
9a40: 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72  uffer.  Before r
9a50: 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f  eturning, the po
9a60: 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69  inted to value i
9a70: 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65  s updated to the
9a80: 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62  . *         numb
9a90: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
9aa0: 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65  ten to the buffe
9ab0: 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  r.  If this is s
9ac0: 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20  pecified as. *  
9ad0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20         NULL, it 
9ae0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9af0: 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61  ted, and "respda
9b00: 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ta" will be igno
9b10: 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20  red causing. *  
9b20: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f         the respo
9b30: 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64  nse data to be d
9b40: 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20  iscarded.. *. * 
9b50: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
9b60: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9b70: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f  S_OK           O
9b80: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
9b90: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
9ba0: 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65  ENERIC      On e
9bb0: 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b  rror. *     CACK
9bc0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
9bd0: 42 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65  BSENT  If the se
9be0: 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63  nding failed bec
9bf0: 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69  ause the token i
9c00: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20  s. *            
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a      absent. *. *
9c30: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
9c40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
9c50: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
9c60: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
9c70: 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20   Manager via. * 
9c80: 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f      cackey_pcsc_
9c90: 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65  connect() if nee
9ca0: 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49  ded.. *. *     I
9cb0: 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  t will connect t
9cc0: 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68  o the card in th
9cd0: 65 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65  e reader attache
9ce0: 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a  d to the slot. *
9cf0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20       specified. 
9d00: 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65   It will reconne
9d10: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
9d20: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9d30: 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61  . *     goes awa
9d40: 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  y.. *. */.static
9d50: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
9d60: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72  ey_send_apdu(str
9d70: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9d80: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
9d90: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69  char class, unsi
9da0: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
9db0: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20  ction, unsigned 
9dc0: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65  char p1, unsigne
9dd0: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67  d char p2, unsig
9de0: 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69  ned int lc, unsi
9df0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
9e00: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
9e10: 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70  , uint16_t *resp
9e20: 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  code, unsigned c
9e30: 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73  har *respdata, s
9e40: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9e50: 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20  len) {..uint8_t 
9e60: 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f  major_rc, minor_
9e70: 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65  rc;..size_t byte
9e80: 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72  s_to_copy, tmp_r
9e90: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50  espdata_len;..LP
9ea0: 43 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53  CSCARD_IO_REQUES
9eb0: 54 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44  T pioSendPci;..D
9ec0: 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72  WORD xmit_len, r
9ed0: 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73  ecv_len;..LONG s
9ee0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73  card_xmit_ret, s
9ef0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
9f00: 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b  ..BYTE xmit_buf[
9f10: 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b  1024], recv_buf[
9f20: 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63  1024];..int pcsc
9f30: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63  _connect_ret, pc
9f40: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a  sc_getresp_ret;.
9f50: 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  .int idx;...CACK
9f60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9f70: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
9f80: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
9f90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9fa0: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
9fb0: 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09  pecified.");....
9fc0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
9fd0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
9fe0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
9ff0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
a000: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
a010: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
a020: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
a030: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
a040: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a050: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
a060: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
a070: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
a080: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
a090: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a0a0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
a0b0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69  /* Determine whi
a0c0: 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73  ch protocol to s
a0d0: 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77  end using */..sw
a0e0: 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74  itch (slot->prot
a0f0: 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53  ocol) {...case S
a100: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
a110: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a120: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a130: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a140: 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09  ram is T=0");...
a150: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a160: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
a170: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53  .break;...case S
a180: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
a190: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a1a0: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a1b0: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a1c0: 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09  ram is T=1");...
a1d0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a1e0: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
a1f0: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
a200: 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
a210: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
a220: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e  id protocol foun
a230: 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a  d, aborting.");.
a240: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
a250: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
a260: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73  );..}.../* Trans
a270: 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e  mit */..xmit_len
a280: 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b   = 0;..xmit_buf[
a290: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c  xmit_len++] = cl
a2a0: 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ass;..xmit_buf[x
a2b0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73  mit_len++] = ins
a2c0: 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f  truction;..xmit_
a2d0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a2e0: 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  = p1;..xmit_buf[
a2f0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32  xmit_len++] = p2
a300: 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09  ;..if (data) {..
a310: 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b  .if (lc > 255) {
a320: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a330: 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e  _PRINTF("CAUTION
a340: 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67  !  Using an Lc g
a350: 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20  reater than 255 
a360: 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63  is untested.  Lc
a370: 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09   = %u", lc);....
a380: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a390: 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a  en++] = 0x82; /*
a3a0: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
a3b0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a3c0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26  t_len++] = (lc &
a3d0: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
a3e0: 09 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 6c 63 20 26 20 30 78  len++] = lc & 0x
a400: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ff;...} else {..
a410: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a420: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d  len++] = lc;...}
a430: 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
a440: 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b   idx < lc; idx++
a450: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
a460: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61  xmit_len++] = da
a470: 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a  ta[idx];...}..}.
a480: 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30  ..if (le != 0x00
a490: 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32  ) {...if (le > 2
a4a0: 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  56) {....CACKEY_
a4b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41  DEBUG_PRINTF("CA
a4c0: 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e  UTION!  Using an
a4d0: 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   Le greater than
a4e0: 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64   256 is untested
a4f0: 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29  .  Le = %u", le)
a500: 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  ;.....xmit_buf[x
a510: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38  mit_len++] = 0x8
a520: 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54  2; /* XXX UNTEST
a530: 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75  ED */....xmit_bu
a540: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a550: 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e  (le & 0xff00) >>
a560: 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   8;....xmit_buf[
a570: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
a580: 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73   & 0xff;...} els
a590: 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29  e if (le == 256)
a5a0: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a5b0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30  mit_len++] = 0x0
a5c0: 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  0;...} else {...
a5d0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a5e0: 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a  en++] = le;...}.
a5f0: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d  .}.../* Begin Sm
a600: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
a610: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
a620: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
a630: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c  (slot);...if (cl
a640: 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41  ass == GSCIS_CLA
a650: 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e  SS_ISO7816 && in
a660: 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43  struction == GSC
a670: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
a680: 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b  && p1 == 0x00) {
a690: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a6a0: 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20  PRINTF("Sending 
a6b0: 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64  APDU: <<censored
a6c0: 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  >>");..} else {.
a6d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a6e0: 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67  RINTBUF("Sending
a6f0: 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75   APDU:", xmit_bu
a700: 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d  f, xmit_len);..}
a710: 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
a720: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
a730: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
a740: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
a750: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
a760: 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69   pioSendPci, xmi
a770: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c  t_buf, xmit_len,
a780: 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c   NULL, recv_buf,
a790: 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69   &recv_len);...i
a7a0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a7b0: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54  t == SCARD_E_NOT
a7c0: 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09  _TRANSACTED) {..
a7d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a7e0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
a7f0: 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72  send APDU to car
a800: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74  d (SCardTransmit
a810: 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69  () = %s/%lx), wi
a820: 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66  ll ask calling f
a830: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79  unction to retry
a840: 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20   (not resetting 
a850: 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45  card)...", CACKE
a860: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
a870: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
a880: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
a890: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
a8a0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
a8b0: 09 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74  ../* Begin Smart
a8c0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
a8d0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
a8e0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
a8f0: 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65  t);....cackey_re
a900: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
a910: 74 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f  t, slot->protoco
a920: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  l);....return(CA
a930: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
a940: 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  Y);..}...if (sca
a950: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
a960: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
a970: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a980: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
a990: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
a9a0: 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73  card (SCardTrans
a9b0: 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22  mit() = %s/%lx)"
a9c0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
a9d0: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
a9e0: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
a9f0: 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  et), (unsigned l
aa00: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
aa10: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
aa20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
aa30: 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61  rking slot as ha
aa40: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22  ving been reset"
aa50: 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  );...cackey_mark
aa60: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
aa70: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
aa80: 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52  xmit_ret == SCAR
aa90: 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20  D_W_RESET_CARD) 
aaa0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
aab0: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
aac0: 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65  required, please
aad0: 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09   hold...");.....
aae0: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
aaf0: 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e   = cackey_reconn
ab00: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53  ect_card(slot, S
ab10: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
ab20: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
ab30: 4c 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73  L_T1);.....if (s
ab40: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
ab50: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
ab60: 53 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68  SS) {.....switch
ab70: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
ab80: 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43  ) {......case SC
ab90: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
aba0: 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63  .......pioSendPc
abb0: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30  i = SCARD_PCI_T0
abc0: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
abd0: 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f  .....case SCARD_
abe0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09  PROTOCOL_T1:....
abf0: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
ac00: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
ac10: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
ac20: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09  .default:.......
ac30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ac40: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
ac50: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74  tocol found, but
ac60: 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20   too late to do 
ac70: 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69  anything about i
ac80: 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20  t now -- trying 
ac90: 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09  anyway.");......
aca0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
acb0: 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
acc0: 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
acd0: 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
ace0: 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
acf0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
ad00: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
ad10: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
ad20: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
ad30: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
ad40: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
ad50: 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
ad60: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
ad70: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
ad80: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
ad90: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
ada0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
adb0: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a  ransmitting");..
adc0: 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  ....recv_len = s
add0: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
ade0: 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f  .....scard_xmit_
adf0: 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73  ret = SCardTrans
ae00: 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  mit(slot->pcsc_c
ae10: 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c  ard, pioSendPci,
ae20: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
ae30: 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f  len, NULL, recv_
ae40: 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b  buf, &recv_len);
ae50: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
ae60: 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52  xmit_ret != SCAR
ae70: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
ae80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ae90: 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73  _PRINTF("Retrans
aea0: 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75  mit failed, retu
aeb0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
aec0: 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63   after disconnec
aed0: 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53  ting the card (S
aee0: 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25  CardTransmit = %
aef0: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
af00: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
af10: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
af20: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  _xmit_ret), (lon
af30: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
af40: 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44  t);.......SCardD
af50: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
af60: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
af70: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
af80: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
af90: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
afa0: 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53  ;......./* End S
afb0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
afc0: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f  tion */......slo
afd0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
afe0: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63  epth = 1;......c
aff0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b000: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b010: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b020: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
b030: 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ENT);.....}....}
b040: 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
b050: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b060: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
b070: 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72  ard");......SCar
b080: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
b090: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
b0a0: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
b0b0: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
b0c0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
b0d0: 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53  0;....../* End S
b0e0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b0f0: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  tion */.....slot
b100: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
b110: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63  pth = 1;.....cac
b120: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b130: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  ion(slot);......
b140: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b150: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b160: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
b170: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b180: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
b190: 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  T);....}...} els
b1a0: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
b1b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
b1c0: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
b1d0: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
b1e0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
b1f0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
b200: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  VE_CARD);....slo
b210: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
b220: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
b230: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b240: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b250: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
b260: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
b270: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b280: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b290: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
b2a0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
b2b0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b2c0: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
b2d0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
b2e0: 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
b2f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b300: 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64  INTBUF("Returned
b310: 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62   Value:", recv_b
b320: 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  uf, recv_len);..
b330: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
b340: 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61  2) {.../* Minima
b350: 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74  l response lengt
b360: 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65  h is 2 bytes, re
b370: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
b380: 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  re */...CACKEY_D
b390: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
b3a0: 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c  ponse too small,
b3b0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
b3c0: 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20  ilure (recv_len 
b3d0: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
b3e0: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
b3f0: 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  n);..../* End Sm
b400: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
b410: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
b420: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b430: 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  slot);....return
b440: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
b450: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
b460: 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c   Determine resul
b470: 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72  t code */..major
b480: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
b490: 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d  ecv_len - 2];..m
b4a0: 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62  inor_rc = recv_b
b4b0: 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d  uf[recv_len - 1]
b4c0: 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29  ;..if (respcode)
b4d0: 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d   {...*respcode =
b4e0: 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29   (major_rc << 8)
b4f0: 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a   | minor_rc;..}.
b500: 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73  ../* Adjust mess
b510: 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72  age buffer */..r
b520: 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09  ecv_len -= 2;...
b530: 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20  /* Add bytes to 
b540: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
b550: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
b560: 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70  n = 0;..if (resp
b570: 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61  data && respdata
b580: 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65  _len) {...tmp_re
b590: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65  spdata_len = *re
b5a0: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62  spdata_len;....b
b5b0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a  ytes_to_copy = *
b5c0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09  respdata_len;...
b5d0: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
b5e0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
b5f0: 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
b600: 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09  y = recv_len;...
b610: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
b620: 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e  G_PRINTF("Copyin
b630: 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74  g %lu bytes to t
b640: 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27  he buffer (recv'
b650: 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74  d %lu bytes, but
b660: 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20   only %lu bytes 
b670: 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66  left in our buff
b680: 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  er)", (unsigned 
b690: 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63  long) bytes_to_c
b6a0: 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  opy, (unsigned l
b6b0: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28  ong) recv_len, (
b6c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
b6d0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a  respdata_len);..
b6e0: 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74  ..memcpy(respdat
b6f0: 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74  a, recv_buf, byt
b700: 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72  es_to_copy);...r
b710: 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73  espdata += bytes
b720: 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65  _to_copy;....*re
b730: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74  spdata_len = byt
b740: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d  es_to_copy;...tm
b750: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d  p_respdata_len -
b760: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
b770: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
b780: 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20  (recv_len != 0) 
b790: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
b7a0: 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69  G_PRINTF("Throwi
b7b0: 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65  ng away %lu byte
b7c0: 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75  s, nowhere to pu
b7d0: 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67  t them!", (unsig
b7e0: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
b7f0: 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  en);...}..}...if
b800: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
b810: 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65  61) {.../* We ne
b820: 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09  ed to READ */...
b830: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b840: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
b850: 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09   required");....
b860: 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20  if (minor_rc == 
b870: 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  0x00) {....minor
b880: 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44  _rc = CACKEY_APD
b890: 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63  U_MTU;...}....pc
b8a0: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
b8b0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
b8c0: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
b8d0: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
b8e0: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53  IS_INSTR_GET_RES
b8f0: 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30  PONSE, 0x00, 0x0
b900: 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f  0, 0, NULL, mino
b910: 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20  r_rc, respcode, 
b920: 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72  respdata, &tmp_r
b930: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
b940: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
b950: 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  p_ret != CACKEY_
b960: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
b970: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b980: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
b990: 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e   failed!  Return
b9a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b9b0: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
b9c0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
b9d0: 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
b9e0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b9f0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70  slot);.....if (p
ba00: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
ba10: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
ba20: 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65  _RETRY) {.....re
ba30: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
ba40: 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a  _E_RETRY);....}.
ba50: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
ba60: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
ba70: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
ba80: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
ba90: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b  .*respdata_len +
baa0: 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  = tmp_respdata_l
bab0: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e  en;...}..../* En
bac0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
bad0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
bae0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
baf0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41  ion(slot);....CA
bb00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bb10: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
bb20: 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20  success (buffer 
bb30: 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29  read complete)")
bb40: 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
bb50: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
bb60: 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
bb70: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
bb80: 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
bb90: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
bba0: 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  ;...if (major_rc
bbb0: 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a   == 0x90) {.../*
bbc0: 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41   Success */...CA
bbd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bbe0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
bbf0: 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72  success (major_r
bc00: 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09  c = 0x90)");....
bc10: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bc20: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09  SC_S_OK);..}....
bc30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc40: 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e  NTF("APDU Return
bc50: 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74  ed an error, ret
bc60: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bc70: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
bc80: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
bc90: 52 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RIC);.}..static 
bca0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
bcb0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
bcc0: 76 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63  v_tag(unsigned c
bcd0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
bce0: 65 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f  e_t *buffer_len_
bcf0: 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  p, unsigned char
bd00: 20 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63   tag, unsigned c
bd10: 68 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20  har *outbuffer, 
bd20: 73 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65  size_t *outbuffe
bd30: 72 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69  r_len_p) {..unsi
bd40: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
bd50: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74  r_p;..size_t out
bd60: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66  buffer_len, buff
bd70: 65 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20  er_len;..size_t 
bd80: 73 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  size;..int idx;.
bd90: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bda0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
bdb0: 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c  ;...if (buffer_l
bdc0: 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  en_p == NULL) {.
bdd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bde0: 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65  RINTF("buffer_le
bdf0: 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65  n_p is NULL.  Re
be00: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
be10: 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  re.");....return
be20: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
be30: 28 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70  (outbuffer_len_p
be40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
be50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
be60: 46 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  F("outbuffer_len
be70: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74  _p is NULL.  Ret
be80: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
be90: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  e.");....return(
bea0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66  NULL);..}...buff
beb0: 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66  er_len = *outbuf
bec0: 66 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62  fer_len_p;..outb
bed0: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74  uffer_len = *out
bee0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09  buffer_len_p;...
bef0: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c  if (buffer_len <
bf00: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
bf10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66  EBUG_PRINTF("buf
bf20: 66 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20  fer_len is less 
bf30: 74 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61  than 2, so we ca
bf40: 6e 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67  n't read any tag
bf50: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  .  Returning in 
bf60: 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72  failure.");....r
bf70: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
bf80: 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66  ..buffer_p = buf
bf90: 66 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72  fer;..if (buffer
bfa0: 5f 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a  _p[0] != tag) {.
bfb0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bfc0: 52 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64  RINTF("Tag found
bfd0: 20 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70   was not tag exp
bfe0: 65 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30  ected.  Tag = %0
bff0: 32 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25  2x, Expected = %
c000: 30 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  02x.  Returning 
c010: 69 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75  in failure.", (u
c020: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66  nsigned int) buf
c030: 66 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a  fer_p[0], tag);.
c040: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c050: 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b  ..}...buffer_p++
c060: 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b  ;..buffer_len--;
c070: 0a 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70  ...if ((buffer_p
c080: 5b 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30  [0] & 0x80) == 0
c090: 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20  x80) {...size = 
c0a0: 30 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66  0;...idx = (buff
c0b0: 65 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b  er_p[0] & 0x7f);
c0c0: 0a 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75  ....if (idx > bu
c0d0: 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43  ffer_len) {....C
c0e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c0f0: 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45  TF("Malformed BE
c100: 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65  R value -- not e
c110: 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69  nough bytes avai
c120: 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65  lable to read le
c130: 6e 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20  ngth (idx = %i, 
c140: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75  buffer_len = %lu
c150: 29 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e  )", idx, (unsign
c160: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f  ed long) buffer_
c170: 6c 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  len);.....return
c180: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66  (NULL);...}....f
c190: 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69  or (; idx > 0; i
c1a0: 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65  dx--) {....buffe
c1b0: 72 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72  r_p++;....buffer
c1c0: 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65  _len--;.....size
c1d0: 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20   <<= 8;....size 
c1e0: 7c 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a  |= buffer_p[0];.
c1f0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
c200: 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b  size = buffer_p[
c210: 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f  0];..}...buffer_
c220: 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e  p++;..buffer_len
c230: 2d 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e  --;...if (size >
c240: 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20   outbuffer_len) 
c250: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c260: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
c270: 74 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75  to copy value bu
c280: 66 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65  ffer to outbuffe
c290: 72 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f  r, not enough ro
c2a0: 6f 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65  om.  Value buffe
c2b0: 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  r length = %lu, 
c2c0: 6f 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74  out buffer lengt
c2d0: 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  h = %lu", (unsig
c2e0: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20  ned long) size, 
c2f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c300: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a  outbuffer_len);.
c310: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c320: 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72  ..}...*outbuffer
c330: 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09  _len_p = size;..
c340: 69 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b  if (outbuffer) {
c350: 0a 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66  ...memcpy(outbuf
c360: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
c370: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
c380: 20 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66   += size;...buff
c390: 65 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a  er_len -= size;.
c3a0: 0a 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70  ...*buffer_len_p
c3b0: 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a   = buffer_len;..
c3c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c3d0: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56  RINTBUF("BER-TLV
c3e0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62   results:", outb
c3f0: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d  uffer, size);..}
c400: 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76   else {...memmov
c410: 65 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  e(buffer, buffer
c420: 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66  _p, size);...buf
c430: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
c440: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c450: 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c  PRINTBUF("BER-TL
c460: 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66  V results:", buf
c470: 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a  fer, size);..}..
c480: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c490: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
c4a0: 69 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a  in success.  Siz
c4b0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f  e of contents fo
c4c0: 72 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c  r tag %02x is %l
c4d0: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  u", (unsigned in
c4e0: 74 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65  t) tag, (unsigne
c4f0: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a  d long) size);..
c500: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70  .return(buffer_p
c510: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
c520: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
c530: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64  e_t cackey_get_d
c540: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65  ata(struct cacke
c550: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
c560: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c570: 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66  fer, size_t buff
c580: 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  er_len, unsigned
c590: 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20   char oid[3]);. 
c5a0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c5b0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c5c0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
c5d0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
c5e0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
c5f0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
c600: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c610: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
c620: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
c630: 20 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66       size_t buff
c640: 65 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  er_len. *       
c650: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
c660: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
c670: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
c680: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64  nsigned char oid
c690: 5b 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33  [3]. *         3
c6a0: 2d 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61  -byte OID to rea
c6b0: 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  d. *. *. * RETUR
c6c0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
c6d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
c6e0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
c6f0: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
c700: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
c710: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
c720: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
c730: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
c740: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74  ize_t cackey_get
c750: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63  _data(struct cac
c760: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
c770: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c780: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75  uffer, size_t bu
c790: 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e  ffer_len, unsign
c7a0: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20  ed char oid[3]) 
c7b0: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
c7c0: 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20   cmd[] = {0x5C, 
c7d0: 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30  0x03, 0x00, 0x00
c7e0: 2c 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e  , 0x00};..unsign
c7f0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f  ed char *buffer_
c800: 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  p;..size_t init_
c810: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65  buffer_len, size
c820: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
c830: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
c840: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c850: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c860: 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75  ed.");...init_bu
c870: 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65  ffer_len = buffe
c880: 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20  r_len;...cmd[2] 
c890: 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33  = oid[0];..cmd[3
c8a0: 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64  ] = oid[1];..cmd
c8b0: 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09  [4] = oid[2];...
c8c0: 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61  /* 256 to indica
c8d0: 74 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d  te the largest m
c8e0: 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e  essage size -- n
c8f0: 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73  ot clear if this
c900: 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20   will work with 
c910: 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  all messages */.
c920: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
c930: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
c940: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
c950: 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30  SO7816, NISTSP80
c960: 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54  0_73_3_INSTR_GET
c970: 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46  _DATA, 0x3F, 0xF
c980: 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20  F, sizeof(cmd), 
c990: 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63  cmd, 256, &respc
c9a0: 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75  ode, buffer, &bu
c9b0: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  ffer_len);...if 
c9c0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
c9d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
c9e0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c9f0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
ca00: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
ca10: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
ca20: 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  ffer");....retur
ca30: 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  n(cackey_get_dat
ca40: 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20  a(slot, buffer, 
ca50: 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c  init_buffer_len,
ca60: 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20   oid));..}...if 
ca70: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
ca80: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
ca90: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
caa0: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
cab0: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
cac0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
cad0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
cae0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69  turn(-1);..}..#i
caf0: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
cb00: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
cb10: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
cb20: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e  if (buffer_len >
cb30: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
cb40: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
cb50: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
cb60: 20 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c   bytes (buffer_l
cb70: 65 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69  en) exceeds maxi
cb80: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
cb90: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
cba0: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66   (max = %li, buf
cbb0: 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  fer_len = %lu)",
cbc0: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
cbd0: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
cbe0: 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72  ned long) buffer
cbf0: 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
cc00: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
cc10: 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62  f.#endif...if (b
cc20: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
cc30: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cc40: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54  PRINTF("APDU GET
cc50: 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25   DATA returned %
cc60: 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  lu bytes, which 
cc70: 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72  is too short for
cc80: 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f   a BER-TLV respo
cc90: 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  nse", (unsigned 
cca0: 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e  long) buffer_len
ccb0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
ccc0: 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75  ;..}...size = bu
ccd0: 66 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65  ffer_len;..buffe
cce0: 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
ccf0: 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
cd00: 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
cd10: 2c 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73  , 0x53, NULL, &s
cd20: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66  ize);...if (buff
cd30: 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  er_p == NULL) {.
cd40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cd50: 52 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64  RINTF("Tag decod
cd60: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ing failed, retu
cd70: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
cd80: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
cd90: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
cda0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45  BUG_PRINTBUF("GE
cdb0: 54 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20  T DATA result", 
cdc0: 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a  buffer, size);..
cdd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cde0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
cdf0: 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64  in success, read
ce00: 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e   %lu bytes", (un
ce10: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
ce20: 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a  e);...return(siz
ce30: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  e);.}../*. * SYN
ce40: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69  POSIS. *     ssi
ce50: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
ce60: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
ce70: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
ce80: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
ce90: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
cea0: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
ceb0: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
cec0: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
ced0: 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  et);. *. * ARGUM
cee0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
cef0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cf00: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
cf10: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
cf20: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
cf30: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
cf40: 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20   *buffer. *     
cf50: 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72      [OUT] Buffer
cf60: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
cf70: 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20  t count. *      
cf80: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
cf90: 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  es to attempt to
cfa0: 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20   read. *. *     
cfb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
cfc0: 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20  or_v. *         
cfd0: 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66  Select the T-buf
cfe0: 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75  fer (01) or V-bu
cff0: 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61  ffer (02) to rea
d000: 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20  d from.  . *. * 
d010: 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69      size_t initi
d020: 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20  al_offset. *    
d030: 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65       Specify the
d040: 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
d050: 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20   the read from. 
d060: 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  *. *. * RETURN V
d070: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73  ALUE. *     This
d080: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d090: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d0a0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
d0b0: 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72  ead, or -1 on er
d0c0: 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ror.. *. * NOTES
d0d0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
d0e0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
d0f0: 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  _t cackey_read_b
d100: 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63  uffer(struct cac
d110: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
d120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
d130: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
d140: 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  unt, unsigned ch
d150: 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f  ar t_or_v, size_
d160: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
d170: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
d180: 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b  ar *init_buffer;
d190: 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f  ..size_t init_co
d1a0: 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  unt;..size_t ini
d1b0: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
d1c0: 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65  ;...size_t offse
d1d0: 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65  t = 0, max_offse
d1e0: 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75  t, max_count;..u
d1f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64  nsigned char cmd
d200: 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  [2];..uint16_t r
d210: 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65  espcode;..int se
d220: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
d230: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
d240: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74  alled.");...init
d250: 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  _buffer = buffer
d260: 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20  ;..init_count = 
d270: 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69  count;..init_ini
d280: 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e  tial_offset = in
d290: 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09  itial_offset;...
d2a0: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
d2b0: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
d2c0: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
d2d0: 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21  ;...if (t_or_v !
d2e0: 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d  = 1 && t_or_v !=
d2f0: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
d300: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
d310: 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61  alid T or V para
d320: 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c  meter specified,
d330: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d340: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
d350: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64  rn(-1);..}...cmd
d360: 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09  [0] = t_or_v;...
d370: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66  while (1) {...if
d380: 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f   (offset >= max_
d390: 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43  offset) {....CAC
d3a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d3b0: 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61  ("Buffer too sma
d3c0: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68  ll, returning wh
d3d0: 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a  at we got...");.
d3e0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
d3f0: 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66  ..count = max_of
d400: 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09  fset - offset;..
d410: 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78  .if (count > max
d420: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75  _count) {....cou
d430: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  nt = max_count;.
d440: 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20  ..}....cmd[1] = 
d450: 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72  count;....send_r
d460: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d470: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d480: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
d490: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
d4a0: 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52  NSTR_READ_BUFFER
d4b0: 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  , ((initial_offs
d4c0: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20  et + offset) >> 
d4d0: 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74  8) & 0xff, (init
d4e0: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
d4f0: 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a  set) & 0xff, siz
d500: 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30  eof(cmd), cmd, 0
d510: 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  x00, &respcode, 
d520: 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c  buffer + offset,
d530: 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20   &count);....if 
d540: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
d550: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
d560: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
d570: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
d580: 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c   Sending failed,
d590: 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62   retrying read b
d5a0: 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74  uffer");.....ret
d5b0: 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f  urn(cackey_read_
d5c0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69  buffer(slot, ini
d5d0: 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63  t_buffer, init_c
d5e0: 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e  ount, t_or_v, in
d5f0: 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  it_initial_offse
d600: 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  t));...}....if (
d610: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
d620: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
d630: 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
d640: 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09  == 0x6A86) {....
d650: 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d  .if (max_count =
d660: 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 1) {......brea
d670: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61  k;.....}......ma
d680: 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f  x_count = max_co
d690: 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f  unt / 2;......co
d6a0: 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
d6b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d6c0: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e  INTF("cackey_sen
d6d0: 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c  d_apdu() failed,
d6e0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d6f0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74  ilure");.....ret
d700: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
d710: 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b  offset += count;
d720: 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  ....if (count < 
d730: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
d740: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d750: 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20  NTF("Short read 
d760: 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63  -- count = %i, c
d770: 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e  md[1] = %i", (in
d780: 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  t) count, (int) 
d790: 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65  cmd[1]);.....bre
d7a0: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  ak;...}..}..#ifd
d7b0: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
d7c0: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
d7d0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
d7e0: 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49   (offset > _POSI
d7f0: 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
d800: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d810: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63  INTF("Offset exc
d820: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
d830: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
d840: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
d850: 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25   %li, offset = %
d860: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
d870: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
d880: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d890: 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  ffset);....retur
d8a0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
d8b0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  if.#endif...CACK
d8c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d8d0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
d8e0: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
d8f0: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
d900: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
d910: 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74  ...return(offset
d920: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
d930: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
d940: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
d950: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
d960: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d970: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
d980: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
d990: 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a   aid_len);. *. *
d9a0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
d9b0: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
d9c0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
d9d0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
d9e0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
d9f0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
da00: 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20  d char *aid. *  
da10: 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f         Buffer co
da20: 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20  ntaining Applet 
da30: 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a  ID to select. *.
da40: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69   *     size_t ai
da50: 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  d_len. *        
da60: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
da70: 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41   in the "aid" (A
da80: 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65  pplet ID) parame
da90: 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ter. *. * RETURN
daa0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
dab0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
dac0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
dad0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
dae0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
daf0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
db00: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
db10: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
db20: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
db30: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
db40: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
db50: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
db60: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73  ned char *aid, s
db70: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b  ize_t aid_len) {
db80: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
db90: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dba0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
dbb0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
dbc0: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63  _PRINTBUF("Selec
dbd0: 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61  ting applet:", a
dbe0: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09  id, aid_len);...
dbf0: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
dc00: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
dc10: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
dc20: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
dc30: 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53  TR_SELECT, GSCIS
dc40: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
dc50: 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f  PLET, 0x00, aid_
dc60: 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20  len, aid, 0x00, 
dc70: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
dc80: 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
dc90: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
dca0: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41  _E_RETRY) {...CA
dcb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dcc0: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
dcd0: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
dce0: 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29   select applet")
dcf0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b  ;....return(cack
dd00: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
dd10: 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f  (slot, aid, aid_
dd20: 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  len));..}...if (
dd30: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
dd40: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
dd50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dd60: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
dd70: 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65   open applet, re
dd80: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
dd90: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
dda0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
ddb0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
ddc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ddd0: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
dde0: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
ddf0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
de00: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
de10: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
de20: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
de30: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
de40: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
de50: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
de60: 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a  t16_t ef);. *. *
de70: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
de80: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
de90: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
dea0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
deb0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
dec0: 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f  *. *     uint16_
ded0: 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20  t ef. *         
dee0: 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74  Elemental File t
def0: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52  o select. *. * R
df00: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
df10: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
df20: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
df30: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
df40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
df50: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
df60: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
df70: 20 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20     This selects 
df80: 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69  an Elementary Fi
df90: 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68  le (EF) under th
dfa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65  e currently sele
dfb0: 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69  cted. *     Dedi
dfc0: 63 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a  cated File (DF).
dfd0: 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61   *. *     Typica
dfe0: 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c  lly this is call
dff0: 65 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69  ed after selecti
e000: 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41  ng the correct A
e010: 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20  pplet (using. * 
e020: 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63      cackey_selec
e030: 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d  t_applet) for VM
e040: 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74   cards. *. */.st
e050: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
e060: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
e070: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
e080: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
e090: 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73  t16_t ef) {..uns
e0a0: 69 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62  igned char fid_b
e0b0: 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64  uf[2];..int send
e0c0: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
e0d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
e0e0: 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65  led.");.../* Ope
e0f0: 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79  n the elementary
e100: 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75   file */..fid_bu
e110: 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29  f[0] = (ef >> 8)
e120: 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75   & 0xff;..fid_bu
e130: 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66  f[1] = ef & 0xff
e140: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e150: 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
e160: 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c  ng file: %04lx",
e170: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
e180: 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74   ef);...send_ret
e190: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
e1a0: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
e1b0: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
e1c0: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
e1d0: 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73  T, 0x02, 0x0C, s
e1e0: 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20  izeof(fid_buf), 
e1f0: 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e  fid_buf, 0x00, N
e200: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
e210: 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
e220: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
e230: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
e240: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
e250: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c  iled to open fil
e260: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
e270: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
e280: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e290: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
e2a0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e2b0: 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75  RINTF("Successfu
e2c0: 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c  lly selected fil
e2d0: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
e2e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
e2f0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
e300: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
e310: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
e320: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e330: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a  _entity *root);.
e340: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e350: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
e360: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e370: 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *root. *        
e380: 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56   Root of the TLV
e390: 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66   list to start f
e3a0: 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54  reeing. *. * RET
e3b0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
e3c0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
e3d0: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
e3e0: 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65  nction frees the
e3f0: 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74   TLV linked list
e400: 65 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ed returned from
e410: 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f  . *     "cackey_
e420: 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f  read_tlv". *. */
e430: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
e440: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72  key_free_tlv(str
e450: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
e460: 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09  ntity *root) {..
e470: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
e480: 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20  v_entity *curr, 
e490: 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f  *next;...if (roo
e4a0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
e4b0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
e4c0: 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75  (curr = root; cu
e4d0: 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29  rr; curr = next)
e4e0: 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72   {...next = curr
e4f0: 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74  ->_next;....swit
e500: 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b  ch (curr->tag) {
e510: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
e520: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
e530: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
e540: 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
e550: 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65  .if (curr->value
e560: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
e570: 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09  rr->value);.....
e580: 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
e590: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
e5a0: 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28  ARDURL:.....if (
e5b0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
e5c0: 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65  url) {......free
e5d0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  (curr->value_car
e5e0: 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09  durl);.....}....
e5f0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66  .break;...}....f
e600: 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09  ree(curr);..}...
e610: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
e620: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
e630: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
e640: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
e650: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
e660: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
e670: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
e680: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
e690: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
e6a0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63  _tlv_entity *cac
e6b0: 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72  key_read_tlv(str
e6c0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e6d0: 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *slot) {..struct
e6e0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e6f0: 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c  ty *curr_entity,
e700: 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a   *root = NULL, *
e710: 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e  last = NULL;..un
e720: 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e  signed char tlen
e730: 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75  _buf[2], tval_bu
e740: 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a  f[1024], *tval;.
e750: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76  .unsigned char v
e760: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c  len_buf[2], vval
e770: 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61  _buf[8192], *vva
e780: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
e790: 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69  r *tmpbuf;..unsi
e7a0: 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66  gned long tmpbuf
e7b0: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c  len;..ssize_t tl
e7c0: 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65  en, vlen;..ssize
e7d0: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69  _t read_ret;..si
e7e0: 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20  ze_t offset_t = 
e7f0: 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b  0, offset_v = 0;
e800: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
e810: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
e820: 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45  gth;.#ifdef HAVE
e830: 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d  _LIBZ..int uncom
e840: 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69  press_ret;.#endi
e850: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
e860: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
e870: 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ");...read_ret =
e880: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
e890: 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62  fer(slot, tlen_b
e8a0: 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f  uf, sizeof(tlen_
e8b0: 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f  buf), 1, offset_
e8c0: 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  t);..if (read_re
e8d0: 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e  t != sizeof(tlen
e8e0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
e8f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e900: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
e910: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e920: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
e930: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20  ULL);..}...tlen 
e940: 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (tlen_buf[1] <
e950: 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b  < 8) | tlen_buf[
e960: 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  0];...read_ret =
e970: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
e980: 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62  fer(slot, vlen_b
e990: 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f  uf, sizeof(vlen_
e9a0: 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f  buf), 2, offset_
e9b0: 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  v);..if (read_re
e9c0: 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e  t != sizeof(vlen
e9d0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
e9e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e9f0: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
ea00: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
ea10: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
ea20: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20  ULL);..}...vlen 
ea30: 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (vlen_buf[1] <
ea40: 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b  < 8) | vlen_buf[
ea50: 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  0];...CACKEY_DEB
ea60: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c  UG_PRINTF("Tag L
ea70: 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c  ength = %lu, Val
ea80: 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22  ue Length = %lu"
ea90: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
eaa0: 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  ) tlen, (unsigne
eab0: 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a  d long) vlen);..
eac0: 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a  .offset_t += 2;.
ead0: 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a  .offset_v += 2;.
eae0: 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a  ..if (tlen > siz
eaf0: 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b  eof(tval_buf)) {
eb00: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
eb10: 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67  PRINTF("Tag leng
eb20: 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c  th is too large,
eb30: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
eb40: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
eb50: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
eb60: 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (vlen > sizeof
eb70: 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (vval_buf)) {...
eb80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
eb90: 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74  NTF("Value lengt
eba0: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
ebb0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ebc0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ebd0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
ebe0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
ebf0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
ec00: 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e  , tval_buf, tlen
ec10: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
ec20: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ec30: 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   tlen) {...CACKE
ec40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ec50: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
ec60: 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20  ntire T-buffer, 
ec70: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ec80: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ec90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
eca0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
ecb0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
ecc0: 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e  , vval_buf, vlen
ecd0: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
ece0: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ecf0: 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   vlen) {...CACKE
ed00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ed10: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
ed20: 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20  ntire V-buffer, 
ed30: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ed40: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ed50: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76  n(NULL);..}...tv
ed60: 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09  al = tval_buf;..
ed70: 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b  vval = vval_buf;
ed80: 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20  ..while (tlen > 
ed90: 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b  0 && vlen > 0) {
eda0: 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a  ...tag = *tval;.
edb0: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e  ..tval++;...tlen
edc0: 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c  --;....if (*tval
edd0: 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c   == 0xff) {....l
ede0: 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d  ength = (tval[2]
edf0: 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d   << 8) | tval[1]
ee00: 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a  ;....tval += 3;.
ee10: 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09  ...tlen -= 3;...
ee20: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67  } else {....leng
ee30: 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74  th = *tval;....t
ee40: 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d  val++;....tlen--
ee50: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
ee60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
ee70: 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43  g: %s (%02x)", C
ee80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
ee90: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29  _TAG_TO_STR(tag)
eea0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
eeb0: 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f   tag);...CACKEY_
eec0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
eed0: 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c  Value:", vval, l
eee0: 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f  ength);....curr_
eef0: 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
ef00: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
ef10: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
ef20: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63  G_CARDURL:.....c
ef30: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
ef40: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
ef50: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63  _entity));.....c
ef60: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
ef70: 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c  e_cardurl = mall
ef80: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
ef90: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
efa0: 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65  rdurl));......me
efb0: 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79  mcpy(curr_entity
efc0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
efd0: 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a  >rid, vval, 5);.
efe0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
eff0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
f000: 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35  apptype = vval[5
f010: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
f020: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
f030: 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76  l->objectid = (v
f040: 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76  val[6] << 8) | v
f050: 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72  val[7];.....curr
f060: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
f070: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20  ardurl->appid = 
f080: 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c  (vval[8] << 8) |
f090: 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63   vval[9];......c
f0a0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
f0b0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
f0c0: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f0d0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f0e0: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
f0f0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
f100: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
f110: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
f120: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09  curr_entity));..
f130: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
f140: 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  oc(length);.....
f150: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
f160: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
f170: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f180: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
f190: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e  curr_entity->len
f1a0: 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  gth = length;...
f1b0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
f1c0: 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  alue = tmpbuf;..
f1d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f1e0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
f1f0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f200: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
f210: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72  IFICATE:.....cur
f220: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
f230: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
f240: 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66  ntity));..#ifdef
f250: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74   HAVE_LIBZ.....t
f260: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
f270: 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75  h * 2;.....tmpbu
f280: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
f290: 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f  flen);......unco
f2a0: 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63  mpress_ret = unc
f2b0: 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20  ompress(tmpbuf, 
f2c0: 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c  &tmpbuflen, vval
f2d0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69  , length);.....i
f2e0: 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
f2f0: 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t != Z_OK) {....
f300: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f310: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
f320: 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63   decompress, unc
f330: 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e  ompress() return
f340: 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69  ed %i -- resorti
f350: 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70  ng to direct cop
f360: 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  y", uncompress_r
f370: 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75  et);.......tmpbu
f380: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
f390: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
f3a0: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
f3b0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
f3c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
f3d0: 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64  UF("Decompressed
f3e0: 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74   to:", tmpbuf, t
f3f0: 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65  mpbuflen);.#else
f400: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f410: 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e  G_PRINTF("Missin
f420: 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20  g ZLIB Support, 
f430: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
f440: 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65   is likely usele
f450: 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d  ss...");......tm
f460: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
f470: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ;.....memcpy(tmp
f480: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
f490: 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09  h);.#endif......
f4a0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
f4b0: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
f4c0: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
f4d0: 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
f4e0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
f4f0: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
f500: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
f510: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
f520: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f530: 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31   GSCIS_TAG_PKCS1
f540: 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  5:.....curr_enti
f550: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
f560: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
f570: 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  );......curr_ent
f580: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
f590: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f5a0: 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76  >value_byte = vv
f5b0: 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[0];.....curr_
f5c0: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f5d0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f5e0: 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d  ;...}....vval +=
f5f0: 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20   length;...vlen 
f600: 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66  -= length;....if
f610: 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d   (curr_entity !=
f620: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
f630: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
f640: 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f  ....root = curr_
f650: 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09  entity;....}....
f660: 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c  .if (last != NUL
f670: 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f  L) {.....last->_
f680: 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  next = curr_enti
f690: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73  ty;....}.....las
f6a0: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
f6b0: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
f6c0: 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  (root);.}../*. *
f6d0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
f6e0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
f6f0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
f700: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
f710: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
f720: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
f730: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
f740: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
f750: 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74  ree_certs(struct
f760: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
f770: 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69  ntity *start, si
f780: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20  ze_t count, int 
f790: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73  free_start) {..s
f7a0: 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20  ize_t idx;...if 
f7b0: 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (start == NULL) 
f7c0: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
f7d0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
f7e0: 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b  dx < count; idx+
f7f0: 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74  +) {...if (start
f800: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f810: 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61  e) {....free(sta
f820: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
f830: 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ate);...}..}...i
f840: 66 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b  f (free_start) {
f850: 0a 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a  ...free(start);.
f860: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
f870: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
f880: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
f890: 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f  ty *cackey_copy_
f8a0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
f8b0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f8c0: 79 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20  y *dest, struct 
f8d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f8e0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
f8f0: 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69  e_t count) {..si
f900: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
f910: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
f920: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
f930: 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d  ..}...if (dest =
f940: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74  = NULL) {...dest
f950: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
f960: 28 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29  (*dest) * count)
f970: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
f980: 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74  = 0; idx < count
f990: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73  ; idx++) {...des
f9a0: 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d  t[idx].id_type =
f9b0: 20 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74   start[idx].id_t
f9c0: 79 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ype;....switch (
f9d0: 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70  dest[idx].id_typ
f9e0: 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43  e) {....case CAC
f9f0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
fa00: 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74  .....memcpy(dest
fa10: 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61  [idx].card.cac.a
fa20: 70 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78  pplet, start[idx
fa30: 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ].card.cac.apple
fa40: 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69  t, sizeof(dest[i
fa50: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70  dx].card.cac.app
fa60: 6c 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74 5b  let));.....dest[
fa70: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69  idx].card.cac.fi
fa80: 6c 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  le = start[idx].
fa90: 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09  card.cac.file;..
faa0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
fab0: 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
fac0: 5f 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b 69  _PIV:.....dest[i
fad0: 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79  dx].card.piv.key
fae0: 5f 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  _id = start[idx]
faf0: 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  .card.piv.key_id
fb00: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73  ;.....memcpy(des
fb10: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e  t[idx].card.piv.
fb20: 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b 69 64 78  label, start[idx
fb30: 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ].card.piv.label
fb40: 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64  , sizeof(dest[id
fb50: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  x].card.piv.labe
fb60: 6c 29 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  l));.....break;.
fb70: 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
fb80: 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
fb90: 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
fba0: 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  ...dest[idx].cer
fbb0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73  tificate_len = s
fbc0: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
fbd0: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73  icate_len;...des
fbe0: 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d  t[idx].keysize =
fbf0: 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73   start[idx].keys
fc00: 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78  ize;....dest[idx
fc10: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ].certificate = 
fc20: 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d  malloc(dest[idx]
fc30: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
fc40: 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74  );...memcpy(dest
fc50: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fc60: 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65  e, start[idx].ce
fc70: 72 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b  rtificate, dest[
fc80: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fc90: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  _len);..}...retu
fca0: 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(dest);.}../*.
fcb0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
fcc0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
fcd0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
fce0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
fcf0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
fd00: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
fd10: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
fd20: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
fd30: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fd40: 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65   *cackey_read_ce
fd50: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
fd60: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74  y_slot *slot, st
fd70: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
fd80: 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73  _identity *certs
fd90: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
fda0: 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  *count) {..struc
fdb0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
fdc0: 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
fdd0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
fde0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f  tlv_entity *ccc_
fdf0: 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20  tlv, *ccc_curr, 
fe00: 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63  *app_tlv, *app_c
fe10: 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  urr;..unsigned c
fe20: 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20  har ccc_aid[] = 
fe30: 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c  {GSCIS_AID_CCC},
fe40: 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49   piv_aid[] = {NI
fe50: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
fe60: 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _AID};..unsigned
fe70: 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20   char *piv_oid, 
fe80: 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b  piv_oid_pivauth[
fe90: 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
fea0: 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d  3_3_OID_PIVAUTH}
feb0: 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74  , piv_oid_signat
fec0: 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  ure[] = {NISTSP8
fed0: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e  00_73_3_OID_SIGN
fee0: 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f  ATURE}, piv_oid_
fef0: 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54  keymgt[] = {NIST
ff00: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
ff10: 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65  EYMGT};..unsigne
ff20: 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b  d char curr_aid[
ff30: 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  7];..unsigned ch
ff40: 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 2c  ar buffer[8192],
ff50: 20 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d 70   *buffer_p, *tmp
ff60: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
ff70: 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a  ong outidx = 0;.
ff80: 09 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c  .char *piv_label
ff90: 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72  ;..cackey_ret tr
ffa0: 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09  ansaction_ret;..
ffb0: 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74  ssize_t read_ret
ffc0: 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72  ;..size_t buffer
ffd0: 5f 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e 3b  _len, tmpbuflen;
ffe0: 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69  ..int certs_resi
fff0: 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64  zable;..int send
10000 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74  _ret, select_ret
10010 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20  ;..int piv_key, 
10020 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64  piv = 0;..int id
10030 78 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c  x;.#ifdef HAVE_L
10040 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72  IBZ..int uncompr
10050 65 73 73 5f 72 65 74 3b 0a 09 7a 5f 73 74 72 65  ess_ret;..z_stre
10060 61 6d 20 67 7a 69 70 5f 73 74 72 65 61 6d 3b 0a  am gzip_stream;.
10070 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
10080 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
10090 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
100a0 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
100b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
100c0 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20  RINTF("count is 
100d0 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20  NULL, returning 
100e0 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
100f0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
10100 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d  }...if (certs !=
10110 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a   NULL) {...if (*
10120 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
10130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10140 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20  INTF("Requested 
10150 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65  we return 0 obje
10160 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75  cts, short-circu
10170 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  it");.....return
10180 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
10190 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f  ..if (!slot->slo
101a0 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20  t_reset) {...if 
101b0 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
101c0 72 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65  rts) {....if (ce
101d0 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
101e0 09 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
101f0 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
10200 20 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   * slot->cached_
10210 63 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  certs_count);...
10220 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d  ..*count = slot-
10230 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
10240 75 6e 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  unt;....} else {
10250 0a 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20  .....if (*count 
10260 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  > slot->cached_c
10270 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  erts_count) {...
10280 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74  ...*count = slot
10290 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
102a0 6f 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ount;.....}....}
102b0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79  .....cackey_copy
102c0 5f 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c  _certs(certs, sl
102d0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
102e0 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72  , *count);.....r
102f0 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
10300 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  }..}...if (slot-
10310 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
10320 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
10330 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65  erts(slot->cache
10340 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  d_certs, slot->c
10350 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
10360 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e  t, 1);....slot->
10370 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e  cached_certs = N
10380 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ULL;..}.../* Beg
10390 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74  in a SmartCard t
103a0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74  ransaction */..t
103b0 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d  ransaction_ret =
103c0 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
103d0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
103e0 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f  ..if (transactio
103f0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
10400 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
10410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10420 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e  TF("Unable begin
10430 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
10440 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10450 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
10460 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
10470 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
10480 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
10490 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
104a0 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20   * 5);...*count 
104b0 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73  = 5;...certs_res
104c0 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65  izable = 1;..} e
104d0 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65  lse {...certs_re
104e0 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a  sizable = 0;..}.
104f0 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20  ../* Select the 
10500 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73  CCC Applet */..s
10510 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10520 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10530 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69  lot, ccc_aid, si
10540 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a  zeof(ccc_aid));.
10550 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
10560 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
10570 4b 29 20 7b 0a 09 09 2f 2a 20 54 72 79 20 50 49  K) {.../* Try PI
10580 56 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a 2f  V application */
10590 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
105a0 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
105b0 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 64  et(slot, piv_aid
105c0 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 64  , sizeof(piv_aid
105d0 29 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  ));...if (send_r
105e0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
105f0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
10600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10610 28 22 57 65 20 68 61 76 65 20 61 20 50 49 56 20  ("We have a PIV 
10620 63 61 72 64 20 2d 2d 20 6e 6f 74 20 75 73 69 6e  card -- not usin
10630 67 20 74 68 65 20 43 43 43 2c 20 70 75 6c 6c 69  g the CCC, pulli
10640 6e 67 20 70 72 65 2d 73 65 6c 65 63 74 65 64 20  ng pre-selected 
10650 6b 65 79 73 22 29 3b 0a 0a 09 09 09 70 69 76 20  keys");.....piv 
10660 3d 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 1;...} else {.
10670 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10680 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
10690 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70  o select CCC App
106a0 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
106b0 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
106c0 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
106d0 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
106e0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
106f0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
10700 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75  (slot);.....retu
10710 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d  rn(NULL);...}..}
10720 0a 0a 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
10730 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
10740 78 20 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a  x < 3; idx++) {.
10750 09 09 09 73 77 69 74 63 68 20 28 69 64 78 29 20  ...switch (idx) 
10760 7b 0a 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09  {.....case 0:...
10770 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
10780 5f 6f 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09  _oid_pivauth;...
10790 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
107a0 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
107b0 50 49 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69  PIVAUTH;......pi
107c0 76 5f 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65  v_label = "Authe
107d0 6e 74 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09  ntication";.....
107e0 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
107f0 20 31 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   1:......piv_oid
10800 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61   = piv_oid_signa
10810 74 75 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ture;......piv_k
10820 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
10830 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52  8_3_KEY_SIGNATUR
10840 45 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65  E;......piv_labe
10850 6c 20 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b  l = "Signature";
10860 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10870 09 63 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69  .case 2:......pi
10880 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
10890 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76  keymgt;......piv
108a0 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
108b0 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54  _78_3_KEY_KEYMGT
108c0 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
108d0 20 3d 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65   = "Key Manageme
108e0 6e 74 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  nt";......break;
108f0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72  ....}.....read_r
10900 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  et = cackey_get_
10910 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
10920 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  r, sizeof(buffer
10930 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09  ), piv_oid);....
10940 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
10950 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e   0) {.....contin
10960 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
10970 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
10980 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
10990 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ++;.....curr_id-
109a0 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09  >keysize = -1;..
109b0 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
109c0 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
109d0 59 50 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72  YPE_PIV;....curr
109e0 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  _id->card.piv.ke
109f0 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a  y_id = piv_key;.
10a00 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
10a10 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  d->card.piv.labe
10a20 6c 2c 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74  l, piv_label, st
10a30 72 6c 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20  rlen(piv_label) 
10a40 2b 20 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  + 1);.....curr_i
10a50 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
10a60 65 6e 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09  en = read_ret;..
10a70 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
10a80 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
10a90 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10aa0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62  cate_len);.....b
10ab0 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
10ac0 6f 66 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62  of(buffer);....b
10ad0 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79  uffer_p = cackey
10ae0 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
10af0 28 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72  (buffer, &buffer
10b00 5f 6c 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72  _len, 0x70, curr
10b10 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10b20 2c 20 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  , &curr_id->cert
10b30 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
10b40 09 09 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d  ..if (buffer_p =
10b50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
10b60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10b70 46 28 22 52 65 61 64 69 6e 67 20 63 65 72 74 69  F("Reading certi
10b80 66 69 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d  ficate from BER-
10b90 54 4c 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69  TLV response fai
10ba0 6c 65 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65  led, skipping ke
10bb0 79 20 25 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09  y %i", idx);....
10bc0 09 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e  ..free(curr_id->
10bd0 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09  certificate);...
10be0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
10bf0 69 66 69 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a  ificate = NULL;.
10c00 0a 09 09 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a  .....outidx--;..
10c10 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10c20 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  .}..#ifdef HAVE_
10c30 4c 49 42 5a 0a 09 09 09 69 66 20 28 63 75 72 72  LIBZ....if (curr
10c40 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10c50 5f 6c 65 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09  _len > 4) {.....
10c60 69 66 20 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f  if (memcmp(curr_
10c70 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  id->certificate,
10c80 20 22 5c 78 31 66 5c 78 38 62 5c 78 30 38 5c 78   "\x1f\x8b\x08\x
10c90 30 30 22 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a  00", 4) == 0) {.
10ca0 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
10cb0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
10cc0 69 63 61 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09  icate_len * 2;..
10cd0 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c  ....tmpbuf = mal
10ce0 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  loc(tmpbuflen);.
10cf0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10d00 55 47 5f 50 52 49 4e 54 42 55 46 28 22 41 74 74  UG_PRINTBUF("Att
10d10 65 6d 70 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d  empting to decom
10d20 70 72 65 73 73 3a 22 2c 20 63 75 72 72 5f 69 64  press:", curr_id
10d30 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  ->certificate, c
10d40 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10d50 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  ate_len);.......
10d60 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c  gzip_stream.zall
10d70 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  oc = NULL;......
10d80 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65  gzip_stream.zfre
10d90 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67  e = NULL;......g
10da0 7a 69 70 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75  zip_stream.opaqu
10db0 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  e = NULL;.......
10dc0 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74  gzip_stream.next
10dd0 5f 69 6e 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e  _in  = curr_id->
10de0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
10df0 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76  ..gzip_stream.av
10e00 61 69 6c 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64  ail_in = curr_id
10e10 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10e20 6e 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  n;......gzip_str
10e30 65 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74  eam.next_out = t
10e40 6d 70 62 75 66 3b 0a 09 09 09 09 09 67 7a 69 70  mpbuf;......gzip
10e50 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75  _stream.avail_ou
10e60 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a  t = tmpbuflen;..
10e70 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f  .....uncompress_
10e80 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69  ret = inflateIni
10e90 74 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b  t(&gzip_stream);
10ea0 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ......if (uncomp
10eb0 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b  ress_ret == Z_OK
10ec0 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70  ) {.......uncomp
10ed0 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61  ress_ret = infla
10ee0 74 65 52 65 73 65 74 32 28 26 67 7a 69 70 5f 73  teReset2(&gzip_s
10ef0 74 72 65 61 6d 2c 20 33 31 29 3b 0a 09 09 09 09  tream, 31);.....
10f00 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f  .}......if (unco
10f10 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f  mpress_ret == Z_
10f20 4f 4b 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f  OK) {.......unco
10f30 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66  mpress_ret = inf
10f40 6c 61 74 65 28 26 67 7a 69 70 5f 73 74 72 65 61  late(&gzip_strea
10f50 6d 2c 20 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09  m, 0);......}...
10f60 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73  ...if (uncompres
10f70 73 5f 72 65 74 20 3d 3d 20 5a 5f 53 54 52 45 41  s_ret == Z_STREA
10f80 4d 5f 45 4e 44 29 20 7b 0a 09 09 09 09 09 09 75  M_END) {.......u
10f90 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
10fa0 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70  inflateEnd(&gzip
10fb0 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 7d  _stream);......}
10fc0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6e   else {.......un
10fd0 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 5a  compress_ret = Z
10fe0 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 09 09 09  _DATA_ERROR;....
10ff0 09 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63  ..}......if (unc
11000 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a  ompress_ret == Z
11010 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 43 41 43  _OK) {.......CAC
11020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
11030 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64  UF("Decompressed
11040 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74   to:", tmpbuf, t
11050 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  mpbuflen);......
11060 09 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e  ..free(curr_id->
11070 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09  certificate);...
11080 09 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
11090 72 74 69 66 69 63 61 74 65 20 3d 20 74 6d 70 62  rtificate = tmpb
110a0 75 66 3b 0a 09 09 09 09 09 09 63 75 72 72 5f 69  uf;.......curr_i
110b0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
110c0 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  en = tmpbuflen;.
110d0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
110e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
110f0 5f 50 52 49 4e 54 46 28 22 44 65 63 6f 6d 70 72  _PRINTF("Decompr
11100 65 73 73 69 6e 67 20 66 61 69 6c 65 64 21 20 75  essing failed! u
11110 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75  ncompress() retu
11120 72 6e 65 64 20 25 69 22 2c 20 75 6e 63 6f 6d 70  rned %i", uncomp
11130 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09  ress_ret);......
11140 09 09 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a  ..free(tmpbuf);.
11150 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
11160 7d 0a 23 65 6e 64 69 66 0a 09 09 7d 0a 09 7d 20  }.#endif...}..} 
11170 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64  else {.../* Read
11180 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
11190 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
111a0 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76  TLV */...ccc_tlv
111b0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
111c0 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20  lv(slot);..../* 
111d0 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c  Look for CARDURL
111e0 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e  s that coorespon
111f0 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73  d to PKI applets
11200 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63 5f 63   */...for (ccc_c
11210 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63  urr = ccc_tlv; c
11220 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 72  cc_curr; ccc_cur
11230 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e  r = ccc_curr->_n
11240 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ext) {....CACKEY
11250 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
11260 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e  ound tag: %s ...
11270 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47   ", CACKEY_DEBUG
11280 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
11290 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29  (ccc_curr->tag))
112a0 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 5f 63 75  ;.....if (ccc_cu
112b0 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
112c0 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a  _TAG_CARDURL) {.
112d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
112e0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
112f0 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
11300 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
11310 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09  ARDURLs)");.....
11320 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
11330 0a 09 09 09 69 66 20 28 28 63 63 63 5f 63 75 72  ....if ((ccc_cur
11340 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11350 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b  ->apptype & CACK
11360 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20  EY_TLV_APP_PKI) 
11370 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  != CACKEY_TLV_AP
11380 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43 41 43  P_PKI) {.....CAC
11390 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
113a0 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67  ("  ... skipping
113b0 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72   it (we only car
113c0 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c  e about PKI appl
113d0 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74  ets, this applet
113e0 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30   supports: %s/%0
113f0 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
11400 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
11410 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
11420 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
11430 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67  apptype), (unsig
11440 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72  ned int) ccc_cur
11450 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11460 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09  ->apptype);.....
11470 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
11480 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11490 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
114a0 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
114b0 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
114c0 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
114d0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
114e0 72 69 64 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  rid));....CACKEY
114f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
11500 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ppID = %s/%04lx"
11510 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
11520 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
11530 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
11540 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
11550 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11560 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
11570 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
11580 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
11590 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63  UG_PRINTF("Objec
115a0 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  tID = %s/%04lx",
115b0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
115c0 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
115d0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
115e0 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
115f0 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
11600 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
11610 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
11620 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63  ectid);.....memc
11630 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
11640 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11650 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
11660 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
11670 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
11680 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69  ;....curr_aid[si
11690 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
116a0 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d   2] = (ccc_curr-
116b0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
116c0 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78  appid >> 8) & 0x
116d0 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b  ff;....curr_aid[
116e0 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
116f0 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72   - 1] = ccc_curr
11700 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11710 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a  >appid & 0xff;..
11720 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75  .../* Select fou
11730 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f  nd applet ... */
11740 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
11750 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
11760 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72  pplet(slot, curr
11770 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
11780 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 66 20 28  r_aid));....if (
11790 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41  select_ret != CA
117a0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
117b0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
117c0 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
117d0 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c  d to select appl
117e0 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  et, skipping pro
117f0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
11800 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
11810 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
11820 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a  ../* ... and obj
11830 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09  ect (file) */...
11840 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
11850 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
11860 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d  (slot, ccc_curr-
11870 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
11880 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 09 69 66  objectid);....if
11890 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20   (select_ret != 
118a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
118b0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
118c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
118d0 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69  led to select fi
118e0 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  le, skipping pro
118f0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
11900 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
11910 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
11920 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69  ../* Process thi
11930 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f  s file's TLV loo
11940 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69  king for certifi
11950 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f  cates */....app_
11960 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
11970 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09  d_tlv(slot);....
11980 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20  ..for (app_curr 
11990 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63  = app_tlv; app_c
119a0 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20  urr; app_curr = 
119b0 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29  app_curr->_next)
119c0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
119d0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
119e0 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 4b  d tag: %s", CACK
119f0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
11a00 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 72  G_TO_STR(app_cur
11a10 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09 69 66  r->tag));.....if
11a20 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20   (app_curr->tag 
11a30 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  != GSCIS_TAG_CER
11a40 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
11a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11a60 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
11a70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
11a80 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54   care about CERT
11a90 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09  IFICATEs)");....
11aa0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
11ab0 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 20  .}......curr_id 
11ac0 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
11ad0 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ;.....outidx++;.
11ae0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 69 64  .....curr_id->id
11af0 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59 5f 49  _type = CACKEY_I
11b00 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09 09 09  D_TYPE_CAC;.....
11b10 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
11b20 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c  card.cac.applet,
11b30 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f   curr_aid, sizeo
11b40 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11b50 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  cac.applet));...
11b60 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  ..curr_id->card.
11b70 63 61 63 2e 66 69 6c 65 20 3d 20 63 63 63 5f 63  cac.file = ccc_c
11b80 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
11b90 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09  rl->objectid;...
11ba0 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69  ..curr_id->keysi
11bb0 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41  ze = -1;......CA
11bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11bd0 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f  F("Filling curr_
11be0 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
11bf0 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25 6c  let (%p) with %l
11c00 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f  u bytes:", curr_
11c10 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
11c20 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  let, (unsigned l
11c30 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72  ong) sizeof(curr
11c40 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
11c50 70 6c 65 74 29 29 3b 0a 09 09 09 09 43 41 43 4b  plet));.....CACK
11c60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
11c70 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69  F("VAL:", curr_i
11c80 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
11c90 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  et, sizeof(curr_
11ca0 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
11cb0 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63 75 72 72  let));......curr
11cc0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11cd0 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d  _len = app_curr-
11ce0 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75  >length;......cu
11cf0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11d00 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
11d10 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11d20 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
11d30 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  y(curr_id->certi
11d40 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72  ficate, app_curr
11d50 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64  ->value, curr_id
11d60 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
11d70 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 75 74  n);......if (out
11d80 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
11d90 0a 09 09 09 09 09 69 66 20 28 63 65 72 74 73 5f  ......if (certs_
11da0 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09  resizable) {....
11db0 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a  ...*count *= 2;.
11dc0 09 09 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74  ......if (*count
11dd0 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09   != 0) {........
11de0 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
11df0 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
11e00 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
11e10 29 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  );.......} else 
11e20 7b 0a 09 09 09 09 09 09 09 63 65 72 74 73 20 3d  {........certs =
11e30 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 7d 0a 09   NULL;.......}..
11e40 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
11e50 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
11e60 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
11e70 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
11e80 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66  app_tlv);.....if
11e90 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75   (outidx >= *cou
11ea0 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  nt) {.....break;
11eb0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63  ....}...}....cac
11ec0 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63  key_free_tlv(ccc
11ed0 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75  _tlv);..}...*cou
11ee0 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69  nt = outidx;...i
11ef0 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62  f (certs_resizab
11f00 6c 65 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75  le) {...if (*cou
11f10 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 65  nt != 0) {....ce
11f20 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
11f30 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
11f40 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
11f50 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63  ...} else {....c
11f60 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  erts = NULL;...}
11f70 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68  ..}...slot->cach
11f80 65 64 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65  ed_certs = cacke
11f90 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c  y_copy_certs(NUL
11fa0 4c 2c 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74  L, certs, *count
11fb0 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  );..slot->cached
11fc0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a  _certs_count = *
11fd0 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d  count;.../* Term
11fe0 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20  inate SmartCard 
11ff0 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
12000 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
12010 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
12020 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d  return(certs);.}
12030 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
12040 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
12050 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
12060 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
12070 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
12080 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
12090 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
120a0 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
120b0 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  t cackey_signdec
120c0 72 79 70 74 28 73 74 72 75 63 74 20 63 61 63 6b  rypt(struct cack
120d0 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73  ey_slot *slot, s
120e0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
120f0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
12100 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12110 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c  buf, size_t bufl
12120 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  en, unsigned cha
12130 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f  r *outbuf, size_
12140 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74  t outbuflen, int
12150 20 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75   padInput, int u
12160 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 63  npadOutput) {..c
12170 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
12180 70 65 20 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  pe id_type;..uns
12190 69 67 6e 65 64 20 63 68 61 72 20 64 79 6e 5f 61  igned char dyn_a
121a0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d  uth_template[10]
121b0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
121c0 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75   *tmpbuf, *tmpbu
121d0 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 2c 20  f_s, *outbuf_s, 
121e0 2a 6f 75 74 62 75 66 5f 70 3b 0a 09 75 6e 73 69  *outbuf_p;..unsi
121f0 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f  gned char bytes_
12200 74 6f 5f 73 65 6e 64 2c 20 70 31 2c 20 63 6c 61  to_send, p1, cla
12210 73 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ss;..unsigned ch
12220 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63  ar blocktype;..c
12230 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72  ackey_ret send_r
12240 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  et;..uint16_t re
12250 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74  spcode;..ssize_t
12260 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70   retval = 0, unp
12270 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f  adoffset;..size_
12280 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64  t tmpbuflen, pad
12290 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65  len, tmpoutbufle
122a0 6e 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 09  n, outbuf_len;..
122b0 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20  int free_tmpbuf 
122c0 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09  = 0;..int le;...
122d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
122e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
122f0 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55  ..if (slot == NU
12300 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
12310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12320 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c  or.  slot is NUL
12330 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
12340 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66  1);..}...if (buf
12350 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
12360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12370 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69  F("Error.  buf i
12380 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
12390 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
123a0 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c   (outbuf == NULL
123b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
123c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
123d0 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c  .  outbuf is NUL
123e0 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
123f0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65  1);..}...if (ide
12400 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
12410 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12420 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
12430 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c  identity is NULL
12440 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
12450 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e  );..}...if (iden
12460 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12470 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
12480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
124a0 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
124b0 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b  ntity is NULL");
124c0 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
124d0 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20 69  .}...id_type = i
124e0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
124f0 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 3b  entity->id_type;
12500 0a 09 69 66 20 28 69 64 5f 74 79 70 65 20 3d 3d  ..if (id_type ==
12510 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
12520 43 45 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43  CERT_ONLY) {...C
12530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12540 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
12550 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12560 69 74 79 20 69 73 20 43 41 43 4b 45 59 5f 49 44  ity is CACKEY_ID
12570 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c  _TYPE_CERT_ONLY,
12580 20 77 68 69 63 68 20 63 61 6e 6e 6f 74 20 62 65   which cannot be
12590 20 75 73 65 64 20 66 6f 72 20 73 69 67 6e 2f 64   used for sign/d
125a0 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 72 65 74  ecrypt");....ret
125b0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77  urn(-1);..}...sw
125c0 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
125d0 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
125e0 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 63 61  D_TYPE_PIV:...ca
125f0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
12600 45 5f 43 41 43 3a 0a 09 09 09 62 72 65 61 6b 3b  E_CAC:....break;
12610 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43  ...default:....C
12620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12630 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
12640 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12650 69 74 79 20 69 73 20 6e 6f 74 20 61 20 73 75 70  ity is not a sup
12660 70 6f 72 74 65 64 20 76 61 6c 75 65 2e 20 54 79  ported value. Ty
12670 70 65 20 69 73 3a 20 30 78 25 6c 78 20 28 50 49  pe is: 0x%lx (PI
12680 56 20 3d 20 30 78 25 6c 78 2c 20 43 41 43 20 3d  V = 0x%lx, CAC =
12690 20 30 78 25 6c 78 29 22 2c 20 28 75 6e 73 69 67   0x%lx)", (unsig
126a0 6e 65 64 20 6c 6f 6e 67 29 20 69 64 5f 74 79 70  ned long) id_typ
126b0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
126c0 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  g) CACKEY_ID_TYP
126d0 45 5f 50 49 56 2c 20 28 75 6e 73 69 67 6e 65 64  E_PIV, (unsigned
126e0 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44   long) CACKEY_ID
126f0 5f 54 59 50 45 5f 43 41 43 29 3b 0a 0a 09 09 09  _TYPE_CAC);.....
12700 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
12710 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64  ./* Determine id
12720 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20  entity Key size 
12730 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  */..if (identity
12740 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
12750 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a  >keysize < 0) {.
12760 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  ..identity->pcsc
12770 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
12780 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79  ze = x509_to_key
12790 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70  size(identity->p
127a0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
127b0 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74  rtificate, ident
127c0 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
127d0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
127e0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61  len);..}.../* Pa
127f0 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79  d message to key
12800 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61   size */..if (pa
12810 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28  dInput) {...if (
12820 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12830 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
12840 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62   > 0) {....if (b
12850 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74  uflen != identit
12860 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12870 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09  ->keysize) {....
12880 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69  .if (buflen > (i
12890 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
128a0 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
128b0 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43  + 3)) {......CAC
128c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
128d0 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67  ("Error.  Messag
128e0 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  e is too large t
128f0 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29  o sign/decrypt")
12900 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ;.......return(-
12910 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74  1);.....}......t
12920 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74  mpbuflen = ident
12930 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12940 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09  ty->keysize;....
12950 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
12960 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09  (tmpbuflen);....
12970 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31  .free_tmpbuf = 1
12980 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20  ;......padlen = 
12990 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c  tmpbuflen - bufl
129a0 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20  en - 3;....../* 
129b0 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41 2d  RSA PKCS#1 EMSA-
129c0 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64 69  PKCS1-v1_5 Paddi
129d0 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66  ng */.....tmpbuf
129e0 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  [0] = 0x00;.....
129f0 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31  tmpbuf[1] = 0x01
12a00 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d  ;.....memset(&tm
12a10 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70  pbuf[2], 0xFF, p
12a20 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62  adlen);.....tmpb
12a30 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20  uf[padlen + 2]= 
12a40 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79  0x00;.....memcpy
12a50 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  (&tmpbuf[padlen 
12a60 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65  + 3], buf, bufle
12a70 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  n);......CACKEY_
12a80 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
12a90 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c  Unpadded:", buf,
12aa0 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41   buflen);.....CA
12ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12ac0 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74  BUF("Padded:", t
12ad0 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
12ae0 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  );....} else {..
12af0 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
12b00 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
12b10 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65   buflen;.....fre
12b20 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
12b30 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
12b40 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
12b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12b60 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
12b70 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69  determine key si
12b80 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d  ze, hoping the m
12b90 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 72  essage is proper
12ba0 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09  ly padded!");...
12bb0 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
12bc0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
12bd0 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74  uflen;....free_t
12be0 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61  mpbuf = 0;....pa
12bf0 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  dlen = 0;...}..}
12c00 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66   else {...tmpbuf
12c10 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66   = buf;...tmpbuf
12c20 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
12c30 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
12c40 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
12c50 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61  }.../* Begin tra
12c60 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
12c70 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
12c80 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f  ction(slot);.../
12c90 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
12ca0 20 61 70 70 6c 65 74 20 2a 2f 0a 09 73 77 69 74   applet */..swit
12cb0 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
12cc0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
12cd0 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 43 41 43  TYPE_CAC:....CAC
12ce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12cf0 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
12d00 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e  et found at %p .
12d10 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ..", identity->p
12d20 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
12d30 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 3b 0a  rd.cac.applet);.
12d40 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ...cackey_select
12d50 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64  _applet(slot, id
12d60 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12d70 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e  ntity->card.cac.
12d80 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69  applet, sizeof(i
12d90 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12da0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
12db0 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 2f  .applet));...../
12dc0 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
12dd0 20 66 69 6c 65 20 2a 2f 0a 09 09 09 63 61 63 6b   file */....cack
12de0 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
12df0 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
12e00 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
12e10 72 64 2e 63 61 63 2e 66 69 6c 65 29 3b 0a 09 09  rd.cac.file);...
12e20 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
12e30 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
12e40 56 3a 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  V:....dyn_auth_t
12e50 65 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37  emplate[0] = 0x7
12e60 43 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  C;....dyn_auth_t
12e70 65 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78 38  emplate[1] = 0x8
12e80 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  2;....dyn_auth_t
12e90 65 6d 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28 74  emplate[2] = ((t
12ea0 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20  mpbuflen + 6) & 
12eb0 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
12ec0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12ed0 74 65 5b 33 5d 20 3d 20 28 74 6d 70 62 75 66 6c  te[3] = (tmpbufl
12ee0 65 6e 20 2b 20 36 29 20 26 20 30 78 30 30 66 66  en + 6) & 0x00ff
12ef0 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f00 6d 70 6c 61 74 65 5b 34 5d 20 3d 20 30 78 38 32  mplate[4] = 0x82
12f10 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f20 6d 70 6c 61 74 65 5b 35 5d 20 3d 20 30 78 30 30  mplate[5] = 0x00
12f30 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f40 6d 70 6c 61 74 65 5b 36 5d 20 3d 20 30 78 38 31  mplate[6] = 0x81
12f50 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f60 6d 70 6c 61 74 65 5b 37 5d 20 3d 20 30 78 38 32  mplate[7] = 0x82
12f70 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f80 6d 70 6c 61 74 65 5b 38 5d 20 3d 20 28 74 6d 70  mplate[8] = (tmp
12f90 62 75 66 6c 65 6e 20 26 20 30 78 66 66 30 30 29  buflen & 0xff00)
12fa0 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75   >> 8;....dyn_au
12fb0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 39 5d 20 3d  th_template[9] =
12fc0 20 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 30   tmpbuflen & 0x0
12fd0 30 66 66 3b 0a 0a 09 09 09 73 65 6e 64 5f 72 65  0ff;.....send_re
12fe0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
12ff0 61 70 64 75 28 73 6c 6f 74 2c 20 30 78 31 30 2c  apdu(slot, 0x10,
13000 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
13010 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e  INSTR_GENAUTH, N
13020 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c  ISTSP800_78_3_AL
13030 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65 6e  GO_RSA2048, iden
13040 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13050 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  ity->card.piv.ke
13060 79 5f 69 64 2c 20 73 69 7a 65 6f 66 28 64 79 6e  y_id, sizeof(dyn
13070 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c  _auth_template),
13080 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61   dyn_auth_templa
13090 74 65 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  te, 0x00, NULL, 
130a0 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09  NULL, NULL);....
130b0 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
130c0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
130d0 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b  T_ONLY:....break
130e0 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75 66 5f 73 20  ;..}...tmpbuf_s 
130f0 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75  = tmpbuf;..outbu
13100 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77  f_s = outbuf;..w
13110 68 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29  hile (tmpbuflen)
13120 20 7b 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65   {...tmpoutbufle
13130 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a  n = outbuflen;..
13140 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20  ..if (tmpbuflen 
13150 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  > CACKEY_APDU_MT
13160 55 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f  U) {....bytes_to
13170 5f 73 65 6e 64 20 3d 20 43 41 43 4b 45 59 5f 41  _send = CACKEY_A
13180 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 20 65 6c 73  PDU_MTU;...} els
13190 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  e {....bytes_to_
131a0 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e  send = tmpbuflen
131b0 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 5f 72 65  ;...}....send_re
131c0 74 20 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f  t = CACKEY_PCSC_
131d0 45 5f 47 45 4e 45 52 49 43 3b 0a 09 09 73 77 69  E_GENERIC;...swi
131e0 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a  tch (id_type) {.
131f0 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
13200 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09  D_TYPE_CAC:.....
13210 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
13220 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29  CACKEY_APDU_MTU)
13230 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78 38   {......p1 = 0x8
13240 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30  0;......le = 0x0
13250 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  0;.....} else {.
13260 09 09 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a  .....p1 = 0x00;.
13270 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  .....le = 0x00;.
13280 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f  ....}......send_
13290 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
132a0 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
132b0 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
132c0 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f  PLATFORM, GSCIS_
132d0 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50  INSTR_SIGNDECRYP
132e0 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74  T, p1, 0x00, byt
132f0 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62  es_to_send, tmpb
13300 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64  uf, le, &respcod
13310 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f  e, outbuf, &tmpo
13320 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62  utbuflen);.....b
13330 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41  reak;....case CA
13340 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
13350 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  :.....if (tmpbuf
13360 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
13370 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 63 6c  U_MTU) {......cl
13380 61 73 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09  ass = 0x10;.....
13390 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  .le = 0x00;.....
133a0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 63 6c  } else {......cl
133b0 61 73 73 20 3d 20 47 53 43 49 53 5f 43 4c 41 53  ass = GSCIS_CLAS
133c0 53 5f 49 53 4f 37 38 31 36 3b 0a 09 09 09 09 09  S_ISO7816;......
133d0 6c 65 20 3d 20 32 35 36 3b 0a 09 09 09 09 7d 0a  le = 256;.....}.
133e0 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  .....send_ret = 
133f0 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
13400 28 73 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49  (slot, class, NI
13410 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
13420 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54  TR_GENAUTH, NIST
13430 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f  SP800_78_3_ALGO_
13440 52 53 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74  RSA2048, identit
13450 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13460 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69  ->card.piv.key_i
13470 64 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  d, bytes_to_send
13480 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72  , tmpbuf, le, &r
13490 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c  espcode, outbuf,
134a0 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b   &tmpoutbuflen);
134b0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
134c0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
134d0 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
134e0 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
134f0 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
13500 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
13510 29 20 7b 0a 09 09 09 69 66 20 28 66 72 65 65 5f  ) {....if (free_
13520 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66  tmpbuf) {.....if
13530 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
13540 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
13550 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
13560 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63  ../* End transac
13570 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
13580 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
13590 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20  n(slot);.....if 
135a0 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
135b0 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
135c0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
135d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
135e0 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64  U Sending Failed
135f0 20 2d 2d 20 72 65 74 72 79 69 6e 67 2e 22 29 3b   -- retrying.");
13600 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 63  ......return(cac
13610 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
13620 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2c 20  slot, identity, 
13630 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20 6f 75 74  buf, buflen, out
13640 62 75 66 2c 20 6f 75 74 62 75 66 6c 65 6e 2c 20  buf, outbuflen, 
13650 70 61 64 49 6e 70 75 74 2c 20 75 6e 70 61 64 4f  padInput, unpadO
13660 75 74 70 75 74 29 29 3b 0a 09 09 09 7d 0a 0a 09  utput));....}...
13670 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13680 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
13690 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
136a0 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
136b0 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73  .");.....if (res
136c0 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 20  pcode == 0x6982 
136d0 7c 7c 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  || respcode == 0
136e0 78 36 65 30 30 29 20 7b 0a 09 09 09 09 69 66 20  x6e00) {.....if 
136f0 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
13700 45 30 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  E00) {......CACK
13710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13720 22 47 6f 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41  "Got \"WRONG CLA
13730 53 53 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e 73  SS\", this means
13740 20 77 65 20 61 72 65 20 74 61 6c 6b 69 6e 67 20   we are talking 
13750 74 6f 20 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a  to the wrong obj
13760 65 63 74 20 28 6c 69 6b 65 6c 79 20 62 65 63 61  ect (likely beca
13770 75 73 65 20 74 68 65 20 63 61 72 64 20 77 65 6e  use the card wen
13780 74 20 61 77 61 79 29 20 2d 2d 20 72 65 73 65 74  t away) -- reset
13790 74 69 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65 6c  ting");.....} el
137a0 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  se {......CACKEY
137b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
137c0 65 63 75 72 69 74 79 20 73 74 61 74 75 73 20 6e  ecurity status n
137d0 6f 74 20 73 61 74 69 73 69 66 69 65 64 20 28 72  ot satisified (r
137e0 65 73 70 63 6f 64 65 20 3d 20 30 78 25 30 34 78  espcode = 0x%04x
137f0 29 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45  ).  Returning NE
13800 45 44 4c 4f 47 49 4e 22 2c 20 28 69 6e 74 29 20  EDLOGIN", (int) 
13810 72 65 73 70 63 6f 64 65 29 3b 0a 09 09 09 09 7d  respcode);.....}
13820 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
13830 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
13840 74 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  t);......slot->t
13850 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
13860 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
13870 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
13880 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
13890 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  OGIN);....}.....
138a0 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
138b0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
138c0 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
138d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
138e0 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65  INTF("Token abse
138f0 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54  nt.  Returning T
13900 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09  OKENABSENT");...
13910 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
13920 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
13930 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
13940 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
13950 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09  ABSENT);....}...
13960 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
13970 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62  }....tmpbuf += b
13980 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09  ytes_to_send;...
13990 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74  tmpbuflen -= byt
139a0 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f  es_to_send;....o
139b0 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62  utbuf += tmpoutb
139c0 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c  uflen;...outbufl
139d0 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c  en -= tmpoutbufl
139e0 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20  en;...retval += 
139f0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d  tmpoutbuflen;..}
13a00 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
13a10 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62  uf) {...if (tmpb
13a20 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28  uf_s) {....free(
13a30 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09  tmpbuf_s);...}..
13a40 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74  }...outbuf = out
13a50 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20  buf_s;.../* End 
13a60 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
13a70 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
13a80 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23  action(slot);..#
13a90 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
13aa0 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
13ab0 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
13ac0 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
13ad0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
13ae0 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
13af0 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62  BUG_PRINTF("Outb
13b00 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61  uflen exceeds ma
13b10 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
13b20 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
13b30 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
13b40 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22  utbuflen = %lu)"
13b50 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
13b60 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
13b70 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
13b80 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  flen);....return
13b90 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
13ba0 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 57 65  f.#endif.../* We
13bb0 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68 65   must remove the
13bc0 20 22 37 43 22 20 74 61 67 20 74 6f 20 67 65 74   "7C" tag to get
13bd0 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74 75 72   to the signatur
13be0 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  e */..switch (id
13bf0 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
13c00 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
13c10 49 56 3a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65  IV:....outbuf_le
13c20 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f  n = retval;....o
13c30 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79  utbuf_p = cackey
13c40 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
13c50 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66  (outbuf, &outbuf
13c60 5f 6c 65 6e 2c 20 30 78 37 43 2c 20 4e 55 4c 4c  _len, 0x7C, NULL
13c70 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b  ,  &outbuf_len);
13c80 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70  ....if (outbuf_p
13c90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
13ca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13cb0 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72  NTF("Response fr
13cc0 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52  om PIV for GENER
13cd0 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49  ATE AUTHENTICATI
13ce0 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 37  ON was not a 0x7
13cf0 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67  C tag, returning
13d00 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
13d10 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13d20 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20  ...}.....retval 
13d30 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09  = outbuf_len;...
13d40 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72  ..outbuf_len = r
13d50 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66  etval;....outbuf
13d60 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
13d70 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62  _bertlv_tag(outb
13d80 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c  uf, &outbuf_len,
13d90 20 30 78 38 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f   0x82, NULL,  &o
13da0 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69  utbuf_len);....i
13db0 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e  f (outbuf_p == N
13dc0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
13dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13de0 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49  Response from PI
13df0 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41  V for GENERATE A
13e00 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61  UTHENTICATION wa
13e10 73 20 6e 6f 74 20 61 20 30 78 38 32 20 77 69 74  s not a 0x82 wit
13e20 68 69 6e 20 61 20 30 78 37 43 20 74 61 67 2c 20  hin a 0x7C tag, 
13e30 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
13e40 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74  lure");......ret
13e50 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09  urn(-1);....}...
13e60 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75  ..retval = outbu
13e70 66 5f 6c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b  f_len;.....break
13e80 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
13e90 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 63  ID_TYPE_CAC:...c
13ea0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
13eb0 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
13ec0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20  .break;..}.../* 
13ed0 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09  Unpad reply */..
13ee0 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29  if (unpadOutput)
13ef0 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20   {...if (retval 
13f00 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  < 3) {....CACKEY
13f10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13f20 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c  eply is too smal
13f30 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62  l, we are not ab
13f40 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70  le to unpad -- p
13f50 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
13f60 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
13f70 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b  est!");.....CACK
13f80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13f90 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
13fa0 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
13fb0 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
13fc0 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09  ong) retval);...
13fd0 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
13fe0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62  ...}....if (outb
13ff0 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 7b  uf[0] != 0x00) {
14000 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14010 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f 67  _PRINTF("Unrecog
14020 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 63  nized padding sc
14030 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 20  heme -- passing 
14040 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
14050 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
14060 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14070 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
14080 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
14090 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
140a0 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
140b0 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
140c0 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
140d0 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74  .blocktype = out
140e0 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f  buf[1];...unpado
140f0 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77  ffset = 0;....sw
14100 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29  itch (blocktype)
14110 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a   {....case 0x00:
14120 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
14130 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69  Scheme 1, the fi
14140 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
14150 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  e is the start o
14160 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f  f data */.....fo
14170 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
14180 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
14190 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
141a0 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
141b0 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
141c0 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29  offset] != 0x00)
141d0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
141e0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
141f0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14200 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x01:...../* Pad
14210 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70  ding Scheme 2, p
14220 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46  ad bytes are 0xF
14230 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78  F followed by 0x
14240 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  00 */.....for (u
14250 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
14260 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
14270 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
14280 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
14290 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
142a0 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09  et] != 0xFF) {..
142b0 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
142c0 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
142d0 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75  0x00) {........u
142e0 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
142f0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14300 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
14310 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14320 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
14330 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75  padding data fou
14340 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  nd, returning in
14350 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64   failure, should
14360 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20   have been 0x00 
14370 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28  found 0x%02x", (
14380 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75  unsigned int) ou
14390 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
143a0 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75  ]);.........retu
143b0 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a  rn(-1);.......}.
143c0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
143d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
143e0 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
143f0 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
14400 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
14410 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
14420 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46  d have been 0xFF
14430 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
14440 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
14450 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
14460 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75  t]);........retu
14470 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09  rn(-1);......}..
14480 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
14490 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
144a0 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
144b0 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73  eme 3, pad bytes
144c0 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69   are non-zero fi
144d0 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 6f  rst zero byte fo
144e0 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 72  und is the seper
144f0 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 09  ator byte */....
14500 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
14510 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
14520 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
14530 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
14540 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
14550 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
14560 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 61  00) {.......unpa
14570 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
14580 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
14590 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
145a0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61  ...}....if (unpa
145b0 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 6c  doffset > retval
145c0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
145d0 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
145e0 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  et greater than 
145f0 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72  reply size, abor
14600 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 66  ting.  (unpadoff
14610 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 61  set = %lu, retva
14620 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  l = %lu)", (unsi
14630 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64  gned long) unpad
14640 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e 65  offset, (unsigne
14650 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b  d long) retval);
14660 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14670 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
14680 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
14690 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c  added:", outbuf,
146a0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74   retval);....ret
146b0 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73  val -= unpadoffs
146c0 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75  et;...memmove(ou
146d0 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 75  tbuf, outbuf + u
146e0 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 76  npadoffset, retv
146f0 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  al);....CACKEY_D
14700 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
14710 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  npadded:", outbu
14720 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  f, retval);..}..
14730 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14740 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14750 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
14760 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
14770 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
14780 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
14790 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  val);.}../*. * S
147a0 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
147b0 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
147c0 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
147d0 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
147e0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
147f0 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
14800 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
14810 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
14820 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74 20  ey_login(struct 
14830 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
14840 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
14850 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20   *pin, unsigned 
14860 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e  long pin_len, in
14870 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  t *tries_remaini
14880 6e 67 5f 70 29 20 7b 0a 09 73 74 72 75 63 74 20  ng_p) {..struct 
14890 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
148a0 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
148b0 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
148c0 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d   char cac_pin[8]
148d0 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20   = {0xFF, 0xFF, 
148e0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
148f0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
14900 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  FF};..unsigned l
14910 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
14920 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73  uint16_t respons
14930 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69  e_code;..int tri
14940 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
14950 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e  nt send_ret;..in
14960 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20  t key_reference 
14970 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 49 6e 64  = 0x00;.../* Ind
14980 69 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f  icate that we do
14990 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20   not know about 
149a0 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61  how many tries a
149b0 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a  re remaining */.
149c0 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
149d0 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69  ning_p) {...*tri
149e0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d  es_remaining_p =
149f0 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70   -1;..}.../* App
14a00 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e  arently, CAC PIN
14a10 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20  s are *EXACTLY* 
14a20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20  8 bytes long -- 
14a30 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66  pad with 0xFF if
14a40 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
14a50 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29  f (pin_len >= 8)
14a60 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f   {...memcpy(cac_
14a70 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d  pin, pin, 8);..}
14a80 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
14a90 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70  (cac_pin, pin, p
14aa0 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a  in_len);..}.../*
14ab0 20 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69   Reject PINs whi
14ac0 63 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74  ch are too short
14ad0 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e   */..if (pin_len
14ae0 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 5) {...CACKEY
14af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14b00 65 6a 65 63 74 69 6e 67 20 50 49 4e 20 77 68 69  ejecting PIN whi
14b10 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20  ch is too short 
14b20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d  (length = %lu, m
14b30 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35  ust be atleast 5
14b40 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09  )", pin_len);...
14b50 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
14b60 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
14b70 7d 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65  }.../* PIV authe
14b80 6e 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61  ntication uses a
14b90 20 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22   "key_reference"
14ba0 20 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73   of 0x80 */..pcs
14bb0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  c_identities = c
14bc0 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
14bd0 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75  (slot, NULL, &nu
14be0 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e  m_certs);..if (n
14bf0 75 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20  um_certs > 0 && 
14c00 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
14c10 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69  != NULL) {...swi
14c20 74 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69  tch (pcsc_identi
14c30 74 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29  ties[0].id_type)
14c40 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45   {....case CACKE
14c50 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09  Y_ID_TYPE_PIV:..
14c60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14c70 50 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20  PRINTF("We have 
14c80 50 49 56 20 63 61 72 64 2c 20 73 6f 20 77 65 20  PIV card, so we 
14c90 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  will attempt to 
14ca0 61 75 74 68 65 6e 74 69 63 61 74 65 20 75 73 69  authenticate usi
14cb0 6e 67 20 74 68 65 20 50 49 56 20 41 70 70 6c 69  ng the PIV Appli
14cc0 63 61 74 69 6f 6e 20 6b 65 79 20 72 65 66 65 72  cation key refer
14cd0 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09 6b 65 79  ence");......key
14ce0 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38  _reference = 0x8
14cf0 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  0;.....break;...
14d00 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72  .default:.....br
14d10 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  eak;...}....cack
14d20 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
14d30 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
14d40 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d  um_certs, 1);..}
14d50 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20  .../* Issue PIN 
14d60 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f  Verify */..send_
14d70 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
14d80 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
14d90 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
14da0 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45  , GSCIS_INSTR_VE
14db0 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f  RIFY, 0x00, key_
14dc0 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f  reference, sizeo
14dd0 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f  f(cac_pin), cac_
14de0 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70  pin, 0x00, &resp
14df0 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c  onse_code, NULL,
14e00 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65   NULL);...if (se
14e10 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
14e20 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
14e30 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f  if ((response_co
14e40 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20  de & 0x63C0) == 
14e50 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69  0x63C0) {....tri
14e60 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28  es_remaining = (
14e70 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
14e80 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  0xF);.....CACKEY
14e90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
14ea0 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
14eb0 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73  failed, %i tries
14ec0 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69   remaining", tri
14ed0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a  es_remaining);..
14ee0 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
14ef0 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09  aining_p) {.....
14f00 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
14f10 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69  _p = tries_remai
14f20 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  ning;....}.....r
14f30 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
14f40 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d  C_E_BADPIN);...}
14f50 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65  ....if (response
14f60 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29  _code == 0x6983)
14f70 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
14f80 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
14f90 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c  erification fail
14fa0 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f  ed, device is lo
14fb0 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75  cked");.....retu
14fc0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
14fd0 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09  _LOCKED);...}...
14fe0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
14ff0 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
15000 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
15010 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
15020 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65  rification succe
15030 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  eded");...return
15040 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
15050 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
15060 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
15070 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
15080 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15090 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
150a0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
150b0 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
150c0 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
150d0 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
150e0 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73  _token_present(s
150f0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
15100 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b  t *slot) {..cack
15110 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e  ey_ret pcsc_conn
15120 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20  ect_ret;..DWORD 
15130 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20  reader_len = 0, 
15140 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f  state = 0, proto
15150 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e  col = 0, atr_len
15160 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f  ;..BYTE atr[MAX_
15170 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47  ATR_SIZE];..LONG
15180 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61   status_ret, sca
15190 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a  rd_reconn_ret;..
151a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
151b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
151c0 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74  ...if (slot->int
151d0 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45  ernal) {...CACKE
151e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
151f0 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  Returning token 
15200 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61  present (interna
15210 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72  l token)");....r
15220 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
15230 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
15240 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
15250 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
15260 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
15270 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  lot);..if (pcsc_
15280 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
15290 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
152a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
152b0 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
152c0 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63   to connect to c
152d0 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ard, returning t
152e0 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a  oken absent");..
152f0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15300 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15310 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
15320 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
15330 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74  alling SCardStat
15340 75 73 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  us() to determin
15350 65 20 63 61 72 64 20 73 74 61 74 75 73 22 29 3b  e card status");
15360 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
15370 65 6f 66 28 61 74 72 29 3b 0a 09 73 74 61 74 75  eof(atr);..statu
15380 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61  s_ret = SCardSta
15390 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  tus(slot->pcsc_c
153a0 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64  ard, NULL, &read
153b0 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20  er_len, &state, 
153c0 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20  &protocol, atr, 
153d0 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  &atr_len);...if 
153e0 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53  (status_ret == S
153f0 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
15400 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45  ANDLE) {...CACKE
15410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15420 53 43 61 72 64 53 74 61 74 75 73 28 29 20 72 65  SCardStatus() re
15430 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49  turned SCARD_E_I
15440 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d  NVALID_HANDLE, m
15450 61 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61 6c  arking is not al
15460 72 65 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20  ready connected 
15470 61 6e 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e  and trying again
15480 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ");...cackey_mar
15490 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
154a0 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e  t);....pcsc_conn
154b0 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
154c0 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
154d0 6f 74 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  ot);...if (pcsc_
154e0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
154f0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
15500 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
15510 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
15520 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
15530 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
15540 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
15550 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
15560 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
15570 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  SENT);...}....CA
15580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15590 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64  F("Calling SCard
155a0 53 74 61 74 75 73 28 29 20 61 67 61 69 6e 22 29  Status() again")
155b0 3b 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73  ;....atr_len = s
155c0 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74  izeof(atr);...st
155d0 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64  atus_ret = SCard
155e0 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73  Status(slot->pcs
155f0 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72  c_card, NULL, &r
15600 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74  eader_len, &stat
15610 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74  e, &protocol, at
15620 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d  r, &atr_len);..}
15630 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
15640 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
15650 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79  CESS) {...cackey
15660 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
15670 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73  (slot);....if (s
15680 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
15690 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
156a0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
156b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
156c0 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
156d0 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
156e0 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
156f0 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
15700 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
15710 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
15720 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
15730 4f 4c 5f 54 31 29 3b 0a 09 09 09 69 66 20 28 73  OL_T1);....if (s
15740 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
15750 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
15760 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65 2d  SS) {...../* Re-
15770 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61  establish transa
15780 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73  ction, if it was
15790 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09   present */.....
157a0 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
157b0 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
157c0 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72   {......slot->tr
157d0 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
157e0 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  -;......slot->tr
157f0 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
15800 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09  w_lock = 1;.....
15810 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
15820 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
15830 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
15840 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15850 22 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75  "Reset successfu
15860 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b  l, requerying");
15870 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65 74 20  .....status_ret 
15880 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
15890 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e  ot->pcsc_card, N
158a0 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e  ULL, &reader_len
158b0 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f  , &state, &proto
158c0 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c  col, atr, &atr_l
158d0 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61  en);.....if (sta
158e0 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  tus_ret != SCARD
158f0 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
15900 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15910 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e  PRINTF("Still un
15920 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61  able to query ca
15930 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72  rd status, retur
15940 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
15950 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28  t.  SCardStatus(
15960 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ) = %s", CACKEY_
15970 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
15980 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75  ERR_TO_STR(statu
15990 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72  s_ret));.......r
159a0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
159b0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
159c0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
159d0 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
159e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
159f0 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74  ble to reconnect
15a00 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
15a10 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
15a20 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  .  SCardReconnec
15a30 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  t() = %s", CACKE
15a40 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
15a50 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
15a60 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b  rd_reconn_ret));
15a70 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
15a80 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
15a90 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09  ABSENT);....}...
15aa0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
15ab0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15ac0 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79  "Unable to query
15ad0 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
15ae0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
15af0 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
15b00 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
15b10 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
15b20 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
15b30 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
15b40 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15b50 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
15b60 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
15b70 28 73 74 61 74 65 20 26 20 53 43 41 52 44 5f 41  (state & SCARD_A
15b80 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f  BSENT) == SCARD_
15b90 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  ABSENT) {...CACK
15ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15bb0 22 43 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c  "Card is absent,
15bc0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
15bd0 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65   absent");....re
15be0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15bf0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
15c00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
15c10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
15c20 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65  ning token prese
15c30 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  nt.");...return(
15c40 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
15c50 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a  KENPRESENT);.}..
15c60 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
15c70 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
15c80 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
15c90 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
15ca0 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
15cb0 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
15cc0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
15cd0 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
15ce0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
15cf0 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74  tity_to_label(st
15d00 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
15d10 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
15d20 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
15d30 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75  ar *label_buf, u
15d40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62  nsigned long lab
15d50 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75  el_buf_len) {..u
15d60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
15d70 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 76  tificate_len;..v
15d80 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b  oid *label_asn1;
15d90 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63  ..void *certific
15da0 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72  ate;..int x509_r
15db0 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69  ead_ret;...certi
15dc0 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
15dd0 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
15de0 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
15df0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
15e00 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
15e10 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
15e20 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  len < 0) {...ret
15e30 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35  urn(-1);..}...x5
15e40 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
15e50 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
15e60 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
15e70 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69  ficate_len, (voi
15e80 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e  d **) &label_asn
15e90 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  1);..if (x509_re
15ea0 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
15eb0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
15ec0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
15ed0 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
15ee0 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
15ef0 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
15f00 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
15f10 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
15f20 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30   "CN");..if (x50
15f30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
15f40 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72   {...x509_read_r
15f50 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
15f60 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
15f70 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
15f80 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
15f90 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
15fa0 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69  len, NULL);....i
15fb0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
15fc0 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   <= 0) {....retu
15fd0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
15fe0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
15ff0 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
16000 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
16010 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
16020 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  ret > _POSIX_SSI
16030 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
16040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16050 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65  "x509_read_ret e
16060 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
16070 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
16080 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
16090 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61   = %li, x509_rea
160a0 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  d_ret = %lu)", (
160b0 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
160c0 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
160d0 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61  d long) x509_rea
160e0 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  d_ret);....retur
160f0 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
16100 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  if.#endif...retu
16110 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  rn(x509_read_ret
16120 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
16130 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
16140 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
16150 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
16160 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a  void **mutex) {.
16170 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
16180 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
16190 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
161a0 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
161b0 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
161c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
161d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
161e0 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
161f0 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
16200 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
16210 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
16220 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
16230 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tex = malloc(siz
16240 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74  eof(*pthread_mut
16250 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68  ex));...if (!pth
16260 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09  read_mutex) {...
16270 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16280 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
16290 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e  allocate memory.
162a0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
162b0 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65  1);...}....pthre
162c0 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
162d0 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70  ead_mutex_init(p
162e0 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55  thread_mutex, NU
162f0 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  LL);...if (pthre
16300 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
16310 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
16320 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
16330 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72  d_mutex_init() r
16340 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
16350 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
16360 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
16370 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d  n(-1);...}....*m
16380 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d  utex = pthread_m
16390 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  utex;..} else {.
163a0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
163b0 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b  s.CreateMutex) {
163c0 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
163d0 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
163e0 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65  CreateMutex(mute
163f0 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
16400 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
16410 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
16420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16430 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
16440 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  teMutex() return
16450 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
16460 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
16470 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
16480 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
16490 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
164a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
164b0 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
164c0 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
164d0 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
164e0 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
164f0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
16500 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
16510 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
16520 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
16530 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
16540 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
16550 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
16560 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
16570 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16580 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
16590 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
165a0 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
165b0 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
165c0 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
165d0 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
165e0 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
165f0 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
16600 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
16610 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74  lock(pthread_mut
16620 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  ex);...if (pthre
16630 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
16640 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
16650 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
16660 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72  d_mutex_lock() r
16670 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
16680 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
16690 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
166a0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n(-1);...}..} el
166b0 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
166c0 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
166d0 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
166e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
166f0 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  gs.LockMutex(mut
16700 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
16710 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
16720 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
16730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16740 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  "cackey_args.Loc
16750 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
16760 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
16770 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
16780 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
16790 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
167a0 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
167b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
167c0 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
167d0 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
167e0 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
167f0 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
16800 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
16810 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
16820 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
16830 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
16840 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
16850 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
16860 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
16870 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
16880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16890 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
168a0 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
168b0 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
168c0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
168d0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
168e0 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
168f0 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
16900 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
16910 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
16920 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  _unlock(pthread_
16930 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
16940 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
16950 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
16960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
16970 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
16980 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
16990 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
169a0 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
169b0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
169c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
169d0 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
169e0 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
169f0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
16a00 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
16a10 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
16a20 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
16a30 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
16a40 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16a50 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
16a60 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
16a70 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
16a80 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
16a90 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
16aa0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
16ab0 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
16ac0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16ad0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
16ae0 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
16af0 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
16b00 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54  .}..static CK_AT
16b10 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b  TRIBUTE_PTR cack
16b20 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
16b30 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  s(CK_OBJECT_CLAS
16b40 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73  S objectclass, s
16b50 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
16b60 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
16b70 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c  tity, unsigned l
16b80 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ong identity_num
16b90 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
16ba0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74  ulCount) {..stat
16bb0 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74  ic CK_BBOOL ck_t
16bc0 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63  rue = 1;..static
16bd0 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c   CK_BBOOL ck_fal
16be0 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 63 20  se = 0;..static 
16bf0 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 75 73  CK_TRUST ck_trus
16c00 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 45 44  ted = CK_TRUSTED
16c10 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 4b 5f  _DELEGATOR;..CK_
16c20 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d  ULONG numattrs =
16c30 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74   0, retval_count
16c40 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ;..CK_ATTRIBUTE_
16c50 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 5f 74  TYPE curr_attr_t
16c60 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  ype;..CK_ATTRIBU
16c70 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 2a 72  TE curr_attr, *r
16c80 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f  etval;..CK_VOID_
16c90 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f  PTR pValue;..CK_
16ca0 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e  ULONG ulValueLen
16cb0 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  ;..CK_OBJECT_CLA
16cc0 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  SS ck_object_cla
16cd0 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49 43  ss;..CK_CERTIFIC
16ce0 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 72 74  ATE_TYPE ck_cert
16cf0 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 43  ificate_type;..C
16d00 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65  K_KEY_TYPE ck_ke
16d10 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38  y_type;..CK_UTF8
16d20 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b 31 30  CHAR ucTmpBuf[10
16d30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 65 78  24];..SHA1Contex
16d40 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d 44 35  t sha1_ctx;..MD5
16d50 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a 09 75  _CTX md5_ctx;..u
16d60 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 73 68  int8_t sha1_hash
16d70 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d 3b 0a  [SHA1HashSize];.
16d80 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 61 73  .uint8_t md5_has
16d90 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d 3b 0a  h[MD5HashSize];.
16da0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
16db0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73  certificate;..ss
16dc0 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74  ize_t certificat
16dd0 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39  e_len = -1, x509
16de0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20  _read_ret;..int 
16df0 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43  pValue_free;...C
16e00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16e10 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65  TF("Called (obje
16e20 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69  ctClass = %lu, i
16e30 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c  dentity_num = %l
16e40 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
16e50 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73  long) objectclas
16e60 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29  s, identity_num)
16e70 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  ;...*pulCount = 
16e80 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63  0;...if (objectc
16e90 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
16ea0 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
16eb0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
16ec0 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65  BLIC_KEY && obje
16ed0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
16ee0 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62  RIVATE_KEY && ob
16ef0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
16f00 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
16f10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16f20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
16f30 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
16f40 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f 62  ULL), invalid ob
16f50 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a 09  ject class");...
16f60 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
16f70 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74 20  }.../* Get Cert 
16f80 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  */..if (identity
16f90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
16fa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16fb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
16fc0 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69  bjects (NULL), i
16fd0 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20 70  nvalid identiy p
16fe0 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72 65  rovided");....re
16ff0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
17000 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69  .certificate = i
17010 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
17020 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61  cate;..certifica
17030 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74  te_len = identit
17040 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  y->certificate_l
17050 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66  en;...if (certif
17060 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20  icate_len == -1 
17070 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65 20 3d  || certificate =
17080 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
17090 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
170a0 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a  "Returning 0 obj
170b0 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 69  ects (NULL), thi
170c0 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73 20  s identity does 
170d0 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35 30  not have an X.50
170e0 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73  9 certificate as
170f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 74  sociated with it
17100 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77 6f   and will not wo
17110 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  rk");....return(
17120 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56  NULL);..}.../* V
17130 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74 69  erify that certi
17140 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31 20  ficate is ASN.1 
17150 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63 65  encoded X.509 ce
17160 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66  rtificate */..if
17170 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c   (x509_to_serial
17180 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
17190 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 4e  rtificate_len, N
171a0 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43 41  ULL) < 0) {...CA
171b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
171c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
171d0 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
171e0 68 65 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  he X.509 certifi
171f0 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20  cate associated 
17200 77 69 74 68 20 74 68 69 73 20 69 64 65 6e 74 69  with this identi
17210 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 22  ty is not valid"
17220 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
17230 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 5f  L);..}...retval_
17240 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 65 74  count = 64;..ret
17250 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74  val = malloc(ret
17260 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
17270 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09  of(*retval));...
17280 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 74  for (curr_attr_t
17290 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61 74  ype = 0; curr_at
172a0 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35 33  tr_type < 0xce53
172b0 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74 72 5f  63bf; curr_attr_
172c0 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20 28  type++) {...if (
172d0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
172e0 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63 75  = 0x800) {....cu
172f0 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30  rr_attr_type = 0
17300 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a 0a  xce536300;...}..
17310 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d 20  ..pValue_free = 
17320 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  0;...pValue = NU
17330 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
17340 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
17350 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72  ....switch (curr
17360 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09 09  _attr_type) {...
17370 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a  .case CKA_CLASS:
17380 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17390 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
173a0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
173b0 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38 6c  KA_CLASS (0x%08l
173c0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
173d0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
173e0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 63  tr_type);......c
173f0 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20 3d  k_object_class =
17400 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a 09   objectclass;...
17410 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
17420 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 09  object_class;...
17430 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
17440 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74 5f  izeof(ck_object_
17450 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41 43  class);......CAC
17460 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17470 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17480 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
17490 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
174a0 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  *((CK_OBJECT_CLA
174b0 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  SS *) pValue), p
174c0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
174d0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
174e0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
174f0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45  ...case CKA_TOKE
17500 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
17510 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
17520 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
17530 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25 30   CKA_TOKEN (0x%0
17540 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
17550 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
17560 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
17570 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
17580 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
17590 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
175a0 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
175b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
175c0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
175d0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
175e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
175f0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
17600 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
17610 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
17620 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
17630 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
17640 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 09  KA_PRIVATE:.....
17650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17660 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
17670 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 52  attribute CKA_PR
17680 49 56 41 54 45 20 28 30 78 25 30 38 6c 78 29 20  IVATE (0x%08lx) 
17690 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
176a0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
176b0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
176c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
176d0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
176e0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
176f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17700 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
17710 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
17720 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73  e are not a Nets
17730 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
17740 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
17750 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61  ;.....}......pVa
17760 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
17770 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17780 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
17790 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
177a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
177b0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
177c0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
177d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
177e0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
177f0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
17800 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
17810 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
17820 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
17830 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09 43 41  _TRUSTED:.....CA
17840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17850 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
17860 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
17870 54 45 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  TED (0x%08lx) ..
17880 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
17890 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
178a0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
178b0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
178c0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
178d0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
178e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
178f0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
17900 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
17910 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
17920 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
17930 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
17940 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  }......pValue = 
17950 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c  &ck_true;.....ul
17960 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
17970 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09  f(ck_true);.....
17980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17990 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
179a0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
179b0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
179c0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
179d0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
179e0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
179f0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
17a00 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17a10 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  case CKA_MODIFIA
17a20 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BLE:.....CACKEY_
17a30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17a40 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17a50 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  te CKA_MODIFIABL
17a60 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
17a70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17a80 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
17a90 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
17aa0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
17ab0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
17ac0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a  eof(ck_false);..
17ad0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17ae0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
17af0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
17b00 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
17b10 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
17b20 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
17b30 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17b40 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17b50 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17b60 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45  ...case CKA_LABE
17b70 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  L:.....CACKEY_DE
17b80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
17b90 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
17ba0 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25 30   CKA_LABEL (0x%0
17bb0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
17bc0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
17bd0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
17be0 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 69  .if (identity->i
17bf0 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59  d_type == CACKEY
17c00 5f 49 44 5f 54 59 50 45 5f 50 49 56 29 20 7b 0a  _ID_TYPE_PIV) {.
17c10 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64  .....pValue = id
17c20 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76  entity->card.piv
17c30 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75 6c 56  .label;......ulV
17c40 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  alueLen = strlen
17c50 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 20  (pValue);.....} 
17c60 65 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c 56 61  else {......ulVa
17c70 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e 74  lueLen = snprint
17c80 66 28 28 63 68 61 72 20 2a 29 20 75 63 54 6d 70  f((char *) ucTmp
17c90 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d  Buf, sizeof(ucTm
17ca0 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74 79  pBuf), "Identity
17cb0 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65   #%lu", (unsigne
17cc0 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
17cd0 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56 61 6c  _num);......pVal
17ce0 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a  ue = ucTmpBuf;..
17cf0 09 09 09 09 09 69 66 20 28 75 6c 56 61 6c 75 65  .....if (ulValue
17d00 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 75 63  Len >= sizeof(uc
17d10 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09 09 09  TmpBuf)) {......
17d20 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 30 3b  .ulValueLen = 0;
17d30 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
17d40 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09 09  NULL;......}....
17d50 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
17d60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17d70 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
17d80 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
17d90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17da0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17db0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17dc0 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43  CKA_VALUE:.....C
17dd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17de0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17df0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c  ttribute CKA_VAL
17e00 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  UE (0x%08lx) ...
17e10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
17e20 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
17e30 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20  e);......switch 
17e40 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a  (objectclass) {.
17e50 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52  .....case CKO_PR
17e60 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09  IVATE_KEY:......
17e70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17e80 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17e90 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17ea0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70  cause we are a p
17eb0 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a  rivate key.");..
17ec0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17ed0 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43  ..case CKO_NETSC
17ee0 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 09 09  APE_TRUST:......
17ef0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17f00 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17f10 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17f20 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
17f30 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
17f40 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 09 62  ject");........b
17f50 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
17f60 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a  CKO_PUBLIC_KEY:.
17f70 09 09 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
17f80 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
17f90 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f 72 65  {........x509_re
17fa0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
17fb0 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66 69 63  _pubkey(certific
17fc0 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
17fd0 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
17fe0 09 09 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  .......if (x509_
17ff0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 20  read_ret < 0) { 
18000 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75 65 20  .........pValue 
18010 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d  = NULL;........}
18020 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09   else {.........
18030 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
18040 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
18050 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09  ...}.......}....
18060 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
18070 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49  case CKO_CERTIFI
18080 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c  CATE:.......pVal
18090 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  ue = certificate
180a0 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  ;.......ulValueL
180b0 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  en = certificate
180c0 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65  _len;........bre
180d0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ak;.....}......C
180e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
180f0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
18100 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
18110 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18120 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18130 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18140 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a  case CKA_ISSUER:
18150 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18160 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18170 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18180 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38  KA_ISSUER (0x%08
18190 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
181a0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
181b0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
181c0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
181d0 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
181e0 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
181f0 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
18200 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
18210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18220 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
18230 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
18240 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
18250 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72  a certificate or
18260 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
18270 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
18280 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
18290 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
182a0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
182b0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
182c0 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65   = x509_to_issue
182d0 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  r(certificate, c
182e0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
182f0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
18300 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
18310 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
18320 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
18330 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
18340 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
18350 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
18360 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
18370 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18380 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
18390 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
183a0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
183b0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
183c0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
183d0 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
183e0 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b  NUMBER:.....CACK
183f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18400 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
18410 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c  ibute CKA_SERIAL
18420 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78  _NUMBER (0x%08lx
18430 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
18440 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
18450 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
18460 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
18470 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
18480 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
18490 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
184a0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
184b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
184c0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
184d0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
184e0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
184f0 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e  certificate or N
18500 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
18510 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
18520 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
18530 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
18540 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
18550 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
18560 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28   x509_to_serial(
18570 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
18580 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
18590 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
185a0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
185b0 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
185c0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
185d0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
185e0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
185f0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
18600 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
18610 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18620 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
18630 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
18640 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18650 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18660 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18670 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  case CKA_SUBJECT
18680 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18690 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
186a0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
186b0 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25  CKA_SUBJECT (0x%
186c0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
186d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
186e0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
186f0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
18700 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
18710 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
18720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18730 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18740 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18750 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
18760 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a 0a 09  ertificate");...
18770 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
18780 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
18790 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
187a0 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
187b0 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73  _ret = x509_to_s
187c0 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61  ubject(certifica
187d0 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
187e0 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
187f0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
18800 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
18810 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
18820 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
18830 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
18840 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
18850 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
18860 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18870 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
18880 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
18890 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
188a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
188b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
188c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44  ;....case CKA_ID
188d0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
188e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
188f0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
18900 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78 29  CKA_ID (0x%08lx)
18910 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18920 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
18930 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
18940 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
18950 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
18960 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
18970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18980 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
18990 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
189a0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
189b0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
189c0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
189d0 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42  ...}......ucTmpB
189e0 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69  uf[0] = ((identi
189f0 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38  ty_num + 1) >> 8
18a00 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63  ) & 0xff;.....uc
18a10 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64  TmpBuf[1] =  (id
18a20 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20  entity_num + 1) 
18a30 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61  & 0xff;......pVa
18a40 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b  lue = &ucTmpBuf;
18a50 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18a60 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  = 2;......CACKEY
18a70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18a80 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
18a90 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
18aa0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
18ab0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
18ac0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
18ad0 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
18ae0 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
18af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18b00 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18b10 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43  ute CKA_CERTIFIC
18b20 41 54 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c  ATE_TYPE (0x%08l
18b30 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
18b40 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
18b50 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
18b60 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
18b70 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
18b80 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
18b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18ba0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18bb0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18bc0 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
18bd0 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09  ificate.");.....
18be0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18bf0 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73  ..../* We only s
18c00 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69  upport one certi
18c10 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09  ficate type */..
18c20 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74  ...ck_certificat
18c30 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35  e_type = CKC_X_5
18c40 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  09;......pValue 
18c50 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74  = &ck_certificat
18c60 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  e_type;.....ulVa
18c70 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18c80 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
18c90 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ype);......CACKE
18ca0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18cb0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43   ... returning C
18cc0 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28  KC_X_509 (%lu) (
18cd0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
18ce0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
18cf0 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
18d00 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
18d10 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
18d20 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
18d30 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
18d40 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59  .case CKA_KEY_TY
18d50 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PE:.....CACKEY_D
18d60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18d70 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18d80 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28  e CKA_KEY_TYPE (
18d90 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
18da0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
18db0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
18dc0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
18dd0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56  lass != CKO_PRIV
18de0 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63  ATE_KEY && objec
18df0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
18e00 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09  BLIC_KEY) {.....
18e10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18e20 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
18e30 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
18e40 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
18e50 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09   a key.");......
18e60 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
18e70 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75  .../* We only su
18e80 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79  pport one key ty
18e90 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79  pe */.....ck_key
18ea0 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b  _type = CKK_RSA;
18eb0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
18ec0 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09  ck_key_type;....
18ed0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
18ee0 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65  zeof(ck_key_type
18ef0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
18f00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18f10 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f  . returning CKK_
18f20 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  RSA (%lu) (%p/%l
18f30 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
18f40 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
18f50 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
18f60 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
18f70 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18f80 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18f90 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18fa0 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43   CKA_SIGN:.....C
18fb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18fc0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
18fd0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47  ttribute CKA_SIG
18fe0 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  N (0x%08lx) ..."
18ff0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19000 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
19010 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
19020 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
19030 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
19040 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19050 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19060 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
19070 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
19080 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
19090 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
190a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
190b0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
190c0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
190d0 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
190e0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
190f0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
19100 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
19110 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
19120 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
19130 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
19140 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
19150 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
19160 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
19170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19180 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
19190 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
191a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
191b0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
191c0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
191d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
191e0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
191f0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
19200 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a  KA_SIGN_RECOVER:
19210 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19220 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
19230 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
19240 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20  KA_SIGN_RECOVER 
19250 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
19260 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19270 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
19280 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19290 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
192a0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
192b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
192c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
192d0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
192e0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
192f0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
19300 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
19310 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
19320 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74  .../* We current
19330 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ly only support 
19340 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e  "Sign with Appen
19350 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c  dix" */.....pVal
19360 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
19370 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
19380 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
19390 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
193a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
193b0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
193c0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
193d0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
193e0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
193f0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
19400 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19410 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19420 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19430 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43  DECRYPT:.....CAC
19440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19450 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
19460 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59  ribute CKA_DECRY
19470 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PT (0x%08lx) ...
19480 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19490 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
194a0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
194b0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
194c0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
194d0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
194e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
194f0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19500 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19510 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
19520 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
19530 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
19540 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19550 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
19560 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65  VATE_KEY || obje
19570 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
19580 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09  UBLIC_KEY) {....
19590 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
195a0 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
195b0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
195c0 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
195d0 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
195e0 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
195f0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19600 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
19610 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
19620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19630 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
19640 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
19650 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19660 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
19670 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
19680 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19690 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
196a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
196b0 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
196c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
196d0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
196e0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
196f0 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78 25  A_SENSITIVE (0x%
19700 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19710 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19720 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
19730 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
19740 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
19750 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
19760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19770 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19780 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19790 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
197a0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
197b0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
197c0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
197d0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
197e0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
197f0 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
19800 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
19810 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
19820 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
19830 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
19840 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
19850 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
19860 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
19870 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
19880 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19890 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
198a0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
198b0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
198c0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
198d0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
198e0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
198f0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
19900 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
19910 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54  ....case CKA_EXT
19920 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 43 41  RACTABLE:.....CA
19930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19940 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
19950 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58 54 52  tribute CKA_EXTR
19960 41 43 54 41 42 4c 45 20 28 30 78 25 30 38 6c 78  ACTABLE (0x%08lx
19970 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19980 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19990 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
199a0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
199b0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
199c0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
199d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
199e0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
199f0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
19a00 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
19a10 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
19a20 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
19a30 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
19a40 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
19a50 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
19a60 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
19a70 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
19a80 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
19a90 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
19aa0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
19ab0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
19ac0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
19ad0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
19ae0 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
19af0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19b00 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
19b10 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
19b20 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
19b30 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
19b40 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
19b50 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
19b60 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
19b70 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19b80 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
19b90 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19ba0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19bb0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19bc0 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25  CKA_MODULUS (0x%
19bd0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19be0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19bf0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
19c00 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
19c10 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
19c20 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
19c30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19c40 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19c50 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19c60 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
19c70 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
19c80 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
19c90 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
19ca0 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
19cb0 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
19cc0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
19cd0 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28  x509_to_modulus(
19ce0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
19cf0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
19d00 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
19d10 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
19d20 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
19d30 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
19d40 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
19d50 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
19d60 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
19d70 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
19d80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19d90 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
19da0 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
19db0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
19dc0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
19dd0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19de0 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f  case CKA_PUBLIC_
19df0 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41  EXPONENT:.....CA
19e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19e10 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
19e20 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c  tribute CKA_PUBL
19e30 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25  IC_EXPONENT (0x%
19e40 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19e50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19e60 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
19e70 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
19e80 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
19e90 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
19ea0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19eb0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19ec0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19ed0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
19ee0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
19ef0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
19f00 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
19f10 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
19f20 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
19f30 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
19f40 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74  x509_to_exponent
19f50 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
19f60 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
19f70 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
19f80 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
19f90 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
19fa0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
19fb0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
19fc0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
19fd0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
19fe0 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
19ff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a000 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1a010 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
1a020 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1a030 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1a040 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1a050 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
1a060 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52  DIGITAL_SIGNATUR
1a070 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  E:....case CKA_T
1a080 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41  RUST_NON_REPUDIA
1a090 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  TION:....case CK
1a0a0 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49  A_TRUST_KEY_ENCI
1a0b0 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73  PHERMENT:....cas
1a0c0 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 54 41  e CKA_TRUST_DATA
1a0d0 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09  _ENCIPHERMENT:..
1a0e0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1a0f0 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a  _KEY_AGREEMENT:.
1a100 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1a110 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a  T_KEY_CERT_SIGN:
1a120 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1a130 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09  ST_CRL_SIGN:....
1a140 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53  case CKA_TRUST_S
1a150 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 63  ERVER_AUTH:....c
1a160 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c  ase CKA_TRUST_CL
1a170 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63 61  IENT_AUTH:....ca
1a180 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  se CKA_TRUST_COD
1a190 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61  E_SIGNING:....ca
1a1a0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41  se CKA_TRUST_EMA
1a1b0 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09  IL_PROTECTION:..
1a1c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a1d0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1a1e0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1a1f0 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30  _TRUST_... (0x%0
1a200 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1a210 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1a220 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1a230 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
1a240 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c  usted;.....ulVal
1a250 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1a260 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 09 09  k_trusted);.....
1a270 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a280 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1a290 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
1a2a0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1a2b0 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 54 20  ng) *((CK_TRUST 
1a2c0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1a2d0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1a2e0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1a2f0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1a300 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 53 48  case CKA_CERT_SH
1a310 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43  A1_HASH:.....CAC
1a320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a330 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1a340 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f  ribute CKA_CERT_
1a350 53 48 41 31 5f 48 41 53 48 20 28 30 78 25 30 38  SHA1_HASH (0x%08
1a360 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1a370 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1a380 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1a390 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1a3a0 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
1a3b0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1a3c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a3d0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1a3e0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1a3f0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
1a400 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1a410 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1a420 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1a430 09 53 48 41 31 52 65 73 65 74 28 26 73 68 61 31  .SHA1Reset(&sha1
1a440 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41 31 49  _ctx);.....SHA1I
1a450 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78 2c 20  nput(&sha1_ctx, 
1a460 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
1a470 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
1a480 09 09 09 53 48 41 31 52 65 73 75 6c 74 28 26 73  ...SHA1Result(&s
1a490 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f 68 61  ha1_ctx, sha1_ha
1a4a0 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  sh);......pValue
1a4b0 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a 09 09   = sha1_hash;...
1a4c0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1a4d0 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 68 29  izeof(sha1_hash)
1a4e0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1a4f0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a500 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
1a510 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
1a520 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a530 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a540 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a550 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a  _CERT_MD5_HASH:.
1a560 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a570 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1a580 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1a590 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 20  A_CERT_MD5_HASH 
1a5a0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1a5b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a5c0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1a5d0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1a5e0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
1a5f0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1a600 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a610 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1a620 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1a630 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1a640 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74  not a Netscape t
1a650 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1a660 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1a670 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 28 26  }......MD5Init(&
1a680 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44  md5_ctx);.....MD
1a690 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63 74 78  5Update(&md5_ctx
1a6a0 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  , certificate, c
1a6b0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1a6c0 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64  .....MD5Final(md
1a6d0 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 74 78  5_hash, &md5_ctx
1a6e0 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
1a6f0 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 09 75   md5_hash;.....u
1a700 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1a710 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09  of(md5_hash);...
1a720 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a730 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1a740 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1a750 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a760 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a770 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a780 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
1a790 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
1a7a0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a7b0 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09   (CK_LONG) -1;..
1a7c0 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
1a7d0 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20  .if (((CK_LONG) 
1a7e0 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28  ulValueLen) != (
1a7f0 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b  (CK_LONG) -1)) {
1a800 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72  ..../* Push curr
1a810 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73  _attr onto the s
1a820 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f  tack */....curr_
1a830 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72  attr.type = curr
1a840 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63  _attr_type;....c
1a850 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
1a860 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
1a870 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  ;.....curr_attr.
1a880 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
1a890 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
1a8a0 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79  eLen);....memcpy
1a8b0 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  (curr_attr.pValu
1a8c0 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  e, pValue, curr_
1a8d0 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
1a8e0 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65  ;.....if (pValue
1a8f0 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29  _free && pValue)
1a900 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c   {.....free(pVal
1a910 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ue);....}.....if
1a920 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65   (numattrs >= re
1a930 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  tval_count) {...
1a940 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
1a950 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61  oc(retval, retva
1a960 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
1a970 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d  (*retval));....}
1a980 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74  .....memcpy(&ret
1a990 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26  val[numattrs], &
1a9a0 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f  curr_attr, sizeo
1a9b0 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09  f(curr_attr));..
1a9c0 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09  ..numattrs++;...
1a9d0 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74  }..}...if (numat
1a9e0 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65  trs != 0) {...re
1a9f0 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d  tval_count = num
1aa00 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20  attrs;...retval 
1aa10 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
1aa20 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
1aa30 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
1aa40 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66  );..} else {...f
1aa50 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ree(retval);....
1aa60 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  retval = NULL;..
1aa70 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  }...*pulCount = 
1aa80 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b  numattrs;...CACK
1aa90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1aaa0 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f  "Returning %lu o
1aab0 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e  bjects (%p).", n
1aac0 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 20 2a  umattrs, (void *
1aad0 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
1aae0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1aaf0 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
1ab00 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
1ab10 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
1ab20 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
1ab30 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20  ities, unsigned 
1ab40 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
1ab50 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54  count) {..CK_ATT
1ab60 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
1ab70 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  r;..unsigned lon
1ab80 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69  g id_idx, attr_i
1ab90 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  dx;...if (identi
1aba0 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  ties == NULL || 
1abb0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
1abc0 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   == 0) {...retur
1abd0 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f  n;..}...for (id_
1abe0 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20  idx = 0; id_idx 
1abf0 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  < identities_cou
1ac00 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a  nt; id_idx++) {.
1ac10 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1ac20 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1ac30 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61  tes) {....for (a
1ac40 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
1ac50 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69  r_idx < identiti
1ac60 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1ac70 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74  butes_count; att
1ac80 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63  r_idx++) {.....c
1ac90 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e  urr_attr = &iden
1aca0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1acb0 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69  ttributes[attr_i
1acc0 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75  dx];......if (cu
1acd0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
1ace0 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
1acf0 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b  r_attr->pValue);
1ad00 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
1ad10 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
1ad20 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1ad30 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64  s) {.....free(id
1ad40 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1ad50 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09  .attributes);...
1ad60 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
1ad70 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74  ee_certs(identit
1ad80 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1ad90 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29  _identity, 1, 1)
1ada0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28  ;...}..}...free(
1adb0 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a  identities);.}..
1adc0 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
1add0 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 61 64  long cackey_read
1ade0 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
1adf0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
1ae00 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69  entity *identiti
1ae10 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  es, unsigned lon
1ae20 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  g num_dod_certs)
1ae30 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
1ae40 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64 5f 69  g cert_idx, id_i
1ae50 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64  dx = 0;...if (id
1ae60 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
1ae70 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d  ) {...return(num
1ae80 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 29 3b  _dod_certs * 3);
1ae90 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f  ..}...for (cert_
1aea0 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64  idx = 0; cert_id
1aeb0 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  x < num_dod_cert
1aec0 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
1aed0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1aee0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1aef0 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64  ity = NULL;...id
1af00 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1af10 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
1af20 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
1af30 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43  tes(CKO_CERTIFIC
1af40 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74  ATE, &extra_cert
1af50 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66  s[cert_idx], 0xf
1af60 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20  000 | cert_idx, 
1af70 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
1af80 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
1af90 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b  ount);...id_idx+
1afa0 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73  +;....identities
1afb0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1afc0 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
1afd0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1afe0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
1aff0 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
1b000 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49  ibutes(CKO_PUBLI
1b010 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65  C_KEY, &extra_ce
1b020 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
1b030 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
1b040 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1b050 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1b060 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
1b070 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69  x++;....identiti
1b080 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1b090 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
1b0a0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1b0b0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1b0c0 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
1b0d0 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54  tributes(CKO_NET
1b0e0 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78  SCAPE_TRUST, &ex
1b0f0 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69  tra_certs[cert_i
1b100 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65  dx], 0xf000 | ce
1b110 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
1b120 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1b130 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  ibutes_count);..
1b140 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09  .id_idx++;..}...
1b150 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a  return(id_idx);.
1b160 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
1b170 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1b180 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64   *cackey_read_id
1b190 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20  entities(struct 
1b1a0 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
1b1b0 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  t, unsigned long
1b1c0 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09   *ids_found) {..
1b1d0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
1b1e0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
1b1f0 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73  c_identities;..s
1b200 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1b210 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
1b220 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
1b230 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64  g num_ids, id_id
1b240 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b  x, curr_id_type;
1b250 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
1b260 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64  num_certs, num_d
1b270 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69  od_certs, cert_i
1b280 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65  dx;..int include
1b290 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30  _extra_certs = 0
1b2a0 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  , include_dod_ce
1b2b0 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  rts;...CACKEY_DE
1b2c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1b2d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73  ed.");...if (ids
1b2e0 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20  _found == NULL) 
1b2f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b300 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b310 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55   ids_found is NU
1b320 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
1b330 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64 65  NULL);..}..#ifde
1b340 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f 53 4c  f CACKEY_CARD_SL
1b350 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41  OT_INCLUDE_EXTRA
1b360 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 65 5f  _CERTS..include_
1b370 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b  extra_certs = 1;
1b380 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65  .#endif...if (ge
1b390 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 4f 44  tenv("CACKEY_DOD
1b3a0 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f  _CERTS_ON_HW_SLO
1b3b0 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1b3c0 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
1b3d0 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09  certs = 1;..}...
1b3e0 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1b3f0 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 53 5f  EY_NO_DOD_CERTS_
1b400 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d  ON_HW_SLOTS") !=
1b410 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1b420 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1b430 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43   0;..}..#ifdef C
1b440 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1b450 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76  ERTS..if (getenv
1b460 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43  ("CACKEY_EXTRA_C
1b470 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1b480 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1b490 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c  certs = 1;..} el
1b4a0 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  se {...include_d
1b4b0 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1b4c0 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65  .#else..if (gete
1b4d0 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  nv("CACKEY_NO_EX
1b4e0 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1b4f0 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1b500 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1b510 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c  .} else {...incl
1b520 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1b530 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69  1;..}.#endif...i
1b540 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  f (include_dod_c
1b550 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f  erts) {...num_do
1b560 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 6f 66  d_certs = sizeof
1b570 28 65 78 74 72 61 5f 63 65 72 74 73 29 20 2f 20  (extra_certs) / 
1b580 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72  sizeof(extra_cer
1b590 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73 65 20  ts[0]);..} else 
1b5a0 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  {...num_dod_cert
1b5b0 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 0;..}...if (
1b5c0 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20  slot->internal) 
1b5d0 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  {...num_ids = ca
1b5e0 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64  ckey_read_dod_id
1b5f0 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e  entities(NULL, n
1b600 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 0a  um_dod_certs);..
1b610 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 21 3d  ..if (num_ids !=
1b620 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 69 74   0) {....identit
1b630 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d  ies = malloc(num
1b640 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69  _ids * sizeof(*i
1b650 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09  dentities));....
1b660 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64  .cackey_read_dod
1b670 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e  _identities(iden
1b680 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f  tities, num_dod_
1b690 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73 65  certs);...} else
1b6a0 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73   {....identities
1b6b0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
1b6c0 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d  *ids_found = num
1b6d0 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _ids;....return(
1b6e0 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a  identities);..}.
1b6f0 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
1b700 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
1b710 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c  certs(slot, NULL
1b720 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
1b730 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
1b740 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
1b750 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62  ./* Convert numb
1b760 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e  er of Certs to n
1b770 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
1b780 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20   */...num_ids = 
1b790 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59  (CKO_PRIVATE_KEY
1b7a0 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   - CKO_CERTIFICA
1b7b0 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65  TE + 1) * num_ce
1b7c0 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63 6c  rts;....if (incl
1b7d0 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29  ude_extra_certs)
1b7e0 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b 3d   {....num_ids +=
1b7f0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1b800 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c  _identities(NULL
1b810 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1b820 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69 74  ;...}....identit
1b830 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d  ies = malloc(num
1b840 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69  _ids * sizeof(*i
1b850 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09  dentities));....
1b860 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 63 61  /* Add certifica
1b870 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79 73  tes, public keys
1b880 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b 65  , and private ke
1b890 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61 72  ys from the smar
1b8a0 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64  tcard */...id_id
1b8b0 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65  x = 0;...for (ce
1b8c0 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74  rt_idx = 0; cert
1b8d0 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73  _idx < num_certs
1b8e0 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
1b8f0 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ...for (curr_id_
1b900 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49  type = CKO_CERTI
1b910 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f  FICATE; curr_id_
1b920 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56  type <= CKO_PRIV
1b930 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64  ATE_KEY; curr_id
1b940 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69  _type++) {.....i
1b950 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1b960 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1b970 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1b980 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70  utes(curr_id_typ
1b990 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74  e, &pcsc_identit
1b9a0 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63  ies[cert_idx], c
1b9b0 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
1b9c0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1b9d0 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
1b9e0 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
1b9f0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1ba00 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
1ba10 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
1ba20 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1ba30 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d  dentity));.....m
1ba40 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
1ba50 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1ba60 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64  entity, &pcsc_id
1ba70 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1ba80 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e  x], sizeof(*iden
1ba90 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1baa0 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a  csc_identity));.
1bab0 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
1bac0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1bad0 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
1bae0 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  te = malloc(pcsc
1baf0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1bb00 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
1bb10 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63  e_len);.....memc
1bb20 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  py(identities[id
1bb30 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1bb40 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
1bb50 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  , pcsc_identitie
1bb60 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
1bb70 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
1bb80 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1bb90 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
1bba0 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78  en);......id_idx
1bbb0 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ++;....}...}....
1bbc0 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72  if (include_extr
1bbd0 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43 41  a_certs) {....CA
1bbe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bbf0 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 53 20  F("Including US 
1bc00 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69  Government Certi
1bc10 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64 77  ficates on hardw
1bc20 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09  are slot");.....
1bc30 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1bc40 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74  identities(ident
1bc50 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c 20  ities + id_idx, 
1bc60 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
1bc70 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
1bc80 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
1bc90 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
1bca0 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73  rts, 1);....*ids
1bcb0 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
1bcc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
1bcd0 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a  tities);..}....*
1bce0 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09  ids_found = 0;..
1bcf0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a  return(NULL);.}.
1bd00 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1bd10 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
1bd20 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  tialize)(CK_VOID
1bd30 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 20  _PTR pInitArgs) 
1bd40 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  {..CK_C_INITIALI
1bd50 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61  ZE_ARGS CK_PTR a
1bd60 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69  rgs;..uint32_t i
1bd70 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74  dx, highest_slot
1bd80 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69  ;..int mutex_ini
1bd90 74 5f 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c  t_ret;..int incl
1bda0 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a  ude_dod_certs;..
1bdb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bdc0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1bdd0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e  ...if (cackey_in
1bde0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1bdf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1be00 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65  TF("Error.  Alre
1be10 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  ady initialized.
1be20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1be30 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41  R_CRYPTOKI_ALREA
1be40 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  DY_INITIALIZED);
1be50 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41  ..}...if (pInitA
1be60 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rgs != NULL) {..
1be70 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67  .args = pInitArg
1be80 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63  s;...memcpy(&cac
1be90 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20  key_args, args, 
1bea0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72  sizeof(cackey_ar
1beb0 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67  gs));....if (arg
1bec0 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d  s->CreateMutex =
1bed0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1bee0 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20  DestroyMutex == 
1bef0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f  NULL || args->Lo
1bf00 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  ckMutex == NULL 
1bf10 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d  || args->UnlockM
1bf20 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  utex == NULL) {.
1bf30 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
1bf40 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ateMutex != NULL
1bf50 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
1bf60 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  yMutex != NULL |
1bf70 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
1bf80 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1bf90 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21  s->UnlockMutex !
1bfa0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
1bfb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bfc0 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20  F("Error. Some, 
1bfd0 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65  but not All thre
1bfe0 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  ading primitives
1bff0 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09   provided.");...
1c000 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1c010 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
1c020 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  .}...}..} else {
1c030 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  ...cackey_args.C
1c040 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c  reateMutex = NUL
1c050 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1c060 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20  .DestroyMutex = 
1c070 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1c080 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20  rgs.LockMutex = 
1c090 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1c0a0 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  rgs.UnlockMutex 
1c0b0 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1c0c0 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b  _args.flags = 0;
1c0d0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1c0e0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
1c0f0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c100 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1c120 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63  ; idx++) {...cac
1c130 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1c140 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  ].active = 0;..}
1c150 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1c160 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1c170 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1c180 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1c190 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
1c1a0 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  {...cackey_slots
1c1b0 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30  [idx].active = 0
1c1c0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1c1d0 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
1c1e0 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  r = NULL;...cack
1c1f0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
1c200 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
1c210 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1c220 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
1c230 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
1c240 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  k = 0;...cackey_
1c250 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f  slots[idx].slot_
1c260 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63  reset = 0;...cac
1c270 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
1c280 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
1c290 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1c2a0 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  dx].label = NULL
1c2b0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1c2c0 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  [idx].internal =
1c2d0 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43   0;..}..#ifdef C
1c2e0 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1c2f0 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76  ERTS..if (getenv
1c300 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43  ("CACKEY_EXTRA_C
1c310 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1c320 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1c330 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c  certs = 1;..} el
1c340 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  se {...include_d
1c350 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1c360 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65  .#else..if (gete
1c370 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  nv("CACKEY_NO_EX
1c380 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1c390 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1c3a0 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1c3b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c  .} else {...incl
1c3c0 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1c3d0 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69  1;..}.#endif...i
1c3e0 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  f (include_dod_c
1c3f0 65 72 74 73 20 3d 3d 20 30 29 20 7b 0a 09 09 43  erts == 0) {...C
1c400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c410 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f  TF("Asked not to
1c420 20 69 6e 63 6c 75 64 65 20 44 6f 44 20 63 65 72   include DoD cer
1c430 74 69 66 69 63 61 74 65 73 22 29 3b 0a 09 7d 20  tificates");..} 
1c440 65 6c 73 65 20 7b 0a 09 09 68 69 67 68 65 73 74  else {...highest
1c450 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28  _slot = (sizeof(
1c460 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1c470 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1c480 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09  ots[0])) - 1;...
1c490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c4a0 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20  INTF("Including 
1c4b0 44 6f 44 20 63 65 72 74 73 20 69 6e 20 73 6c 6f  DoD certs in slo
1c4c0 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  t %lu", (unsigne
1c4d0 64 20 6c 6f 6e 67 29 20 68 69 67 68 65 73 74 5f  d long) highest_
1c4e0 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79  slot);....cackey
1c4f0 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1c500 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b  lot].active = 1;
1c510 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1c520 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e  highest_slot].in
1c530 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61  ternal = 1;...ca
1c540 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1c550 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  st_slot].label =
1c560 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1c570 2a 29 20 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e  *) "US Governmen
1c580 74 20 43 65 72 74 69 66 69 63 61 74 65 73 22 3b  t Certificates";
1c590 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1c5a0 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63  highest_slot].pc
1c5b0 73 63 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43  sc_reader = "CAC
1c5c0 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73  Key";...cackey_s
1c5d0 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1c5e0 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t].token_flags =
1c5f0 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f   0;..}...cackey_
1c600 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
1c610 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62  ...if (!cackey_b
1c620 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09  iglock_init) {..
1c630 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  .mutex_init_ret 
1c640 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63  = cackey_mutex_c
1c650 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69  reate(&cackey_bi
1c660 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d  glock);....if (m
1c670 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d  utex_init_ret !=
1c680 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
1c690 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c6a0 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74  ror.  Mutex init
1c6b0 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65  ialization faile
1c6c0 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
1c6d0 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b  (CKR_CANT_LOCK);
1c6e0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62  ...}....cackey_b
1c6f0 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b  iglock_init = 1;
1c700 0a 09 7d 0a 0a 09 2f 2a 20 44 65 66 69 6e 65 20  ..}.../* Define 
1c710 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f  a command to pro
1c720 6d 70 74 20 75 73 65 72 20 66 6f 72 20 61 20 50  mpt user for a P
1c730 49 4e 20 2a 2f 0a 23 69 66 64 65 66 20 43 41 43  IN */.#ifdef CAC
1c740 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1c750 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f  DEFAULT..cackey_
1c760 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 43 41  pin_command = CA
1c770 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1c780 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41  _DEFAULT_XSTR(CA
1c790 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1c7a0 5f 44 45 46 41 55 4c 54 29 3b 0a 23 65 6e 64 69  _DEFAULT);.#endi
1c7b0 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  f..#ifdef CACKEY
1c7c0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1c7d0 4c 59 5f 44 45 46 41 55 4c 54 0a 09 69 66 20 28  LY_DEFAULT..if (
1c7e0 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22  getenv("DISPLAY"
1c7f0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1c800 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1c810 64 20 3d 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43  d = CACKEY_PIN_C
1c820 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 5f 58  OMMAND_DEFAULT_X
1c830 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43  STR(CACKEY_PIN_C
1c840 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46  OMMAND_XONLY_DEF
1c850 41 55 4c 54 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  AULT);..}.#endif
1c860 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1c870 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1c880 44 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  D") != NULL) {..
1c890 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  .cackey_pin_comm
1c8a0 61 6e 64 20 3d 20 67 65 74 65 6e 76 28 22 43 41  and = getenv("CA
1c8b0 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1c8c0 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74  ");..}...if (get
1c8d0 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f  env("CACKEY_PIN_
1c8e0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 20  COMMAND_XONLY") 
1c8f0 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65 74 65 6e  != NULL && geten
1c900 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20  v("DISPLAY") != 
1c910 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1c920 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 67  _pin_command = g
1c930 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1c940 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22  N_COMMAND_XONLY"
1c950 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1c960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c970 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1c980 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1c990 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1c9a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1c9b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
1c9c0 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  inalize)(CK_VOID
1c9d0 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
1c9e0 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
1c9f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ca00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1ca10 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
1ca20 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
1ca30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ca40 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
1ca50 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
1ca60 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1ca70 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1ca80 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1ca90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1caa0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1cab0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cac0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1cad0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1cae0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1caf0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1cb00 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
1cb10 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1cb20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1cb30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1cb40 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
1cb50 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1cb60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1cb70 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
1cb80 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
1cb90 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  (idx);...}..}...
1cba0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
1cbb0 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
1cbc0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1cbd0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1cbe0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1cbf0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1cc00 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1cc10 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1cc20 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
1cc30 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
1cc40 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
1cc50 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1cc60 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09  sc_reader) {....
1cc70 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
1cc80 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
1cc90 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  er);...}....if (
1cca0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1ccb0 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ].cached_certs) 
1ccc0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  {....cackey_free
1ccd0 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f 73 6c  _certs(cackey_sl
1cce0 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1ccf0 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f 73 6c  certs, cackey_sl
1cd00 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1cd10 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b  certs_count, 1);
1cd20 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1cd30 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
1cd40 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  rts = NULL;...}.
1cd50 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  .}...cackey_pcsc
1cd60 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  _disconnect();..
1cd70 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
1cd80 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  zed = 0;...CACKE
1cd90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cda0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1cdb0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1cdc0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1cdd0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1cde0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1cdf0 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e  C_GetInfo)(CK_IN
1ce00 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1ce10 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1ce20 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
1ce30 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
1ce40 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
1ce50 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69  c CK_UTF8CHAR li
1ce60 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1ce70 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a  [] = "CACKey";..
1ce80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ce90 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1cea0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
1ceb0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1cec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ced0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
1cee0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1cef0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1cf00 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1cf10 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1cf20 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1cf30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cf40 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1cf50 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1cf60 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1cf70 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1cf80 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72  ;..}...pInfo->cr
1cf90 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61  yptokiVersion.ma
1cfa0 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
1cfb0 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
1cfc0 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
1cfd0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  xff;..pInfo->cry
1cfe0 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e  ptokiVersion.min
1cff0 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
1d000 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
1d010 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
1d020 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  f;...memset(pInf
1d030 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1d040 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
1d050 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1d060 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
1d070 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1d080 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
1d090 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
1d0a0 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
1d0b0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  1);...pInfo->fla
1d0c0 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d  gs = 0x00;...mem
1d0d0 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  set(pInfo->libra
1d0e0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  ryDescription, '
1d0f0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1d100 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1d110 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
1d120 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
1d130 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61  scription, libra
1d140 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  ryDescription, s
1d150 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73  izeof(libraryDes
1d160 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
1d170 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  ..pInfo->library
1d180 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1d190 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
1d1a0 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
1d1b0 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  ff;..pInfo->libr
1d1c0 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  aryVersion.minor
1d1d0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1d1e0 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1d1f0 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
1d200 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1d210 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1d220 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1d230 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1d240 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73  }../*. * Process
1d250 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
1d260 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70  , and create map
1d270 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61  ping between rea
1d280 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f  der name and slo
1d290 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49  t ID. */.CK_DEFI
1d2a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1d2b0 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  V, C_GetSlotList
1d2c0 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e  )(CK_BBOOL token
1d2d0 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54  Present, CK_SLOT
1d2e0 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73  _ID_PTR pSlotLis
1d2f0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1d300 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
1d310 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63 61  tic int first_ca
1d320 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  ll = 1;..int mut
1d330 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
1d340 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
1d350 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e  ;..CK_ULONG coun
1d360 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  t, slot_count = 
1d370 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f  0, currslot, slo
1d380 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63  t_idx;..char *pc
1d390 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73  sc_readers, *pcs
1d3a0 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63  c_readers_s, *pc
1d3b0 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44  sc_readers_e;..D
1d3c0 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72  WORD pcsc_reader
1d3d0 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  s_len;..LONG sca
1d3e0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1d3f0 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72  et;..size_t curr
1d400 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e  _reader_len;..in
1d410 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09  t slot_reset;...
1d420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d430 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1d440 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d  ..if (pulCount =
1d450 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1d460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d470 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74  "Error. pulCount
1d480 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1d490 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1d4a0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1d4b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1d4c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1d4d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d4e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1d4f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1d500 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1d510 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1d520 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  IZED);..}...mute
1d530 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1d540 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1d550 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1d560 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1d570 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1d580 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d590 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1d5a0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1d5b0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1d5c0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ERROR);..}.../* 
1d5d0 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c  Clear list of sl
1d5e0 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73  ots */..slot_res
1d5f0 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c  et = 0;..if (pSl
1d600 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69 66 20 28  otList) {...if (
1d610 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09  first_call) {...
1d620 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b  .first_call = 0;
1d630 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20  .....slot_reset 
1d640 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49  = 1;...}..../* I
1d650 66 20 61 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f  f any of the slo
1d660 74 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 73  ts have been res
1d670 65 74 20 74 68 65 6e 20 70 75 72 67 65 20 61 6c  et then purge al
1d680 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  l information an
1d690 64 20 63 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f  d check again */
1d6a0 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
1d6b0 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
1d6c0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1d6d0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1d6e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1d6f0 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1d700 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1d710 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
1d720 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63  nternal) {.....c
1d730 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
1d740 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
1d750 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1d760 74 69 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74  tive) {.....cont
1d770 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
1d780 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1d790 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72  currslot].slot_r
1d7a0 65 73 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74  eset) {.....slot
1d7b0 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09  _reset = 1;.....
1d7c0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
1d7d0 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73  ....if (slot_res
1d7e0 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
1d7f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75  DEBUG_PRINTF("Pu
1d800 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69  rging all slot i
1d810 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a  nformation.");..
1d820 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74  .../* Only updat
1d830 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c  e the list of sl
1d840 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63  ots if we are ac
1d850 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70  tually being sup
1d860 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66  ply the slot inf
1d870 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  ormation */....c
1d880 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
1d890 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
1d8a0 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
1d8b0 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
1d8c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1d8d0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1d8e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1d8f0 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
1d900 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1d910 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
1d920 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09  nternal) {......
1d930 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
1d940 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1d950 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d960 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09  pcsc_reader) {..
1d970 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
1d980 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d990 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
1d9a0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1d9b0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1d9c0 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
1d9d0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61  ...}......if (ca
1d9e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1d9f0 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09  lot].label) {...
1da00 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
1da10 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1da20 61 62 65 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63  abel);.......cac
1da30 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1da40 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
1da50 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
1da60 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1da70 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  ot].active = 0;.
1da80 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
1da90 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  ......}..}.../* 
1daa0 44 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f  Determine list o
1dab0 66 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63  f readers */..pc
1dac0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
1dad0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
1dae0 6e 65 63 74 28 29 3b 0a 2f 2a 20 58 58 58 3a 20  nect();./* XXX: 
1daf0 43 41 4e 20 48 41 4e 47 20 48 45 52 45 20 21 20  CAN HANG HERE ! 
1db00 2a 2f 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  */..if (pcsc_con
1db10 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
1db20 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
1db30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1db40 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
1db50 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
1db60 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73  d, assuming no s
1db70 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f  lots");....slot_
1db80 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c  count = 0;..} el
1db90 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64  se {...pcsc_read
1dba0 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09  ers_len = 0;....
1dbb0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1dbc0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
1dbd0 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
1dbe0 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
1dbf0 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
1dc00 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09  readers_len);...
1dc10 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1dc20 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1dc30 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
1dc40 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1dc50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1dc60 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  r. SCardListRead
1dc70 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  ers() returned S
1dc80 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
1dc90 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e  R, assuming Conn
1dca0 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20  ection to PC/SC 
1dcb0 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e  went away. Recon
1dcc0 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09  necting.");.....
1dcd0 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1dce0 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63  onnect();....cac
1dcf0 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
1dd00 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ();.....CACKEY_D
1dd10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79  EBUG_PRINTF("Try
1dd20 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61  ing SCardListRea
1dd30 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a  ders() again");.
1dd40 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1dd50 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1dd60 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1dd70 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1dd80 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63   NULL, NULL, &pc
1dd90 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1dda0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
1ddb0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1ddc0 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
1ddd0 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61  CESS && pcsc_rea
1dde0 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  ders_len != 0) {
1ddf0 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
1de00 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72   = malloc(pcsc_r
1de10 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
1de20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d  pcsc_readers_s =
1de30 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a   pcsc_readers;..
1de40 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1de50 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1de60 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1de70 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1de80 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64   NULL, pcsc_read
1de90 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ers, &pcsc_reade
1dea0 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  rs_len);....if (
1deb0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1dec0 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
1ded0 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
1dee0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d  pcsc_readers_e =
1def0 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20   pcsc_readers + 
1df00 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1df10 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20  ;....../* Start 
1df20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20  with Slot ID 1, 
1df30 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69  to avoid a bug i
1df40 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f  n GDM on RHEL */
1df50 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39  ...../* Bug 5949
1df60 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a  11: https://bugz
1df70 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f  illa.redhat.com/
1df80 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
1df90 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75  594911 */.....cu
1dfa0 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09  rrslot = 1;.....
1dfb0 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  slot_count = 0;.
1dfc0 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f  ....while (pcsc_
1dfd0 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72  readers < pcsc_r
1dfe0 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
1dff0 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76  ./* Find next av
1e000 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a  ailable slot */.
1e010 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72  .....for (; curr
1e020 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1e030 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1e040 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1e050 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1e060 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20  t++) {.......if 
1e070 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1e080 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1e090 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b   {........break;
1e0a0 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
1e0b0 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65  ......curr_reade
1e0c0 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  r_len = strlen(p
1e0d0 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
1e0e0 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65  ....if ((pcsc_re
1e0f0 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61  aders + curr_rea
1e100 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f  der_len) > pcsc_
1e110 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
1e120 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1e130 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  .......if (curr_
1e140 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29  reader_len == 0)
1e150 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
1e160 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
1e170 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69  (currslot >= (si
1e180 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e190 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e1a0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1e1b0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1e1c0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1e1d0 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74  d more readers t
1e1e0 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76  han slots are av
1e1f0 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09  ailable!");.....
1e200 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1e210 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1e220 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1e230 64 20 72 65 61 64 65 72 3a 20 25 73 20 28 63 75  d reader: %s (cu
1e240 72 72 73 6c 6f 74 20 3d 20 25 6c 75 29 22 2c 20  rrslot = %lu)", 
1e250 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 28 75  pcsc_readers, (u
1e260 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1e270 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 2f  rrslot);......./
1e280 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
1e290 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
1e2a0 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
1e2b0 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73  ly being asked s
1e2c0 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
1e2d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
1e2e0 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
1e2f0 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 6c  ) {.......if (sl
1e300 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09  ot_reset) {.....
1e310 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1e320 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
1e330 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63 61 63   = 1;........cac
1e340 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1e350 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30  ot].internal = 0
1e360 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
1e370 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1e380 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74  pcsc_reader = st
1e390 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72  rdup(pcsc_reader
1e3a0 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65  s);........cacke
1e3b0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1e3c0 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
1e3d0 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09  ected = 0;......
1e3e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1e3f0 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63  urrslot].transac
1e400 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
1e410 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1e420 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
1e430 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
1e440 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 09  w_lock = 0;.....
1e450 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
1e460 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c  n_command == NUL
1e470 4c 29 20 7b 0a 09 09 09 09 09 09 09 09 63 61 63  L) {.........cac
1e480 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1e490 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot].token_flags 
1e4a0 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
1e4b0 49 52 45 44 3b 0a 09 09 09 09 09 09 09 7d 20 65  IRED;........} e
1e4c0 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 63 61  lse {.........ca
1e4d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1e4e0 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot].token_flags
1e4f0 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 7d 0a 09   = 0;........}..
1e500 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1e510 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1e520 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  el = NULL;......
1e530 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
1e540 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65  lot_reset(&cacke
1e550 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1e560 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ]);.......}.....
1e570 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1e580 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1e590 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1e5a0 76 65 29 20 7b 0a 09 09 09 09 09 09 09 2f 2a 20  ve) {......../* 
1e5b0 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69 6e 63  Artificially inc
1e5c0 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62 65 72  rease the number
1e5d0 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f 74 73   of active slots
1e5e0 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20 62 65   by what will be
1e5f0 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a 09  come active */..
1e600 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1e610 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1e620 20 69 6e 2d 61 63 74 69 76 65 20 73 6c 6f 74 20   in-active slot 
1e630 25 6c 75 2c 20 62 75 74 20 69 74 20 77 69 6c 6c  %lu, but it will
1e640 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
1e650 20 61 20 72 65 73 65 74 20 2d 2d 20 6d 61 72 6b   a reset -- mark
1e660 69 6e 67 20 61 73 20 61 63 74 69 76 65 20 66 6f  ing as active fo
1e670 72 20 61 63 63 6f 75 6e 74 69 6e 67 20 70 75 72  r accounting pur
1e680 70 6f 73 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  poses", (unsigne
1e690 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74  d long) currslot
1e6a0 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c 6f 74 5f  );.........slot_
1e6b0 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 09 7d  count++;.......}
1e6c0 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72  ......}......cur
1e6d0 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70  rslot++;.......p
1e6e0 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63  csc_readers += c
1e6f0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b  urr_reader_len +
1e700 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66   1;.....}......f
1e710 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
1e720 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1e730 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e740 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e750 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1e760 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1e770 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1e780 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
1e790 69 76 65 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ive) {.......CAC
1e7a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e7b0 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65 20 73  ("Found active s
1e7c0 6c 6f 74 20 25 6c 75 2c 20 72 65 61 64 65 72 20  lot %lu, reader 
1e7d0 3d 20 25 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  = %s", (unsigned
1e7e0 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 2c   long) currslot,
1e7f0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75   cackey_slots[cu
1e800 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1e810 64 65 72 29 3b 0a 0a 09 09 09 09 09 09 73 6c 6f  der);........slo
1e820 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09  t_count++;......
1e830 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  }.....}....} els
1e840 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
1e850 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
1e860 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72  ond call to SCar
1e870 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69  dListReaders fai
1e880 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25  led, return %s/%
1e890 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  li", CACKEY_DEBU
1e8a0 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
1e8b0 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73  TO_STR(scard_lis
1e8c0 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28  treaders_ret), (
1e8d0 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74  long) scard_list
1e8e0 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09  readers_ret);...
1e8f0 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63  .}.....free(pcsc
1e900 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d  _readers_s);...}
1e910 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
1e920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e930 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43  First call to SC
1e940 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
1e950 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
1e960 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
1e970 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
1e980 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
1e990 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
1e9a0 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
1e9b0 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
1e9c0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
1e9d0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1e9e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e9f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1ea00 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1ea10 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1ea20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ea30 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1ea40 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1ea50 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1ea60 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1ea70 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
1ea80 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
1ea90 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b  nt = slot_count;
1eaa0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1eab0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1eac0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
1ead0 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
1eae0 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72  rs, but not stor
1eaf0 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69  ing IDs (pSlotLi
1eb00 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b  st == NULL)", CK
1eb10 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
1eb20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
1eb30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1eb40 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74  _OK);..}...count
1eb50 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69   = *pulCount;..i
1eb60 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f  f (count < slot_
1eb70 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45  count) {...CACKE
1eb80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1eb90 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
1eba0 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
1ebb0 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25  s, but we have %
1ebc0 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f  lu entries.", co
1ebd0 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  unt, slot_count)
1ebe0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1ebf0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1ec00 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
1ec10 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72  OO_SMALL");....r
1ec20 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
1ec30 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
1ec40 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1ec50 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1ec60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1ec70 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1ec80 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1ec90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eca0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1ecb0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1ecc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1ecd0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1ece0 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20 30  }...slot_idx = 0
1ecf0 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ;..for (currslot
1ed00 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74 20   = 0; (currslot 
1ed10 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1ed20 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1ed30 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1ed40 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ))); currslot++)
1ed50 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
1ed60 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1ed70 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63 6f  .active) {....co
1ed80 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
1ed90 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20 63  f (slot_idx >= c
1eda0 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
1edb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1edc0 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
1edd0 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
1ede0 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20 74  s, but we just t
1edf0 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ried to write to
1ee00 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20 2d   the %lu index -
1ee10 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f 75  - ignoring", cou
1ee20 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a  nt, slot_idx);..
1ee30 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1ee40 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73 6c  ....pSlotList[sl
1ee50 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73 6c  ot_idx] = currsl
1ee60 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b 2b  ot;...slot_idx++
1ee70 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1ee80 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1ee90 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1eea0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1eeb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1eec0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1eed0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1eee0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1eef0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ef00 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ef10 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  RROR);..}...*pul
1ef20 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
1ef30 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  nt;...CACKEY_DEB
1ef40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1ef50 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1ef60 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
1ef70 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20  ders.", CKR_OK, 
1ef80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ef90 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72  slot_count);...r
1efa0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a  eturn(CKR_OK);..
1efb0 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20  .tokenPresent = 
1efc0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a  tokenPresent; /*
1efd0 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
1efe0 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
1eff0 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
1f000 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f010 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28   C_GetSlotInfo)(
1f020 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1f030 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f  D, CK_SLOT_INFO_
1f040 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
1f050 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1f060 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e   slotDescription
1f070 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f  [] = "CACKey Slo
1f080 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  t";..int mutex_r
1f090 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65  etval;..int byte
1f0a0 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43  s_to_copy;...CAC
1f0b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f0c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f0d0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1f0e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f0f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f100 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1f110 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f120 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1f130 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1f140 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1f150 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f160 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f170 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1f180 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f190 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1f1a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f1b0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1f1c0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1f1d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f1e0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1f1f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1f200 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f210 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f220 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1f230 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1f240 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1f250 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1f260 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1f270 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1f280 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1f290 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1f2a0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1f2b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1f2c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1f2d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f2e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f2f0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1f300 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f310 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1f320 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1f330 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1f340 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1f350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f360 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1f370 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1f380 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1f390 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1f3a0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1f3b0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1f3c0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f3d0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1f3e0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1f3f0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
1f400 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
1f410 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 21  HW_SLOT;...if (!
1f420 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f430 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  tID].internal) {
1f440 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1f450 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45  |= CKF_REMOVABLE
1f460 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69 66  _DEVICE;..}...if
1f470 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
1f480 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
1f490 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d  lots[slotID]) ==
1f4a0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
1f4b0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
1f4c0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
1f4d0 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
1f4e0 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74  NT;..}...bytes_t
1f4f0 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28  o_copy = strlen(
1f500 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f510 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
1f520 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70  );..if (sizeof(p
1f530 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1f540 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f  erID) < bytes_to
1f550 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73  _copy) {...bytes
1f560 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f  _to_copy = sizeo
1f570 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1f580 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65  turerID);..}..me
1f590 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
1f5a0 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b  facturerID, cack
1f5b0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f5c0 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79  .pcsc_reader, by
1f5d0 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09  tes_to_copy);...
1f5e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1f5f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f600 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f610 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f620 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f630 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f640 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1f650 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1f660 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f670 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f680 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
1f690 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69  o->slotDescripti
1f6a0 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
1f6b0 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
1f6c0 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70  iption));..memcp
1f6d0 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  y(pInfo->slotDes
1f6e0 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65  cription, slotDe
1f6f0 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f  scription, sizeo
1f700 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  f(slotDescriptio
1f710 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  n) - 1);...memse
1f720 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
1f730 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
1f740 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1f750 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09  facturerID));...
1f760 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
1f770 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
1f780 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
1f790 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
1f7a0 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
1f7b0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1f7c0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1f7d0 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1f7e0 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
1f7f0 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
1f800 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
1f810 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1f820 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
1f830 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
1f840 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f850 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1f860 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1f870 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1f880 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1f890 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54  ON(CK_RV, C_GetT
1f8a0 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  okenInfo)(CK_SLO
1f8b0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
1f8c0 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  TOKEN_INFO_PTR p
1f8d0 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1f8e0 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
1f8f0 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
1f900 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
1f910 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
1f920 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62  8CHAR defaultLab
1f930 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20  el[] = "Unknown 
1f940 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20  Token";..static 
1f950 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65  CK_UTF8CHAR mode
1f960 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e  l[] = "CAC Token
1f970 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ";..struct cacke
1f980 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
1f990 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
1f9a0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1f9b0 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69   num_certs;..ssi
1f9c0 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a  ze_t label_ret;.
1f9d0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1f9e0 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61  l;..int use_defa
1f9f0 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43  ult_label;...CAC
1fa00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fa10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1fa20 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1fa30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fa40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1fa50 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1fa60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fa70 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1fa80 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1fa90 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1faa0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fab0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fac0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1fad0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fae0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1faf0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1fb00 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1fb10 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1fb20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1fb30 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1fb40 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1fb50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fb60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fb70 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1fb80 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1fb90 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1fba0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1fbb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1fbc0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1fbd0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1fbe0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1fbf0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1fc00 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1fc10 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1fc20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fc30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fc40 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1fc50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fc60 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1fc70 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1fc80 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1fc90 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1fca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fcb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1fcc0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1fcd0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1fce0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1fcf0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1fd00 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1fd10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1fd20 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1fd30 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1fd40 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1fd50 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
1fd60 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
1fd70 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
1fd80 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
1fd90 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
1fda0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fdb0 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73  NTF("No token is
1fdc0 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74   present in slot
1fdd0 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49  ID = %lu", slotI
1fde0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1fdf0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1fe00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1fe10 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
1fe20 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d  NOT_PRESENT);..}
1fe30 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1fe40 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1fe50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1fe60 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1fe70 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1fe80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fe90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fea0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1feb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fec0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1fed0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
1fee0 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c  mine token label
1fef0 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74   from certificat
1ff00 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49  es */..memset(pI
1ff10 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c  nfo->label, ' ',
1ff20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1ff30 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66  abel));..use_def
1ff40 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a  ault_label = 1;.
1ff50 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1ff60 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
1ff70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63   == NULL) {...pc
1ff80 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
1ff90 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
1ffa0 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
1ffb0 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26  slotID], NULL, &
1ffc0 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66  num_certs);...if
1ffd0 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
1ffe0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
1fff0 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
20000 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72  0) {.....label_r
20010 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63  et = cackey_pcsc
20020 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
20030 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  el(pcsc_identiti
20040 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  es, pInfo->label
20050 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
20060 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20  label));.....if 
20070 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20  (label_ret > 0) 
20080 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75  {......use_defau
20090 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09  lt_label = 0;...
200a0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
200b0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
200c0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70   malloc(sizeof(p
200d0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
200e0 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
200f0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
20100 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c  .label, pInfo->l
20110 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
20120 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
20130 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  .}....}.....cack
20140 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
20150 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
20160 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09  um_certs, 1);...
20170 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  }..} else {...me
20180 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mcpy(pInfo->labe
20190 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  l, cackey_slots[
201a0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73  slotID].label, s
201b0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
201c0 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66  el));....use_def
201d0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
201e0 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66  .}...if (use_def
201f0 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09  ault_label) {...
20200 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
20210 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65  bel, defaultLabe
20220 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c  l, sizeof(defaul
20230 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d  tLabel) - 1);..}
20240 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
20250 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
20260 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
20270 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
20280 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  ID));..memcpy(pI
20290 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
202a0 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65  rID, manufacture
202b0 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75  rID, sizeof(manu
202c0 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29  facturerID) - 1)
202d0 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
202e0 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69  ->model, ' ', si
202f0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65  zeof(pInfo->mode
20300 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  l));..memcpy(pIn
20310 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c  fo->model, model
20320 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20  , sizeof(model) 
20330 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
20340 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62  Info->serialNumb
20350 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  er, ' ', sizeof(
20360 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
20370 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28  ber));...memset(
20380 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20  pInfo->utcTime, 
20390 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
203a0 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09  o->utcTime));...
203b0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
203c0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
203d0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
203e0 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
203f0 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
20400 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
20410 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
20420 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
20430 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
20440 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
20450 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
20460 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
20470 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
20480 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  0;...pInfo->flag
20490 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52  s = CKF_WRITE_PR
204a0 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53  OTECTED | CKF_US
204b0 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a  ER_PIN_INITIALIZ
204c0 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49  ED | CKF_TOKEN_I
204d0 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63  NITIALIZED | cac
204e0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
204f0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a  ].token_flags;..
20500 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
20510 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29  command != NULL)
20520 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
20530 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43 54  s |= CKF_PROTECT
20540 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ED_AUTHENTICATIO
20550 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49 6e  N_PATH;..}...pIn
20560 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e  fo->ulMaxSession
20570 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28  Count = (sizeof(
20580 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
20590 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
205a0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d  _sessions[0])) -
205b0 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65   1;..pInfo->ulSe
205c0 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f  ssionCount = CK_
205d0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
205e0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
205f0 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43  >ulMaxRwSessionC
20600 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f  ount = 0;..pInfo
20610 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75  ->ulRwSessionCou
20620 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  nt = CK_UNAVAILA
20630 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
20640 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69  ..pInfo->ulMaxPi
20650 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e  nLen = 128;..pIn
20660 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20  fo->ulMinPinLen 
20670 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  = 0;..pInfo->ulT
20680 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79  otalPublicMemory
20690 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
206a0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
206b0 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62  pInfo->ulFreePub
206c0 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
206d0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
206e0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
206f0 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65  ulTotalPrivateMe
20700 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
20710 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
20720 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
20730 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  ePrivateMemory =
20740 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
20750 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43  INFORMATION;...C
20760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20770 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20780 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
20790 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
207a0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
207b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
207c0 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  RV, C_WaitForSlo
207d0 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53  tEvent)(CK_FLAGS
207e0 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f   flags, CK_SLOT_
207f0 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20  ID_PTR pSlotID, 
20800 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73  CK_VOID_PTR pRes
20810 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59  erved) {..CACKEY
20820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
20830 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
20840 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
20850 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
20860 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20870 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
20880 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
20890 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
208a0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
208b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
208c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
208d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
208e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
208f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20900 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20910 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20920 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58  IZED);..}.../* X
20930 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d  XX: TODO: Implem
20940 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09  ent this... */..
20950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20960 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20970 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20980 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
20990 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
209a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
209b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
209c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
209d0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
209e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
209f0 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c   C_GetMechanismL
20a00 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ist)(CK_SLOT_ID 
20a10 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
20a20 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d  NISM_TYPE_PTR pM
20a30 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b  echanismList, CK
20a40 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
20a50 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  unt) {..CACKEY_D
20a60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20a70 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20a80 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20a90 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20ab0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20ac0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20ad0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20ae0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20af0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75  ..}...if (pulCou
20b00 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
20b10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20b20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c  NTF("Error.  pul
20b30 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29  Count is NULL.")
20b40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20b50 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
20b60 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
20b70 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  ismList == NULL)
20b80 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d   {...*pulCount =
20b90 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   1;....CACKEY_DE
20ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20bb0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20bc0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
20bd0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
20be0 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75  .}...if (*pulCou
20bf0 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b  nt < 1) {...CACK
20c00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20c10 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20  "Error.  Buffer 
20c20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09  too small.");...
20c30 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46  .return(CKR_BUFF
20c40 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09  ER_TOO_SMALL);..
20c50 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69  }...pMechanismLi
20c60 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f  st[0] = CKM_RSA_
20c70 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74  PKCS;..*pulCount
20c80 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 1;...CACKEY_D
20c90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20ca0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
20cb0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
20cc0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
20cd0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20ce0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
20cf0 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29  etMechanismInfo)
20d00 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
20d10 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  ID, CK_MECHANISM
20d20 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d  _TYPE type, CK_M
20d30 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54  ECHANISM_INFO_PT
20d40 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
20d50 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
20d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20d70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20d80 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
20d90 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
20da0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20db0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
20dc0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
20dd0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
20de0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
20df0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20e00 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20e10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20e20 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20e30 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20e40 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20e50 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20e60 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
20e70 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
20e80 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
20e90 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
20ea0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
20eb0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
20ec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20ed0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
20ee0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
20ef0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
20f00 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
20f10 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
20f20 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
20f30 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
20f40 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20f50 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
20f60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20f70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20f80 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20f90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20fa0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
20fb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20fc0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
20fd0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
20fe0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
20ff0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
21000 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21010 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21020 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
21030 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
21040 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
21050 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
21060 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
21070 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21080 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
21090 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
210a0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
210b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
210c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
210d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
210e0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
210f0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
21100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21110 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
21120 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
21130 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21140 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
21150 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70  .}...switch (typ
21160 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  e) {...case CKM_
21170 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e  RSA_PKCS:....pIn
21180 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
21190 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
211a0 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
211b0 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
211c0 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
211d0 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
211e0 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
211f0 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
21200 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
21210 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
21220 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21230 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
21240 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
21250 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  rn(CKR_OK);.}../
21260 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
21270 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
21280 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
21290 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
212a0 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f  nitToken)(CK_SLO
212b0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
212c0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
212d0 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
212e0 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
212f0 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a  R_PTR pLabel) {.
21300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21310 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21320 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21330 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21350 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21360 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21370 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21380 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21390 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
213a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
213b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
213c0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
213d0 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
213e0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
213f0 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
21400 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
21410 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
21420 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
21430 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
21440 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
21450 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
21460 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53   C_InitPIN)(CK_S
21470 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21480 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
21490 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
214a0 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
214b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
214c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
214d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
214e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
214f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21500 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21510 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
21520 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21530 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
21540 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21550 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21560 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
21570 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
21580 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
21590 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
215a0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
215b0 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
215c0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
215d0 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
215e0 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
215f0 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
21600 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
21610 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b  RV, C_SetPIN)(CK
21620 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
21630 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
21640 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69  8CHAR_PTR pOldPi
21650 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c  n, CK_ULONG ulOl
21660 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  dPinLen, CK_UTF8
21670 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e  CHAR_PTR pNewPin
21680 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77  , CK_ULONG ulNew
21690 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  PinLen) {..CACKE
216a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
216b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
216c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
216d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
216e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
216f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21700 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21710 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21720 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21730 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
21740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21750 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
21760 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21770 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
21780 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21790 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
217a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
217b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
217c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
217d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e  ON(CK_RV, C_Open
217e0 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54  Session)(CK_SLOT
217f0 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46  _ID slotID, CK_F
21800 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56  LAGS flags, CK_V
21810 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61  OID_PTR pApplica
21820 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20  tion, CK_NOTIFY 
21830 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49  notify, CK_SESSI
21840 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  ON_HANDLE_PTR ph
21850 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69  Session) {..unsi
21860 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09  gned long idx;..
21870 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
21880 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73  ;..int found_ses
21890 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  sion = 0;...CACK
218a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
218b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
218c0 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53   ((flags & CKF_S
218d0 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21  ERIAL_SESSION) !
218e0 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  = CKF_SERIAL_SES
218f0 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e  SION) {...return
21900 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52  (CKR_SESSION_PAR
21910 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52  ALLEL_NOT_SUPPOR
21920 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  TED);..}...if (!
21930 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
21940 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
21950 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21960 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
21970 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
21980 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
21990 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
219a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
219b0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
219c0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
219d0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
219e0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
219f0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21a00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21a10 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21a20 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21a30 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
21a40 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
21a50 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
21a60 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
21a70 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
21a80 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21a90 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
21aa0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21ab0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21ac0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21ae0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21af0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21b00 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21b10 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
21b20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21b30 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
21b40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21b50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21b60 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21b70 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21b80 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
21b90 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
21ba0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
21bb0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21bc0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
21bd0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
21be0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21bf0 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
21c00 74 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75  the card is actu
21c10 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74  ally in the slot
21c20 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68  . */../* XXX: Ch
21c30 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
21c40 20 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20   this is in the 
21c50 50 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63  PKCS#11 specific
21c60 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61  ation */..if (ca
21c70 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
21c80 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  nt(&cackey_slots
21c90 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43  [slotID]) != CAC
21ca0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
21cb0 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43  PRESENT) {...CAC
21cc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21cd0 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e  ("Error.  Card n
21ce0 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74  ot present.  Ret
21cf0 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43  urning CKR_DEVIC
21d00 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09  E_REMOVED");....
21d10 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21d20 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21d30 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
21d40 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
21d50 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
21d60 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69  x = 1; idx < (si
21d70 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21d80 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
21d90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
21da0 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
21db0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
21dc0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
21dd0 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73  ) {....found_ses
21de0 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70  sion = 1;.....*p
21df0 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a  hSession = idx;.
21e00 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21e10 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20  ons[idx].active 
21e20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 1;....cackey_s
21e30 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f  essions[idx].slo
21e40 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09  tID = slotID;...
21e50 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21e60 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b  [idx].state = CK
21e70 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
21e80 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ION;....cackey_s
21e90 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61  essions[idx].fla
21ea0 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63  gs = flags;....c
21eb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21ec0 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f  dx].ulDeviceErro
21ed0 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79  r = 0;....cackey
21ee0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70  _sessions[idx].p
21ef0 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41  Application = pA
21f00 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63  pplication;....c
21f10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21f20 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74  dx].Notify = not
21f30 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ify;.....cackey_
21f40 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
21f50 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
21f60 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21f70 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
21f80 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a  ies_count = 0;..
21f90 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21fa0 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61  ns[idx].search_a
21fb0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
21fc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21fd0 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  dx].sign_active 
21fe0 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
21ff0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65  sessions[idx].de
22000 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30  crypt_active = 0
22010 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
22020 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
22030 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
22040 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
22050 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22060 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65  tID], &cackey_se
22070 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
22080 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
22090 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
220a0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
220b0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
220c0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
220d0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
220e0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
220f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22100 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22110 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
22120 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22130 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22140 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f  R);..}...if (!fo
22150 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09  und_session) {..
22160 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22170 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22180 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
22190 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53  T (%i)", CKR_SES
221a0 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09  SION_COUNT);....
221b0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
221c0 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09  ON_COUNT);..}...
221d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
221e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
221f0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
22200 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
22210 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
22220 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22230 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73  _RV, C_CloseSess
22240 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion)(CK_SESSION_
22250 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
22260 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
22270 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
22280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22290 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
222a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
222b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
222c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
222d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
222e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
222f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
22300 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22310 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
22320 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
22330 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
22340 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
22350 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
22360 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
22370 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22380 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22390 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
223a0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
223b0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
223c0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
223d0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
223e0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
223f0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
22400 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22410 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22420 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22430 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22440 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
22450 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22460 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22470 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
22480 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22490 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
224a0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
224b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
224c0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
224d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
224e0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
224f0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
22500 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22510 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
22520 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
22530 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22540 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20  ssion].active = 
22550 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  0;..cackey_free_
22560 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
22570 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22580 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
22590 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
225a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
225b0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
225c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
225d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
225e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
225f0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
22600 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
22610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22620 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
22630 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22640 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22650 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22660 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22670 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22680 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
22690 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
226a0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
226b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
226c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
226d0 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b  eAllSessions)(CK
226e0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29  _SLOT_ID slotID)
226f0 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
22700 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
22710 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
22720 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22730 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
22740 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22750 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22760 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22770 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22780 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22790 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
227a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
227b0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
227c0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
227d0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
227e0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
227f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
22800 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
22810 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22820 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
22830 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
22840 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
22850 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
22860 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22870 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
22880 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
22890 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
228a0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
228b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
228c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
228d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
228e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
228f0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
22900 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22910 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22920 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
22930 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22940 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
22950 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22960 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
22970 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
22980 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
22990 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
229a0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
229b0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
229c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
229d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
229e0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
229f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66  INVALID);..}...f
22a00 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
22a10 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
22a20 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
22a30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22a40 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
22a50 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
22a60 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
22a70 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28  ctive) {....if (
22a80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22a90 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73  idx].slotID != s
22aa0 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e  lotID) {.....con
22ab0 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
22ac0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22ad0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22ae0 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53  ck);....C_CloseS
22af0 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09  ession(idx);....
22b00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
22b10 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22b20 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
22b30 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
22b40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22b50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22b60 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22b70 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22b80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22b90 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
22ba0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22bb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22bc0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22be0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22bf0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
22c00 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
22c10 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
22c20 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22c30 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69  K_RV, C_GetSessi
22c40 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49  onInfo)(CK_SESSI
22c50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22c60 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49  on, CK_SESSION_I
22c70 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
22c80 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
22c90 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
22ca0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22cb0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
22cc0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
22cd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22ce0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
22cf0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
22d00 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
22d10 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
22d20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22d30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22d40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22d50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22d60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22d70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22d80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22d90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
22da0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
22db0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
22dc0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22dd0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
22de0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
22df0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
22e00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22e10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
22e20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
22e30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22e40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
22e50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
22e60 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22e70 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22e80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22e90 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22ea0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22eb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22ec0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
22ed0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22ee0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22ef0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
22f00 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22f10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
22f20 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
22f30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22f40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
22f50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22f60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22f70 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
22f80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
22f90 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
22fa0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
22fb0 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44  ...pInfo->slotID
22fc0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
22fd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
22fe0 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61  tID;..pInfo->sta
22ff0 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  te = cackey_sess
23000 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23010 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c  tate;..pInfo->fl
23020 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ags = cackey_ses
23030 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23040 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75  flags;..pInfo->u
23050 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63  lDeviceError = c
23060 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23070 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63  Session].ulDevic
23080 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f  eError;...mutex_
23090 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
230a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
230b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
230c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
230d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
230e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
230f0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
23100 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
23110 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
23120 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
23130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23140 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
23150 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
23160 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
23170 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
23180 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23190 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69  RV, C_GetOperati
231a0 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
231b0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
231c0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
231d0 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
231e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
231f0 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
23200 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
23210 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23220 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23230 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23240 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23250 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23260 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
23270 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
23280 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
23290 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
232a0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
232b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
232c0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
232d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
232e0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
232f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23300 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
23310 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23320 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
23330 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23340 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72  CK_RV, C_SetOper
23350 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
23360 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23370 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
23380 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
23390 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
233a0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65  OperationStateLe
233b0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
233c0 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b  DLE hEncryptionK
233d0 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
233e0 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61  NDLE hAuthentica
233f0 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b  tionKey) {..CACK
23400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23410 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
23420 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
23430 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
23440 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23450 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
23460 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
23470 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
23480 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
23490 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
234a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
234b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
234c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
234d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
234e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
234f0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
23500 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
23510 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
23520 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
23530 49 4f 4e 28 43 4b 5f 52 56 2c 20 5f 43 5f 4c 6f  ION(CK_RV, _C_Lo
23540 67 69 6e 4d 75 74 65 78 41 72 67 29 28 43 4b 5f  ginMutexArg)(CK_
23550 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
23560 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
23570 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
23580 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
23590 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
235a0 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f 63  lPinLen, int loc
235b0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43 4b 5f 53  k_mutex) {..CK_S
235c0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
235d0 46 49 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68  FILE *pinfd;..ch
235e0 61 72 20 2a 70 69 6e 63 6d 64 2c 20 70 69 6e 62  ar *pincmd, pinb
235f0 75 66 5b 36 34 5d 2c 20 2a 66 67 65 74 73 5f 72  uf[64], *fgets_r
23600 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
23610 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65  etval;..int trie
23620 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e  s_remaining;..in
23630 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 09 69 6e  t login_ret;..in
23640 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09  t pclose_ret;...
23650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23660 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
23670 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
23680 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
23690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
236a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
236b0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
236c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
236d0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
236e0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
236f0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
23700 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
23710 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
23720 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
23730 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23740 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
23750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23760 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
23770 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
23780 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23790 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
237a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
237b0 66 20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43  f (userType != C
237c0 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43  KU_USER) {...CAC
237d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
237e0 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c  ("Error.  We onl
237f0 79 20 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d  y support USER m
23800 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25  ode, asked for %
23810 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69  lu mode.", (unsi
23820 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54  gned long) userT
23830 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43  ype)....return(C
23840 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56  KR_USER_TYPE_INV
23850 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
23860 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
23870 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
23880 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
23890 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
238a0 3b 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ;...if (mutex_re
238b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
238c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
238d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
238e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
238f0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23900 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23910 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  .}..}...if (!cac
23920 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23930 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
23940 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
23950 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d  x) {....cackey_m
23960 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23970 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d  ey_biglock);...}
23980 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23990 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
239a0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
239b0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
239c0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
239d0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
239e0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
239f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23a00 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
23a10 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
23a20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
23a30 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23a40 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
23a50 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
23a60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23a70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23a80 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
23a90 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
23aa0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
23ab0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
23ac0 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
23ad0 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  ex) {....cackey_
23ae0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23af0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
23b00 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  }....return(CKR_
23b10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23b20 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
23b30 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
23b40 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
23b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23b60 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
23b70 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
23b80 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
23b90 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
23ba0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
23bb0 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29  .if (lock_mutex)
23bc0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
23bd0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23be0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a  _biglock);...}..
23bf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23c00 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
23c10 0a 09 70 69 6e 63 6d 64 20 3d 20 63 61 63 6b 65  ..pincmd = cacke
23c20 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 3b 0a 09  y_pin_command;..
23c30 69 66 20 28 70 69 6e 63 6d 64 20 21 3d 20 4e 55  if (pincmd != NU
23c40 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
23c50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 43  EBUG_PRINTF("CAC
23c60 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20  KEY_PIN_COMMAND 
23c70 3d 20 25 73 22 2c 20 70 69 6e 63 6d 64 29 3b 0a  = %s", pincmd);.
23c80 0a 09 09 69 66 20 28 70 50 69 6e 20 21 3d 20 4e  ...if (pPin != N
23c90 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ULL) {....CACKEY
23ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
23cb0 72 6f 74 65 63 74 65 64 20 61 75 74 68 65 6e 74  rotected authent
23cc0 69 63 61 74 69 6f 6e 20 70 61 74 68 20 69 6e 20  ication path in 
23cd0 65 66 66 65 63 74 20 61 6e 64 20 50 49 4e 20 70  effect and PIN p
23ce0 72 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a 09 09  rovided !?");...
23cf0 7d 0a 0a 09 09 70 69 6e 66 64 20 3d 20 70 6f 70  }....pinfd = pop
23d00 65 6e 28 70 69 6e 63 6d 64 2c 20 22 72 22 29 3b  en(pincmd, "r");
23d10 0a 09 09 69 66 20 28 70 69 6e 66 64 20 3d 3d 20  ...if (pinfd == 
23d20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  NULL) {....CACKE
23d30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23d40 45 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62  Error.  %s: Unab
23d50 6c 65 20 74 6f 20 72 75 6e 22 2c 20 70 69 6e 63  le to run", pinc
23d60 6d 64 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63  md);.....if (loc
23d70 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63  k_mutex) {.....c
23d80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23d90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23da0 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  k);....}.....CAC
23db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23dc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23dd0 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25  PIN_INCORRECT (%
23de0 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50  i)", (int) CKR_P
23df0 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a  IN_INCORRECT);..
23e00 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
23e10 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
23e20 7d 0a 0a 09 09 66 67 65 74 73 5f 72 65 74 20 3d  }....fgets_ret =
23e30 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c 20 73   fgets(pinbuf, s
23e40 69 7a 65 6f 66 28 70 69 6e 62 75 66 29 2c 20 70  izeof(pinbuf), p
23e50 69 6e 66 64 29 3b 0a 09 09 69 66 20 28 66 67 65  infd);...if (fge
23e60 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20  ts_ret == NULL) 
23e70 7b 0a 09 09 09 70 69 6e 62 75 66 5b 30 5d 20 3d  {....pinbuf[0] =
23e80 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09 09 70 63   '\0';...}....pc
23e90 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c 6f 73  lose_ret = pclos
23ea0 65 28 70 69 6e 66 64 29 3b 0a 09 09 69 66 20 28  e(pinfd);...if (
23eb0 70 63 6c 6f 73 65 5f 72 65 74 20 3d 3d 20 2d 31  pclose_ret == -1
23ec0 20 26 26 20 65 72 72 6e 6f 20 3d 3d 20 45 43 48   && errno == ECH
23ed0 49 4c 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ILD) {....CACKEY
23ee0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e  _DEBUG_PRINTF("N
23ef0 6f 74 69 63 65 2e 20 20 70 63 6c 6f 73 65 28 29  otice.  pclose()
23f00 20 69 6e 64 69 63 61 74 65 64 20 69 74 20 63 6f   indicated it co
23f10 75 6c 64 20 6e 6f 74 20 67 65 74 20 74 68 65 20  uld not get the 
23f20 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 63 68  status of the ch
23f30 69 6c 64 2c 20 61 73 73 75 6d 69 6e 67 20 69 74  ild, assuming it
23f40 20 73 75 63 63 65 65 65 64 65 64 20 21 22 29 3b   succeeeded !");
23f50 0a 0a 09 09 09 70 63 6c 6f 73 65 5f 72 65 74 20  .....pclose_ret 
23f60 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  = 0;...}....if (
23f70 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20 30 29  pclose_ret != 0)
23f80 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
23f90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23fa0 2e 20 20 25 73 3a 20 65 78 69 74 65 64 20 77 69  .  %s: exited wi
23fb0 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74 61 74  th non-zero stat
23fc0 75 73 20 6f 66 20 25 69 22 2c 20 70 69 6e 63 6d  us of %i", pincm
23fd0 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a  d, pclose_ret);.
23fe0 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
23ff0 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ex) {.....cackey
24000 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24010 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24020 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
24030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24040 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49  urning CKR_PIN_I
24050 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20  NCORRECT (%i)", 
24060 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e  (int) CKR_PIN_IN
24070 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65  CORRECT);.....re
24080 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
24090 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09  ORRECT);...}....
240a0 69 66 20 28 73 74 72 6c 65 6e 28 70 69 6e 62 75  if (strlen(pinbu
240b0 66 29 20 3c 20 31 29 20 7b 0a 09 09 09 43 41 43  f) < 1) {....CAC
240c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
240d0 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 72 65  ("Error.  %s: re
240e0 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 61 22 2c  turned no data",
240f0 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09 09 69 66   pincmd);.....if
24100 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
24110 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
24120 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24130 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a 0a 09  iglock);....}...
24140 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24150 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24160 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45   CKR_PIN_INCORRE
24170 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  CT (%i)", (int) 
24180 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
24190 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  T);.....return(C
241a0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
241b0 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 69  );...}....if (pi
241c0 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62  nbuf[strlen(pinb
241d0 75 66 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27  uf) - 1] == '\n'
241e0 29 20 7b 0a 09 09 09 70 69 6e 62 75 66 5b 73 74  ) {....pinbuf[st
241f0 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31  rlen(pinbuf) - 1
24200 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09  ] = '\0';...}...
24210 09 70 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38  .pPin = (CK_UTF8
24220 43 48 41 52 5f 50 54 52 29 20 70 69 6e 62 75 66  CHAR_PTR) pinbuf
24230 3b 0a 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 73  ;...ulPinLen = s
24240 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a 09  trlen(pinbuf);..
24250 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
24260 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
24270 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
24280 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
24290 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69  en, &tries_remai
242a0 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69  ning);..if (logi
242b0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
242c0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
242d0 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
242e0 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
242f0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24300 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09  iglock);...}....
24310 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d  if (login_ret ==
24320 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c   CACKEY_PCSC_E_L
24330 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b  OCKED) {....CACK
24340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24350 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69  "Error.  Token i
24360 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09  s locked.");....
24370 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
24380 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
24390 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
243a0 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41  N_LOCKED;.....CA
243b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
243c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
243d0 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29  _PIN_LOCKED (%i)
243e0 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e  ", (int) CKR_PIN
243f0 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65  _LOCKED);.....re
24400 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43  turn(CKR_PIN_LOC
24410 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69  KED);...} else i
24420 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
24430 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
24440 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45  DPIN) {....CACKE
24450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24460 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20  Error.  Invalid 
24470 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  PIN.");.....cack
24480 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24490 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
244a0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55  CKF_USER_PIN_COU
244b0 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28  NT_LOW;.....if (
244c0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20  tries_remaining 
244d0 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b  == 1) {.....cack
244e0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
244f0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
24500 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
24510 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09  AL_TRY;....}....
24520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24530 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24540 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
24550 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43  T (%i)", (int) C
24560 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
24570 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
24580 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
24590 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
245a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
245b0 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72  ror.  Unknown er
245c0 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f  ror returned fro
245d0 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29  m cackey_login()
245e0 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65   (%i)", login_re
245f0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
24600 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
24610 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c  ;..}...cackey_sl
24620 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
24630 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46  n_flags &= ~(CKF
24640 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  _USER_PIN_LOCKED
24650 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
24660 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f  COUNT_LOW | CKF_
24670 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c  LOGIN_REQUIRED |
24680 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49   CKF_USER_PIN_FI
24690 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b  NAL_TRY);...cack
246a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
246b0 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
246c0 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49  S_RO_USER_FUNCTI
246d0 4f 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f  ONS;...if (lock_
246e0 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78  mutex) {...mutex
246f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24700 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24710 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24720 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24730 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
24740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24750 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
24760 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
24770 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24780 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
24790 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
247a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
247b0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
247c0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
247d0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
247e0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
247f0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
24800 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  gin)(CK_SESSION_
24810 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24820 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73   CK_USER_TYPE us
24830 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43  erType, CK_UTF8C
24840 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
24850 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
24860 20 7b 0a 09 72 65 74 75 72 6e 28 5f 43 5f 4c 6f   {..return(_C_Lo
24870 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73  ginMutexArg(hSes
24880 73 69 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c 20  sion, userType, 
24890 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
248a0 31 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  1));.}..CK_DEFIN
248b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
248c0 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53  , C_Logout)(CK_S
248d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
248e0 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c  ession) {..CK_SL
248f0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69  OT_ID slotID;..i
24900 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
24910 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24920 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24930 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24940 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24950 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24960 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24970 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24980 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24990 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
249a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
249b0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
249c0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
249d0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
249e0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
249f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
24a00 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
24a10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24a20 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
24a30 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
24a40 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
24a50 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
24a60 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
24a70 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
24a80 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
24a90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24aa0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
24ab0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
24ac0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24ad0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
24ae0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
24af0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24b00 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24b10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
24b20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24b30 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
24b40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24b50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24b60 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
24b70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24b80 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
24b90 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
24ba0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
24bb0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
24bc0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
24bd0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
24be0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
24bf0 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
24c00 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
24c10 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
24c20 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
24c30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
24c40 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
24c50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24c60 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
24c70 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
24c80 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
24c90 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
24ca0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24cb0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24cc0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
24cd0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
24ce0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
24cf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24d00 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
24d10 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
24d20 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
24d30 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
24d40 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
24d50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24d60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24d70 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
24d80 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
24d90 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
24da0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24db0 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
24dc0 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f  RO_PUBLIC_SESSIO
24dd0 4e 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  N;...if (cackey_
24de0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
24df0 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
24e00 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
24e10 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
24e20 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
24e30 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b  .} else {...cack
24e40 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24e50 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
24e60 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
24e70 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24e80 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24e90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
24ea0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
24eb0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
24ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24ed0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
24ee0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
24ef0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24f00 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
24f10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24f20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
24f30 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
24f40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
24f50 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
24f60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24f70 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29   C_CreateObject)
24f80 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
24f90 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
24fa0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
24fb0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
24fc0 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
24fd0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
24fe0 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  phObject) {..CAC
24ff0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25000 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25010 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25020 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25040 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25050 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25060 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25070 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25080 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
25090 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
250a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
250b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
250c0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
250d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
250e0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
250f0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
25100 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
25110 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25120 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f  TION(CK_RV, C_Co
25130 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  pyObject)(CK_SES
25140 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
25150 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
25160 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
25170 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
25180 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
25190 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
251a0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
251b0 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20  TR phNewObject) 
251c0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
251d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
251e0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
251f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
25200 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25210 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
25220 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
25230 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25240 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25250 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25270 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25280 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25290 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
252a0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
252b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
252c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
252d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
252e0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
252f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
25300 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  , C_DestroyObjec
25310 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
25320 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
25330 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
25340 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
25350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25360 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25370 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25380 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
253a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
253b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
253c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
253d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
253e0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
253f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
25400 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
25410 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25420 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
25430 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25440 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
25450 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
25460 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
25470 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25480 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
25490 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53  ObjectSize)(CK_S
254a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
254b0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
254c0 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
254d0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
254e0 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45  ulSize) {..CACKE
254f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25500 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
25510 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
25520 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
25530 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25540 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
25550 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
25560 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
25570 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
25580 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
25590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
255a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
255b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
255c0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
255d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
255e0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
255f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25600 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
25610 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
25620 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41  ON(CK_RV, C_GetA
25630 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
25640 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
25650 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
25660 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
25670 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
25680 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
25690 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
256a0 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
256b0 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
256c0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
256d0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
256e0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
256f0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61   identity_idx, a
25700 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
25710 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b  tr_idx, num_ids;
25720 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
25730 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  al;..CK_RV retva
25740 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f  l = CKR_OK;..CK_
25750 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
25760 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
25770 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ueLen;...CACKEY_
25780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25790 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
257a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
257b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
257c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
257d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
257e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
257f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
25800 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25810 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
25820 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
25830 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
25840 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
25850 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
25860 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
25870 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25880 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25890 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
258a0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
258b0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
258c0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
258d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a  );..}...if (hObj
258e0 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ect == 0) {...CA
258f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25900 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
25910 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
25920 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
25930 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
25940 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
25950 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75  ;..}...if (ulCou
25960 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
25970 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
25980 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
25990 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
259a0 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
259b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
259c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
259d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
259e0 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
259f0 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
25a00 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
25a10 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
25a20 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20  f (pTemplate == 
25a30 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
25a40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25a50 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65  rror.  pTemplate
25a60 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
25a70 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
25a80 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
25a90 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68  identity_idx = h
25aa0 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75  Object - 1;...mu
25ab0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
25ac0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
25ad0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25ae0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
25af0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25b00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25b10 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
25b20 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25b30 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25b40 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
25b50 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
25b60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
25b70 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
25b80 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25b90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25bb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
25bc0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
25bd0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25be0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
25bf0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
25c00 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  }...num_ids = ca
25c10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25c20 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
25c30 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28  es_count;...if (
25c40 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20  identity_idx >= 
25c50 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63  num_ids) {...cac
25c60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25c70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25c80 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
25c90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25ca0 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
25cb0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69  out of range.  i
25cc0 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c  dentity_idx = %l
25cd0 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75  u, num_ids = %lu
25ce0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
25cf0 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
25d00 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25d10 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72  ) num_ids);....r
25d20 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
25d30 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
25d40 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20  ;..}...identity 
25d50 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
25d60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
25d70 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79  ntities[identity
25d80 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74  _idx];...for (at
25d90 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
25da0 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20  _idx < ulCount; 
25db0 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
25dc0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65  curr_attr = &pTe
25dd0 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d  mplate[attr_idx]
25de0 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  ;....pValue = NU
25df0 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
25e00 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
25e10 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25e20 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67  _PRINTF("Looking
25e30 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30   for attribute 0
25e40 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79  x%08lx (identity
25e50 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  :%lu) ...", (uns
25e60 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
25e70 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e  _attr->type, (un
25e80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
25e90 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66  ntity_idx);....f
25ea0 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
25eb0 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
25ec0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d  _idx < identity-
25ed0 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
25ee0 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
25ef0 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65  ++) {....if (ide
25f00 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
25f10 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
25f20 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74  .type == curr_at
25f30 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09  tr->type) {.....
25f40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25f50 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20  NTF(" ... found 
25f60 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c  it, pValue = %p,
25f70 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c   ulValueLen = %l
25f80 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  u", identity->at
25f90 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
25fa0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
25fb0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
25fc0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
25fd0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
25fe0 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65  ..........pValue
25ff0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
26000 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
26010 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09  r_idx].pValue;..
26020 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
26030 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
26040 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
26050 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  dx].ulValueLen;.
26060 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
26070 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
26080 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
26090 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
260a0 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75  >ulValueLen >= u
260b0 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
260c0 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
260d0 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  r->pValue, pValu
260e0 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  e, ulValueLen);.
260f0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
26100 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
26110 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09  _LONG) -1;......
26120 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
26130 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
26140 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f  ..}...}....curr_
26150 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
26160 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09   = ulValueLen;..
26170 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
26180 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
26190 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
261a0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
261b0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
261c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
261d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
261e0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
261f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26200 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
26210 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74  R);..}...if (ret
26220 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49  val == CKR_ATTRI
26230 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
26240 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
26250 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26260 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42  rning CKR_ATTRIB
26270 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
26280 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
26290 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
262a0 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
262b0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
262c0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
262d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
262e0 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
262f0 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22  _TOO_SMALL (%i)"
26300 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
26310 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
26320 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val == CKR_OK) {
26330 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26340 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26350 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
26360 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
26370 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
26380 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26390 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
263a0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
263b0 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
263c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
263d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
263e0 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
263f0 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
26400 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26410 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
26420 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
26430 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
26440 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
26450 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
26460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26470 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26480 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26490 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
264a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
264b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
264c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
264d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
264e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
264f0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
26500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26510 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
26520 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26530 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
26540 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26550 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
26560 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
26570 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
26580 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26590 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
265a0 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b  dObjectsInit)(CK
265b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
265c0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
265d0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
265e0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
265f0 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c  lCount) {..CK_SL
26600 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
26610 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e  K_ULONG idx;..in
26620 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
26630 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26640 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26650 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26660 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26670 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26680 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26690 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
266a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
266b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
266c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
266d0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
266e0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
266f0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
26700 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
26710 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
26720 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
26730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26740 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
26750 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
26760 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
26770 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
26780 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
26790 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
267a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
267b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
267c0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
267d0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
267e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
267f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
26800 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
26810 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
26820 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
26830 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
26840 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26850 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
26860 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26870 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26880 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
26890 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
268a0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
268b0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
268c0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
268d0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
268e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
268f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26900 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
26910 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
26920 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
26930 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
26940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26950 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
26960 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69  rch already acti
26970 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
26980 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
26990 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73  _ACTIVE);..}...s
269a0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
269b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
269c0 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
269d0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
269e0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
269f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
26a00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
26a10 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
26a20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26a30 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
26a40 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
26a50 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
26a60 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
26a70 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
26a80 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26a90 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
26aa0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
26ab0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
26ac0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26ae0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
26af0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
26b00 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
26b10 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
26b20 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
26b30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26b40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
26b50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
26b60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
26b70 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
26b80 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
26b90 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  eset) {...CACKEY
26ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
26bb0 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e  he slot has been
26bc0 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20   reset since we 
26bd0 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20  last looked for 
26be0 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65  identities -- re
26bf0 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69  scanning");....i
26c00 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
26c10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
26c20 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
26c30 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65   {....cackey_fre
26c40 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
26c50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26c60 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
26c70 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
26c80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
26c90 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
26ca0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26cb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26cc0 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
26cd0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26ce0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26cf0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
26d00 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63   0;...}....if (c
26d10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26d20 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c  ID].label != NUL
26d30 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  L) {....free(cac
26d40 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26d50 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63  ].label);....cac
26d60 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26d70 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
26d80 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61  ..}....cackey_ma
26d90 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63  rk_slot_reset(&c
26da0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26db0 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73  ID]);...cackey_s
26dc0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f  lots[slotID].slo
26dd0 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a  t_reset = 0;..}.
26de0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
26df0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26e00 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
26e10 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  LL) {...cackey_s
26e20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26e30 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
26e40 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
26e50 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
26e60 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
26e70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26e80 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
26e90 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09  es_count);..}...
26ea0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d  if (pTemplate !=
26eb0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75   NULL) {...if (u
26ec0 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
26ed0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26ee0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26ef0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
26f00 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63   ulCount;....cac
26f10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26f20 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
26f30 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43  ery = malloc(ulC
26f40 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
26f50 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09  Template));.....
26f60 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
26f70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26f80 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70  .search_query, p
26f90 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e  Template, ulCoun
26fa0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
26fb0 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20  plate));....for 
26fc0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
26fd0 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  ulCount; idx++) 
26fe0 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c  {.....if (pTempl
26ff0 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ate[idx].ulValue
27000 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  Len == 0) {.....
27010 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
27020 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
27030 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
27040 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  lue = NULL;.....
27050 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09  ..continue;.....
27060 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  }......cackey_se
27070 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27080 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
27090 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c  x].pValue = mall
270a0 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  oc(pTemplate[idx
270b0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ].ulValueLen);..
270c0 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
270d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
270e0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
270f0 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09  dx].pValue) {...
27100 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
27110 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27120 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
27130 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54  [idx].pValue, pT
27140 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61  emplate[idx].pVa
27150 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69  lue, pTemplate[i
27160 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
27170 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20  .....}....}...} 
27180 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79  else {....cackey
27190 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
271a0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
271b0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63  _count = 0;....c
271c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
271d0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
271e0 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  query = NULL;...
271f0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
27200 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
27210 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
27220 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27230 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
27240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27250 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
27260 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65  h query specifie
27270 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e  d as NULL, but n
27280 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
27290 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69  erms not specifi
272a0 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09  ed as 0.");.....
272b0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
272c0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a  ENTS_BAD);...}..
272d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
272e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
272f0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
27300 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73   0;...cackey_ses
27310 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27320 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
27330 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
27340 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27350 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
27360 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73  e = 1;..cackey_s
27370 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27380 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
27390 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   = 0;...mutex_re
273a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
273b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
273c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
273d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
273e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
273f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27400 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
27410 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
27420 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
27430 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
27440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27450 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27460 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
27470 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27480 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OK);.}..static i
27490 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31  nt cackey_pkcs11
274a0 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75  _compare_attribu
274b0 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45  tes(CK_ATTRIBUTE
274c0 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54   *a, CK_ATTRIBUT
274d0 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65  E *b) {..unsigne
274e0 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66  d char *smallbuf
274f0 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69  , *largebuf;..si
27500 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  ze_t smallbuf_le
27510 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b  n, largebuf_len;
27520 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21  ...if (a->type !
27530 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72  = b->type) {...r
27540 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43  eturn(0);..}...C
27550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27560 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  TF("    ... foun
27570 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20  d matching type 
27580 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ...");...CACKEY_
27590 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
275a0 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75      ... our valu
275b0 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20  e:", a->pValue, 
275c0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  a->ulValueLen);.
275d0 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20  ..if (b->pValue 
275e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
275f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27600 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
27610 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63  nd wildcard matc
27620 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  h");....return(1
27630 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70  );..}...if (a->p
27640 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
27650 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
27660 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c  .. .if (b->ulVal
27670 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61  ueLen == a->ulVa
27680 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70  lueLen && memcmp
27690 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70  (a->pValue, b->p
276a0 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75  Value, b->ulValu
276b0 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  eLen) == 0) {...
276c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
276d0 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
276e0 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63  found exact matc
276f0 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  h");....return(1
27700 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
27710 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73  a->type) {...cas
27720 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
27730 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65  ..if (a->ulValue
27740 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75  Len == b->ulValu
27750 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61  eLen) {.....brea
27760 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  k;....}.....if (
27770 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20  a->ulValueLen > 
27780 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  b->ulValueLen) {
27790 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20  .....smallbuf = 
277a0 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73  b->pValue;.....s
277b0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d  mallbuf_len = b-
277c0 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09  >ulValueLen;....
277d0 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e  ..largebuf = a->
277e0 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67  pValue;.....larg
277f0 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c  ebuf_len = a->ul
27800 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65  ValueLen;....} e
27810 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62  lse {.....smallb
27820 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a  uf = a->pValue;.
27830 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  ....smallbuf_len
27840 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e   = a->ulValueLen
27850 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20  ;......largebuf 
27860 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = b->pValue;....
27870 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20  .largebuf_len = 
27880 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  b->ulValueLen;..
27890 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c  ..}.....for (; l
278a0 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73  argebuf_len != s
278b0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72  mallbuf_len; lar
278c0 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66  gebuf++,largebuf
278d0 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66  _len--) {.....if
278e0 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d   (largebuf[0] !=
278f0 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   0) {......break
27900 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
27910 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65  .if (largebuf_le
27920 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  n != smallbuf_le
27930 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
27940 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d  ...}.....if (mem
27950 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d  cmp(largebuf, sm
27960 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66  allbuf, smallbuf
27970 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  _len) == 0) {...
27980 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27990 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e  RINTF("       ..
279a0 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d  . found approxim
279b0 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  ate match");....
279c0 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09  ..return(1);....
279d0 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
279e0 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
279f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27a00 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
27a10 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53  Objects)(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 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
27a50 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d  ct, CK_ULONG ulM
27a60 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43  axObjectCount, C
27a70 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
27a80 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73  bjectCount) {..s
27a90 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
27aa0 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
27ab0 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63  .CK_ATTRIBUTE *c
27ac0 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c  urr_attr;..CK_UL
27ad0 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c  ONG curr_id_idx,
27ae0 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78   curr_out_id_idx
27af0 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c  , curr_attr_idx,
27b00 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a   sess_attr_idx;.
27b10 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65  .CK_ULONG matche
27b20 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61  d_count, prev_ma
27b30 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e  tched_count;..in
27b40 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
27b50 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
27b60 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
27b70 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d  TEST..struct tim
27b80 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b  eval start, end;
27b90 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74  ..uint64_t start
27ba0 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23  _int, end_int;.#
27bb0 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
27bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27bd0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27be0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27bf0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27c00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27c10 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
27c20 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27c30 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27c40 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27c50 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a  ..}...if (pulObj
27c60 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  ectCount == NULL
27c70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27c80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27c90 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  .  pulObjectCoun
27ca0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
27cb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
27cc0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
27cd0 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
27ce0 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62   NULL && ulMaxOb
27cf0 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
27d00 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
27d10 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
27d20 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
27d30 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
27d40 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
27d50 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65  ly */...*pulObje
27d60 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ctCount = 0;....
27d70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27d80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27d90 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
27da0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
27db0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
27dc0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
27dd0 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
27de0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
27df0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27e00 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73  or.  phObject is
27e10 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
27e20 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
27e30 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
27e40 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  (ulMaxObjectCoun
27e50 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
27e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27e70 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d  "Error.  Maximum
27e80 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
27e90 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ts specified as 
27ea0 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75  zero.");....retu
27eb0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
27ec0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
27ed0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
27ee0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
27ef0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27f00 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
27f10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
27f20 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
27f30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27f40 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
27f50 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
27f60 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
27f70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27f80 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
27f90 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
27fa0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
27fb0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
27fc0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
27fd0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
27fe0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27ff0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
28000 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
28010 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28020 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
28030 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
28040 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
28050 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
28060 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28070 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
28080 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28090 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
280a0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
280b0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
280c0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
280d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
280e0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
280f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28100 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
28110 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
28120 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28130 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
28140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28150 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
28160 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
28170 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28180 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
28190 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
281a0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
281b0 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
281c0 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64  TEST..gettimeofd
281d0 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29  ay(&start, NULL)
281e0 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f  ;.#endif...curr_
281f0 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a  out_id_idx = 0;.
28200 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64  .for (curr_id_id
28210 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x = cackey_sessi
28220 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
28230 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75  arch_curr_id; cu
28240 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b  rr_id_idx < cack
28250 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28260 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
28270 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f  _count && ulMaxO
28280 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72  bjectCount; curr
28290 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63  _id_idx++) {...c
282a0 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79  urr_id = &cackey
282b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
282c0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63  on].identities[c
282d0 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09  urr_id_idx];....
282e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
282f0 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20  NTF("Processing 
28300 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28  identity:%lu", (
28310 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
28320 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
28330 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20  matched_count = 
28340 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f  0;....for (curr_
28350 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75  attr_idx = 0; cu
28360 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61  rr_attr_idx < ca
28370 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28380 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
28390 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72  uery_count; curr
283a0 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
283b0 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63  ..prev_matched_c
283c0 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63  ount = matched_c
283d0 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61  ount;.....curr_a
283e0 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ttr = &cackey_se
283f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28400 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75  .search_query[cu
28410 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  rr_attr_idx];...
28420 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28430 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e  RINTF("  Checkin
28440 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
28450 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20  %s (0x%08lx) in 
28460 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c  identity:%i...",
28470 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
28480 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f  NC_ATTRIBUTE_TO_
28490 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74  STR(curr_attr->t
284a0 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ype), (unsigned 
284b0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
284c0 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72  >type, (int) cur
284d0 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41  r_id_idx);....CA
284e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
284f0 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c  BUF("    Value l
28500 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75  ooking for:", cu
28510 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
28520 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61   curr_attr->ulVa
28530 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72  lueLen);.....for
28540 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
28550 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
28560 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74  dx < curr_id->at
28570 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
28580 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
28590 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65   {.....if (cacke
285a0 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65  y_pkcs11_compare
285b0 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75 72  _attributes(&cur
285c0 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
285d0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c  [sess_attr_idx],
285e0 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09   curr_attr)) {..
285f0 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
28600 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t++;.......break
28610 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
28620 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69  ./* If the attri
28630 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  bute could not b
28640 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f  e matched, do no
28650 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61  t try to match a
28660 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62  dditional attrib
28670 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70  utes */....if (p
28680 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
28690 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  t == matched_cou
286a0 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  nt) {.....break;
286b0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
286c0 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  (matched_count =
286d0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
286e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
286f0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20  ch_query_count) 
28700 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
28710 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
28720 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65  All %i attribute
28730 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
28740 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e  und, adding iden
28750 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72  tity:%i to retur
28760 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29  ned list", (int)
28770 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
28780 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
28790 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
287a0 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
287b0 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b  );.....phObject[
287c0 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d  curr_out_id_idx]
287d0 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b   = curr_id_idx +
287e0 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a   1;.....ulMaxObj
287f0 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09  ectCount--;.....
28800 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b  curr_out_id_idx+
28810 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  +;...} else {...
28820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28830 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20  INTF("  ... Not 
28840 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75  all %i (only fou
28850 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65  nd %i) attribute
28860 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
28870 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20  und, not adding 
28880 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69  identity:%i", (i
28890 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  nt) cackey_sessi
288a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
288b0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
288c0 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f  , (int) matched_
288d0 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72  count, (int) cur
288e0 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09  r_id_idx);...}..
288f0 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  }..cackey_sessio
28900 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
28910 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75  rch_curr_id = cu
28920 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c  rr_id_idx;..*pul
28930 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75  ObjectCount = cu
28940 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a  rr_out_id_idx;..
28950 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
28960 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
28970 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64  TEST..gettimeofd
28980 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a  ay(&end, NULL);.
28990 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74  .start_int = (st
289a0 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30  art.tv_sec * 100
289b0 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76  0000) + start.tv
289c0 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20  _usec;..end_int 
289d0 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20  = (end.tv_sec * 
289e0 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74  1000000) + end.t
289f0 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66  v_usec;..fprintf
28a00 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63 68  (stderr, "Search
28a10 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73   took %lu micros
28a20 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69  econds\n", (unsi
28a30 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f  gned long) (end_
28a40 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29  int - start_int)
28a50 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65  );.#endif...mute
28a60 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28a70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28a80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28a90 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
28aa0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
28ab0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28ac0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
28ad0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28ae0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28af0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28b00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28b10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28b20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d  CKR_OK (%i), num
28b30 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c   objects = %lu",
28b40 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a   CKR_OK, *pulObj
28b50 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ectCount);...ret
28b60 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
28b70 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
28b80 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
28b90 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b  ObjectsFinal)(CK
28ba0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
28bb0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f  hSession) {..CK_
28bc0 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
28bd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
28be0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28bf0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
28c00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
28c10 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
28c20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28c30 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
28c40 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
28c50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
28c60 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
28c70 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
28c80 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
28c90 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
28ca0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
28cb0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
28cc0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28cd0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
28ce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28cf0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
28d00 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
28d10 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28d20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
28d30 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
28d40 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28d50 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
28d60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28d70 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
28d80 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
28d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28da0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
28db0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
28dc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28dd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28de0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28df0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
28e00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
28e10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28e20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28e30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28e40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28e50 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
28e60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
28e70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28e80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28e90 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
28ea0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28eb0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
28ec0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28ed0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28ee0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28ef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28f00 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
28f10 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
28f20 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28f30 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
28f40 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
28f50 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
28f60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
28f70 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
28f80 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
28f90 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
28fa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28fb0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
28fc0 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
28fd0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
28fe0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
28ff0 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
29000 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65  Value) {....free
29010 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
29020 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
29030 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
29040 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  lue);...}..}...i
29050 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
29060 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
29070 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66  rch_query) {...f
29080 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
29090 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
290a0 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a  arch_query);..}.
290b0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
290c0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
290d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
290e0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
290f0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
29100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29110 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
29120 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
29130 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29140 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
29150 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29160 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29170 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
29180 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
29190 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
291a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
291b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
291c0 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
291d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
291e0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
291f0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
29200 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
29210 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
29220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29230 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
29240 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
29250 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
29260 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29270 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
29280 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
29290 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
292a0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
292b0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
292c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
292d0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
292e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
292f0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
29300 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29310 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
29320 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
29330 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29340 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
29350 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
29360 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ncrypt)(CK_SESSI
29370 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29380 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
29390 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
293a0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
293b0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
293c0 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dData, CK_ULONG_
293d0 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
293e0 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
293f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29400 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29410 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29420 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29440 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29450 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29460 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29470 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29480 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
294a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
294b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
294c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
294d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
294e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
294f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
29500 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
29510 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29520 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
29530 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
29540 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
29550 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
29560 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
29570 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
29580 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
29590 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
295a0 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
295b0 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
295c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
295d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
295e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
295f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
29600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29610 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
29620 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
29630 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
29640 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
29650 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
29660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29670 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29680 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29690 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
296a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
296b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
296c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
296d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
296e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
296f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
29700 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _EncryptFinal)(C
29710 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29720 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
29730 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72  TE_PTR pLastEncr
29740 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
29750 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45  ONG_PTR pulLastE
29760 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
29770 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
29780 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
29790 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
297a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
297b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
297c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
297d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
297e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
297f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
29800 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
29810 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29820 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
29830 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29840 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
29850 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
29860 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29870 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
29880 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29890 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
298a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
298b0 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74  V, C_DecryptInit
298c0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
298d0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
298e0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
298f0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
29900 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
29910 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
29920 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b  etval;...hKey--;
29930 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29940 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29950 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29960 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29970 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29980 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29990 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
299a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
299b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
299c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
299d0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20  .if (pMechanism 
299e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
299f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29a00 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
29a10 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ism is NULL.");.
29a20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
29a30 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
29a40 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
29a50 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
29a60 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a  CKM_RSA_PKCS) {.
29a70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29a80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
29a90 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
29aa0 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65  ism not specifie
29ab0 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  d as CKM_RSA_PKC
29ac0 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
29ad0 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
29ae0 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
29af0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
29b00 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
29b10 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
29b20 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
29b30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
29b40 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
29b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29b60 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
29b70 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
29b80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
29b90 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
29ba0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
29bb0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
29bc0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
29bd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29be0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
29bf0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
29c00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29c10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
29c20 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
29c30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
29c40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
29c50 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
29c60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29c70 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
29c80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29c90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29ca0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
29cb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29cc0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
29cd0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
29ce0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
29cf0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
29d00 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
29d10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29d20 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
29d30 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
29d40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29d50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29d60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29d70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29d80 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20  Decrypt already 
29d90 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
29da0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
29db0 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
29dc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
29dd0 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
29de0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
29df0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
29e00 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
29e10 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29e20 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
29e30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29e40 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
29e50 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
29e60 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
29e70 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
29e80 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
29e90 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
29ea0 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
29eb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
29ec0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29ed0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
29ee0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
29ef0 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
29f00 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
29f10 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29f20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
29f30 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ypt_active = 1;.
29f40 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29f50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
29f60 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ypt_mechanism = 
29f70 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
29f80 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73  anism;..cackey_s
29f90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29fa0 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
29fb0 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  arm = pMechanism
29fc0 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63  ->pParameter;..c
29fd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29fe0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
29ff0 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20  _mech_parmlen = 
2a000 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61  pMechanism->ulPa
2a010 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63  rameterLen;..cac
2a020 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a030 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
2a040 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
2a050 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a060 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
2a070 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
2a080 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2a090 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2a0a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2a0b0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2a0c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a0d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a0e0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2a0f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2a100 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2a110 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2a120 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a130 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2a140 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2a150 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2a160 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2a170 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2a180 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b  V, C_Decrypt)(CK
2a190 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2a1a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2a1b0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2a1c0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
2a1d0 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
2a1e0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2a1f0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
2a200 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
2a210 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c  ..CK_ULONG datal
2a220 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c  en_update, datal
2a230 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56  en_final;..CK_RV
2a240 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69   decrypt_ret;..i
2a250 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2a260 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a270 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2a280 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2a290 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2a2a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a2b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2a2c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2a2d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a2e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2a2f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a300 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20  .if (pulDataLen 
2a310 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2a320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a330 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61  ("Error. pulData
2a340 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2a350 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2a360 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2a370 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  ...datalen_updat
2a380 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b  e = *pulDataLen;
2a390 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
2a3a0 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
2a3b0 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72  (hSession, pEncr
2a3c0 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63  yptedData, ulEnc
2a3d0 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70  ryptedDataLen, p
2a3e0 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75  Data, &datalen_u
2a3f0 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63  pdate);..if (dec
2a400 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
2a410 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
2a420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a430 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 61  or.  DecryptUpda
2a440 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  te() returned fa
2a450 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
2a460 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2a470 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29  ng) decrypt_ret)
2a480 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 74  ;....if (decrypt
2a490 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46  _ret != CKR_BUFF
2a4a0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
2a4b0 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
2a4c0 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61  decryption opera
2a4d0 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65  tion */.....mute
2a4e0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2a4f0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2a500 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
2a510 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2a520 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
2a530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a540 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2a550 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2a560 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2a570 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
2a580 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
2a590 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a5a0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2a5b0 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2a5c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a5d0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
2a5e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a5f0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2a600 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2a610 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
2a620 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2a630 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09  LE_INVALID);....
2a640 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
2a650 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a660 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
2a670 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
2a680 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2a690 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2a6a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2a6b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a6c0 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
2a6d0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
2a6e0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2a6f0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2a700 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  IZED);....}.....
2a710 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a720 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2a730 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  t_active = 0;...
2a740 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2a750 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2a760 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2a770 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
2a780 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2a790 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
2a7a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a7b0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2a7c0 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
2a7d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2a7e0 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d  ERROR);....}...}
2a7f0 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
2a800 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66  pt_ret);..}...if
2a810 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61   (pData) {...pDa
2a820 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70  ta += datalen_up
2a830 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65  date;..}..datale
2a840 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61  n_final = *pulDa
2a850 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f  taLen - datalen_
2a860 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70  update;...decryp
2a870 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70  t_ret = C_Decryp
2a880 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c  tFinal(hSession,
2a890 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e   pData, &datalen
2a8a0 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65  _final);..if (de
2a8b0 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
2a8c0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
2a8d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a8e0 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e  ror.  DecryptFin
2a8f0 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  al() returned fa
2a900 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
2a910 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2a920 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29  ng) decrypt_ret)
2a930 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72  ;....return(decr
2a940 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a  ypt_ret);..}...*
2a950 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74  pulDataLen = dat
2a960 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61  alen_update + da
2a970 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43  talen_final;...C
2a980 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a990 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a9a0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2a9b0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2a9c0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2a9d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2a9e0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64  RV, C_DecryptUpd
2a9f0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2aa00 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2aa10 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2aa20 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2aa30 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
2aa40 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
2aa50 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2aa60 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
2aa70 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  tLen) {..static 
2aa80 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38  CK_BYTE buf[1638
2aa90 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66  4];..ssize_t buf
2aaa0 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  len;..CK_SLOT_ID
2aab0 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20   slotID;..CK_RV 
2aac0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2aad0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
2aae0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2aaf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ab00 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2ab10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2ab20 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2ab30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ab40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2ab50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ab60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ab70 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ab80 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2ab90 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2aba0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2abb0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2abc0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2abd0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2abe0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2abf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ac00 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2ac10 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2ac20 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2ac30 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2ac40 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2ac50 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
2ac60 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
2ac70 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2ac80 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
2ac90 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
2aca0 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64  e are asked to d
2acb0 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e  ecrypt nothing..
2acc0 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  . */...CACKEY_DE
2acd0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2ace0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2acf0 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
2ad00 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
2ad10 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2ad20 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70  .}...if (pEncryp
2ad30 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29  tedPart == NULL)
2ad40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ad50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ad60 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20   pEncryptedPart 
2ad70 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45  is NULL, but ulE
2ad80 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2ad90 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
2ada0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2adb0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2adc0 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50  if (ulEncryptedP
2add0 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
2ade0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2adf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45  INTF("Error. ulE
2ae00 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2ae10 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
2ae20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
2ae30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2ae40 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2ae50 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65  ...if (pulPartLe
2ae60 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
2ae70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ae80 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61  TF("Error. pulPa
2ae90 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  rtLen is NULL.")
2aea0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2aeb0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2aec0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2aed0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2aee0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2aef0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2af00 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2af10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2af20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2af30 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2af40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2af50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2af60 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2af70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2af80 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2af90 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2afa0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2afb0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2afc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2afd0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2afe0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2aff0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2b000 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2b010 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
2b020 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b030 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2b040 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
2b050 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2b060 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2b070 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2b080 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b090 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
2b0a0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2b0b0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2b0c0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2b0d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  ZED);..}...slotI
2b0e0 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
2b0f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
2b100 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
2b110 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
2b120 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2b130 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
2b140 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
2b150 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2b160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b170 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
2b180 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
2b190 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
2b1a0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
2b1b0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
2b1c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2b1d0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
2b1e0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2b1f0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
2b200 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b210 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
2b220 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
2b230 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
2b240 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
2b250 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
2b260 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
2b270 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b280 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
2b290 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2b2a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69  ERROR);..}...swi
2b2b0 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
2b2c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2b2d0 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
2b2e0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
2b2f0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
2b300 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79  sk card to decry
2b310 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20  pt */....buflen 
2b320 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
2b330 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
2b340 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
2b350 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b360 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
2b370 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74  entity, pEncrypt
2b380 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70  edPart, ulEncryp
2b390 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c  tedPartLen, buf,
2b3a0 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c   sizeof(buf), 0,
2b3b0 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66   1);.....if (buf
2b3c0 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2b3d0 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26  SC_E_NEEDLOGIN &
2b3e0 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  & cackey_pin_com
2b3f0 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
2b400 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e  ....if (_C_Login
2b410 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f  MutexArg(hSessio
2b420 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c  n, CKU_USER, NUL
2b430 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f  L, 0, 0) == CKR_
2b440 4f 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c 65  OK) {......bufle
2b450 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
2b460 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
2b470 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
2b480 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b490 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2b4a0 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79  identity, pEncry
2b4b0 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72  ptedPart, ulEncr
2b4c0 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75  yptedPartLen, bu
2b4d0 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20  f, sizeof(buf), 
2b4e0 30 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09  0, 1);.....}....
2b4f0 7d 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  }.....if (buflen
2b500 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44   < 0) {...../* D
2b510 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64  ecryption failed
2b520 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66  . */.....if (buf
2b530 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2b540 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
2b550 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2b560 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
2b570 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
2b580 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  se if (buflen ==
2b590 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
2b5a0 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
2b5b0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2b5c0 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a  DEVICE_REMOVED;.
2b5d0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
2b5e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b5f0 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
2b600 20 73 65 6e 64 20 41 50 44 55 2c 20 65 72 72 6f   send APDU, erro
2b610 72 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e 67 20  r = %li", (long 
2b620 69 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  int) buflen);...
2b630 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2b640 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
2b650 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
2b660 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
2b670 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a  ong) buflen) > *
2b680 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50  pulPartLen && pP
2b690 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65  art) {...../* De
2b6a0 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f  crypted data too
2b6b0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65   large */.....re
2b6c0 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
2b6d0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
2b6e0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20  } else {.....if 
2b6f0 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d  (pPart) {......m
2b700 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66  emcpy(pPart, buf
2b710 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d  , buflen);.....}
2b720 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65  ......*pulPartLe
2b730 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09  n = buflen;.....
2b740 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
2b750 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
2b760 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2b770 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2b780 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2b790 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2b7a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2b7b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2b7c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b7d0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2b7e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2b7f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2b800 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
2b810 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b820 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
2b830 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
2b840 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
2b850 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2b860 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2b870 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  DecryptFinal)(CK
2b880 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2b890 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2b8a0 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c  E_PTR pLastPart,
2b8b0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2b8c0 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a  lLastPartLen) {.
2b8d0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2b8e0 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  l;..int terminat
2b8f0 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a  e_decrypt = 1;..
2b900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b910 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b920 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b930 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b950 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2b960 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2b970 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2b980 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2b990 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2b9a0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2b9b0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2b9c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2b9d0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2b9e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2b9f0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2ba00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ba10 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2ba20 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2ba30 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2ba40 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2ba50 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2ba60 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c  if (pulLastPartL
2ba70 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
2ba80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ba90 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c  NTF("Error. pulL
2baa0 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55  astPartLen is NU
2bab0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2bac0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2bad0 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
2bae0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2baf0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2bb00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2bb10 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2bb20 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2bb30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2bb40 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2bb50 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2bb60 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2bb70 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2bb80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bb90 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2bba0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2bbb0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2bbc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2bbd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bbe0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2bbf0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2bc00 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2bc10 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2bc20 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2bc30 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2bc40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2bc50 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
2bc60 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2bc70 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2bc80 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2bc90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bca0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
2bcb0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2bcc0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2bcd0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2bce0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2bcf0 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  *pulLastPartLen 
2bd00 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74  = 0;...if (pLast
2bd10 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
2bd20 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  ..terminate_decr
2bd30 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ypt = 0;..}...if
2bd40 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72   (terminate_decr
2bd50 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ypt) {...cackey_
2bd60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2bd70 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2bd80 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
2bd90 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2bda0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2bdb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2bdc0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2bdd0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2bde0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bdf0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2be00 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2be10 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2be20 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2be30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2be40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2be50 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2be60 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2be70 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2be80 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2be90 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e  K_RV, C_DigestIn
2bea0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2beb0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2bec0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2bed0 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09   pMechanism) {..
2bee0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bef0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2bf00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2bf10 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2bf20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bf30 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2bf40 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2bf50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2bf60 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2bf70 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2bf80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bf90 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2bfa0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2bfb0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2bfc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2bfd0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2bfe0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2bff0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c000 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c010 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c020 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53  _Digest)(CK_SESS
2c030 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2c040 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2c050 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2c060 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2c070 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
2c080 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2c090 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
2c0a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c0b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c0c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c0d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c0e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c0f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c100 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c110 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c120 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c130 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2c140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c150 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2c160 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c170 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2c180 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c190 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2c1a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2c1b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2c1c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2c1d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2c1e0 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
2c1f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c200 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2c210 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2c220 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
2c230 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2c240 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2c250 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2c260 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2c270 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c280 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c290 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2c2a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c2b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2c2c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2c2d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c2e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2c2f0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2c300 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2c310 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2c320 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2c330 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2c340 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c350 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2c360 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2c370 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28  V, C_DigestKey)(
2c380 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c390 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
2c3a0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2c3b0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2c3c0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2c3d0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2c3e0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2c3f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c400 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c410 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2c420 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2c430 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2c440 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2c450 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2c460 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2c470 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2c480 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2c490 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2c4a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c4b0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2c4c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c4d0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2c4e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2c4f0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e  _RV, C_DigestFin
2c500 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
2c510 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2c520 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67  CK_BYTE_PTR pDig
2c530 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  est, CK_ULONG_PT
2c540 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20  R pulDigestLen) 
2c550 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2c560 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2c570 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2c580 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2c590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c5a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2c5b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2c5c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c5d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2c5e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2c5f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c600 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2c610 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c620 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2c630 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2c640 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2c650 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2c660 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c670 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2c680 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2c690 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b  , C_SignInit)(CK
2c6a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c6b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2c6c0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2c6d0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2c6e0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2c6f0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2c700 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
2c710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c720 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c730 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c740 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c760 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c770 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c780 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c790 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c7a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2c7b0 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
2c7c0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2c7d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c7e0 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
2c7f0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2c800 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2c810 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2c820 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
2c830 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
2c840 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41  RSA_PKCS) {...CA
2c850 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c860 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
2c870 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
2c880 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
2c890 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b   CKM_RSA_PKCS");
2c8a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
2c8b0 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
2c8c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2c8d0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2c8e0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2c8f0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2c900 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2c910 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c920 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2c930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c940 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2c950 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2c960 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c970 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2c980 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
2c990 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2c9a0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2c9b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c9c0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2c9d0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2c9e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c9f0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2ca00 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2ca10 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2ca20 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2ca30 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2ca40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2ca50 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2ca60 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2ca70 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2ca80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ca90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2caa0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2cab0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2cac0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2cad0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2cae0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2caf0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cb00 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
2cb10 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2cb20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2cb30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2cb40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cb50 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c  "Error.  Sign al
2cb60 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
2cb70 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
2cb80 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2cb90 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
2cba0 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
2cbb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cbc0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2cbd0 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
2cbe0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2cbf0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2cc00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cc10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
2cc20 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
2cc30 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65   range (requeste
2cc40 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20  d key %lu, only 
2cc50 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61  %lu identities a
2cc60 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e  vailable).", (un
2cc70 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
2cc80 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
2cc90 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  g) cackey_sessio
2cca0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2ccb0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
2ccc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
2ccd0 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
2cce0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
2ccf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cd00 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
2cd10 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  1;...cackey_sess
2cd20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2cd30 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ign_mechanism = 
2cd40 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
2cd50 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f  anism;...cackey_
2cd60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cd70 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d  n].sign_buflen =
2cd80 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65   128;..cackey_se
2cd90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cda0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
2cdb0 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  0;..cackey_sessi
2cdc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2cdd0 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  gn_buf = malloc(
2cde0 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73  sizeof(*cackey_s
2cdf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2ce00 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61  ].sign_buf) * ca
2ce10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ce20 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2ce30 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  len);...CACKEY_D
2ce40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73  EBUG_PRINTF("Ses
2ce50 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64  sion %lu sign_id
2ce60 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64  entity is %p (id
2ce70 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28  entity #%lu)", (
2ce80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
2ce90 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a  Session, (void *
2cea0 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ) &cackey_sessio
2ceb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2cec0 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28  ntities[hKey], (
2ced0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
2cee0 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65  Key);..cackey_se
2cef0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cf00 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d  .sign_identity =
2cf10 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
2cf20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2cf30 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09  tities[hKey];...
2cf40 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2cf50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2cf60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2cf70 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2cf80 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2cf90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cfa0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2cfb0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2cfc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2cfd0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2cfe0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2cff0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2d000 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2d010 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
2d020 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
2d030 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2d040 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2d050 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d060 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d070 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2d080 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2d090 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2d0a0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2d0b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
2d0c0 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e  natureLen) {..un
2d0d0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72  signed long star
2d0e0 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  t_sign_bufused;.
2d0f0 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b  .CK_RV sign_ret;
2d100 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2d110 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
2d120 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2d130 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2d140 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2d150 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d160 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d170 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2d180 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d190 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2d1a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d1b0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
2d1c0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
2d1d0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
2d1e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
2d1f0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2d200 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
2d210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d220 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2d230 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
2d240 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
2d250 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2d260 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2d270 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f  .}...start_sign_
2d280 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79  bufused = cackey
2d290 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d2a0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2d2b0 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43  ;...sign_ret = C
2d2c0 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73  _SignUpdate(hSes
2d2d0 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44  sion, pData, ulD
2d2e0 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ataLen);..if (si
2d2f0 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
2d300 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d310 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d320 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20  .  SignUpdate() 
2d330 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
2d340 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
2d350 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
2d360 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20  ign_ret);....if 
2d370 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
2d380 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2d390 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65  L) {....mutex_re
2d3a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2d3b0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2d3c0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
2d3d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2d3e0 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
2d3f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d400 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2d410 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2d420 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2d430 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a  L_ERROR);....}..
2d440 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2d450 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d460 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
2d470 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2d480 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2d490 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
2d4a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d4b0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2d4c0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2d4d0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2d4e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2d4f0 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09  NVALID);....}...
2d500 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2d510 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d520 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
2d530 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2d540 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2d550 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
2d560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d570 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
2d580 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2d590 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2d5a0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2d5b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09  NITIALIZED);....
2d5c0 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  }.....cackey_ses
2d5d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d5e0 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b  sign_active = 0;
2d5f0 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  .....mutex_retva
2d600 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2d610 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2d620 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
2d630 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2d640 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
2d650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d660 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2d670 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
2d680 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2d690 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
2d6a0 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  ..}....return(si
2d6b0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69  gn_ret);..}...si
2d6c0 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46  gn_ret = C_SignF
2d6d0 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
2d6e0 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69  Signature, pulSi
2d6f0 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66  gnatureLen);..if
2d700 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
2d710 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69  R_OK) {...if (si
2d720 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55  gn_ret == CKR_BU
2d730 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
2d740 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
2d750 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69  G_PRINTF("SignFi
2d760 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43  nal() returned C
2d770 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2d780 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20  ALL (rv = %lu), 
2d790 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70  undoing C_SignUp
2d7a0 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e  date()", (unsign
2d7b0 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
2d7c0 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  t);.....cackey_s
2d7d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d7e0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
2d7f0 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
2d800 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  sed;.....return(
2d810 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a  sign_ret);...}..
2d820 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d830 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2d840 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72  ignFinal() retur
2d850 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
2d860 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
2d870 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
2d880 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73  et);....return(s
2d890 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69  ign_ret);..}...i
2d8a0 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d  f (pSignature ==
2d8b0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2d8c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d8d0 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 69  pSignature speci
2d8e0 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e  fied as NULL, un
2d8f0 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61  doing C_SignUpda
2d900 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65  te()");....cacke
2d910 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2d920 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2d930 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62  d = start_sign_b
2d940 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72  ufused;....retur
2d950 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a  n(sign_ret);..}.
2d960 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d970 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2d980 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2d990 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2d9a0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2d9b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2d9c0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64  CK_RV, C_SignUpd
2d9d0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2d9e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2d9f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2da00 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2da10 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d  artLen) {..int m
2da20 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2da30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2da40 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2da50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2da60 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2da70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2da80 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2da90 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2daa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2dab0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2dac0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2dad0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2dae0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2daf0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2db00 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2db10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2db20 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2db30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2db40 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2db50 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2db60 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2db70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2db80 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2db90 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20   (pPart == NULL 
2dba0 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  && ulPartLen == 
2dbb0 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
2dbc0 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
2dbd0 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20  e asked to sign 
2dbe0 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
2dbf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dc00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2dc10 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
2dc20 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
2dc30 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
2dc40 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
2dc50 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (pPart == NULL)
2dc60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2dc70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2dc80 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20   pPart is NULL, 
2dc90 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  but ulPartLen is
2dca0 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
2dcb0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2dcc0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2dcd0 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30   (ulPartLen == 0
2dce0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2dcf0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2dd00 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30  . ulPartLen is 0
2dd10 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
2dd20 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
2dd30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2dd40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
2dd50 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2dd60 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2dd70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2dd80 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2dd90 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2dda0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ddb0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2ddc0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2ddd0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2dde0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2ddf0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2de00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2de10 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2de20 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2de30 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2de40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2de50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2de60 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2de70 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2de80 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2de90 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2dea0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2deb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2dec0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
2ded0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2dee0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2def0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2df00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2df10 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
2df20 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2df30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2df40 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2df50 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
2df60 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
2df70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2df80 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
2df90 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
2dfa0 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63  A_PKCS:..../* Ac
2dfb0 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c  cumulate directl
2dfc0 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63  y */....if ((cac
2dfd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2dfe0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2dff0 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29  sed + ulPartLen)
2e000 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   > cackey_sessio
2e010 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2e020 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09  n_buflen) {.....
2e030 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e040 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2e050 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09  uflen *= 2;.....
2e060 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2e070 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2e080 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61  buf = realloc(ca
2e090 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2e0a0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2e0b0 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  , sizeof(*cackey
2e0c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e0d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20  on].sign_buf) * 
2e0e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e0f0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2e100 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09  uflen);....}....
2e110 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
2e120 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e130 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63  ].sign_buf + cac
2e140 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e150 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2e160 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61  sed, pPart, ulPa
2e170 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b  rtLen);.....cack
2e180 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e190 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2e1a0 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b  ed += ulPartLen;
2e1b0 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
2e1c0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2e1d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2e1e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e1f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2e200 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2e210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e220 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2e230 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2e240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e250 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2e260 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2e270 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2e280 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2e290 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2e2a0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2e2b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e2c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2e2d0 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  nFinal)(CK_SESSI
2e2e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e2f0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2e300 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2e310 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
2e320 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61  atureLen) {..sta
2e330 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62  tic CK_BYTE sigb
2e340 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65  uf[1024];..ssize
2e350 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43  _t sigbuflen;..C
2e360 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
2e370 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
2e380 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
2e390 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  ROR;..int termin
2e3a0 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69  ate_sign = 1;..i
2e3b0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2e3c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e3d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2e3e0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2e3f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2e400 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e410 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2e420 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2e430 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e440 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2e450 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2e460 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72  .if (pulSignatur
2e470 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  eLen == NULL) {.
2e480 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e490 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
2e4a0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73  lSignatureLen is
2e4b0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2e4c0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2e4d0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2e4e0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2e4f0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2e500 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2e510 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2e520 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e530 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2e540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e550 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2e560 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2e570 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2e580 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2e590 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2e5a0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2e5b0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2e5c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2e5d0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2e5e0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2e5f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e600 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2e610 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2e620 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2e630 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2e640 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2e650 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2e660 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2e670 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2e680 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2e690 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e6a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2e6b0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2e6c0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2e6d0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2e6e0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2e6f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2e700 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e710 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
2e720 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2e730 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2e740 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2e750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e760 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
2e770 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2e780 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2e790 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2e7a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c  ALIZED);..}...sl
2e7b0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
2e7c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e7d0 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
2e7e0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
2e7f0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
2e800 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
2e810 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
2e820 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
2e830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e840 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
2e850 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
2e860 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
2e870 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
2e880 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
2e890 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2e8a0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2e8b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2e8c0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
2e8d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e8e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e8f0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
2e900 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
2e910 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
2e920 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
2e930 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
2e940 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2e950 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2e960 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2e970 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2e980 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
2e990 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e9a0 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
2e9b0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
2e9c0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
2e9d0 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20  sk card to sign 
2e9e0 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  */....CACKEY_DEB
2e9f0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e  UG_PRINTF("Askin
2ea00 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69  g to sign from i
2ea10 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65  dentity %p in se
2ea20 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69  ssion %lu", (voi
2ea30 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73  d *) cackey_sess
2ea40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ea50 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75  ign_identity, (u
2ea60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
2ea70 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62  ession);....sigb
2ea80 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
2ea90 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
2eaa0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2eab0 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
2eac0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2ead0 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65  _identity, cacke
2eae0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2eaf0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63  ion].sign_buf, c
2eb00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2eb10 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2eb20 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73  fused, sigbuf, s
2eb30 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31  izeof(sigbuf), 1
2eb40 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69  , 0);.....if (si
2eb50 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  gbuflen == CACKE
2eb60 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
2eb70 49 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e  IN && cackey_pin
2eb80 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
2eb90 29 20 7b 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c  ) {.....if (_C_L
2eba0 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65  oginMutexArg(hSe
2ebb0 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c  ssion, CKU_USER,
2ebc0 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20   NULL, 0, 0) == 
2ebd0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73  CKR_OK) {......s
2ebe0 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  igbuflen = cacke
2ebf0 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
2ec00 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2ec10 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ID], cackey_sess
2ec20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ec30 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61  ign_identity, ca
2ec40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ec50 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2ec60 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
2ec70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2ec80 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66  _bufused, sigbuf
2ec90 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29  , sizeof(sigbuf)
2eca0 2c 20 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09  , 1, 0);.....}..
2ecb0 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62  ..}.....if (sigb
2ecc0 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
2ecd0 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
2ece0 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ed. */.....if (s
2ecf0 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
2ed00 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
2ed10 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76  GIN) {......retv
2ed20 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  al = CKR_USER_NO
2ed30 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09  T_LOGGED_IN;....
2ed40 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62  .} else if (sigb
2ed50 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2ed60 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
2ed70 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  NT) {......retva
2ed80 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  l = CKR_DEVICE_R
2ed90 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c  EMOVED;.....} el
2eda0 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  se {......retval
2edb0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2edc0 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  RROR;.....}....}
2edd0 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69   else if (((unsi
2ede0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
2edf0 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e  flen) > *pulSign
2ee00 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67  atureLen && pSig
2ee10 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a  nature) {...../*
2ee20 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f   Signed data too
2ee30 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41   large */.....CA
2ee40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ee50 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  F("retval = CKR_
2ee60 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2ee70 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25  ;  sigbuflen = %
2ee80 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  lu, pulSignature
2ee90 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  Len = %lu", (uns
2eea0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
2eeb0 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64  uflen, (unsigned
2eec0 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61   long) *pulSigna
2eed0 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72  tureLen);......r
2eee0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2eef0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09  ER_TOO_SMALL;...
2ef00 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
2ef10 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65  n = 0;....} else
2ef20 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65   {.....terminate
2ef30 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09  _sign = 0;......
2ef40 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20  if (pSignature) 
2ef50 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53  {......memcpy(pS
2ef60 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66  ignature, sigbuf
2ef70 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09  , sigbuflen);...
2ef80 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
2ef90 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  gn = 1;.....}...
2efa0 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  ...*pulSignature
2efb0 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b  Len = sigbuflen;
2efc0 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2efd0 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09  KR_OK;....}.....
2efe0 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28  break;..}...if (
2eff0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20  terminate_sign) 
2f000 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
2f010 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f020 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09  ].sign_buf) {...
2f030 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
2f040 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f050 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a  sign_buf);...}..
2f060 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2f070 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2f080 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  _active = 0;..}.
2f090 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2f0a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2f0b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2f0c0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2f0d0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2f0e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f0f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2f100 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2f110 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2f120 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2f130 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f140 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f150 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
2f160 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
2f170 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
2f180 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2f190 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
2f1a0 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
2f1b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2f1c0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2f1d0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2f1e0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2f1f0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2f200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f210 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2f220 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2f230 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2f240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f250 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2f260 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2f270 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2f280 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2f290 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2f2a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f2b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2f2c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f2d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2f2e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f2f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2f300 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f310 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f320 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f330 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f340 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f  SignRecover)(CK_
2f350 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2f360 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2f370 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
2f380 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
2f390 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2f3a0 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2f3b0 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
2f3c0 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2f3d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f3e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f3f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f400 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f410 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f420 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f430 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f440 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f450 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f460 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f470 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f480 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f490 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f4a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f4b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f4c0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f4d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f4e0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f4f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f500 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2f510 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
2f520 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2f530 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2f540 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2f550 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2f560 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2f570 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f580 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f590 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f5a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f5b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f5c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f5d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f5e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f5f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f600 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f610 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f620 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f630 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f640 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f650 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f660 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f670 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f680 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f690 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f6a0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2f6b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2f6c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2f6d0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2f6e0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2f6f0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2f700 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2f710 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
2f720 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2f730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f740 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f750 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f760 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f780 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f790 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f7a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f7b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f7c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f7d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f7e0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f7f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f800 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f810 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f820 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f830 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f840 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f850 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f860 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2f870 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2f880 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2f890 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2f8a0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2f8b0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
2f8c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f8d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2f8e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2f8f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2f900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f910 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2f920 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2f930 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2f940 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2f950 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2f960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f970 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2f980 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f990 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2f9a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2f9b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2f9c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2f9d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2f9e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2f9f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
2fa00 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53  erifyFinal)(CK_S
2fa10 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2fa20 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2fa30 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
2fa40 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
2fa50 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
2fa60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fa70 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2fa80 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2fa90 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2faa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fab0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2fac0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2fad0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2fae0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2faf0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2fb00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2fb10 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2fb20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2fb30 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2fb40 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2fb50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2fb60 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2fb70 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2fb80 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2fb90 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2fba0 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ifyRecoverInit)(
2fbb0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2fbc0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2fbd0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2fbe0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2fbf0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2fc00 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2fc10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2fc20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2fc30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2fc40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fc50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2fc60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2fc70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2fc80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2fc90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2fca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fcb0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2fcc0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2fcd0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2fce0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2fcf0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2fd00 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2fd10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fd20 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2fd30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2fd40 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
2fd50 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
2fd60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2fd70 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
2fd80 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
2fd90 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20  ulSignatureLen, 
2fda0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2fdb0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
2fdc0 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
2fdd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fde0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2fdf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2fe00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2fe10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fe20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2fe30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2fe40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2fe50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2fe60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2fe70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fe80 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2fe90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2fea0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2feb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fec0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2fed0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2fee0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2fef0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ff00 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2ff10 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
2ff20 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2ff30 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2ff40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2ff50 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2ff60 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2ff70 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2ff80 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2ff90 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
2ffa0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2ffb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2ffc0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2ffd0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2ffe0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2fff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30000 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
30010 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
30020 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
30030 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
30040 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
30050 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
30060 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
30070 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30080 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30090 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
300a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
300b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
300c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
300d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
300e0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
300f0 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  tDigestUpdate)(C
30100 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30110 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
30120 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
30130 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
30140 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
30150 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
30160 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
30170 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
30180 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
30190 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
301a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
301b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
301c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
301d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
301e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
301f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30200 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
30210 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
30220 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30230 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
30240 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30250 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
30260 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
30270 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
30280 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
30290 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
302a0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
302b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
302c0 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  , C_SignEncryptU
302d0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
302e0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
302f0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
30300 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
30310 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
30320 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
30330 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
30340 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
30350 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
30360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30370 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
30380 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
30390 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
303a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
303b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
303c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
303d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
303e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
303f0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
30400 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
30410 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
30420 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30430 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
30440 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30450 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
30460 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30470 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
30480 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30490 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
304a0 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29  yptVerifyUpdate)
304b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
304c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
304d0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
304e0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
304f0 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
30500 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
30510 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
30520 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
30530 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
30540 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
30550 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
30560 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
30570 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30580 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30590 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
305a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
305b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
305c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
305d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
305e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
305f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
30600 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
30610 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
30620 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30630 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
30640 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30650 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
30660 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
30670 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
30680 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
30690 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
306a0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
306b0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41  pMechanism, CK_A
306c0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
306d0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
306e0 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
306f0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
30700 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
30710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
30720 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
30730 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
30740 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
30750 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30760 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
30770 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
30780 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
30790 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
307a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
307b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
307c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
307d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
307e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
307f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30800 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
30810 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30820 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
30830 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
30840 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
30850 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45  teKeyPair)(CK_SE
30860 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30870 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
30880 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
30890 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  sm, CK_ATTRIBUTE
308a0 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54  _PTR pPublicKeyT
308b0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
308c0 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74  G ulPublicKeyAtt
308d0 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
308e0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
308f0 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74  rivateKeyTemplat
30900 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72  e, CK_ULONG ulPr
30910 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74  ivateKeyAttribut
30920 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
30930 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
30940 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ublicKey, CK_OBJ
30950 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
30960 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09  hPrivateKey) {..
30970 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30980 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30990 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
309a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
309b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
309c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
309d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
309e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
309f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30a00 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
30a10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30a20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30a30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30a40 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
30a50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30a60 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
30a70 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30a80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
30a90 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
30aa0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
30ab0 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  _WrapKey)(CK_SES
30ac0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
30ad0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
30ae0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
30af0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
30b00 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79  DLE hWrappingKey
30b10 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
30b20 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45  LE hKey, CK_BYTE
30b30 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
30b40 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
30b50 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29  ulWrappedKeyLen)
30b60 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
30b70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
30b80 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
30b90 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
30ba0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30bb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30bc0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
30bd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
30be0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
30bf0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
30c00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30c10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30c20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30c30 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
30c40 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
30c50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
30c60 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
30c70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30c80 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
30c90 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
30ca0 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28  V, C_UnwrapKey)(
30cb0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
30cc0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
30cd0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
30ce0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
30cf0 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61  CT_HANDLE hUnwra
30d00 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54  ppingKey, CK_BYT
30d10 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
30d20 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72  y, CK_ULONG ulWr
30d30 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f  appedKeyLen, CK_
30d40 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
30d50 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
30d60 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
30d70 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
30d80 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
30d90 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
30da0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
30db0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
30dc0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
30dd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30de0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
30df0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
30e00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30e10 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
30e20 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
30e30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30e40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
30e50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30e60 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
30e70 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
30e80 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
30e90 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
30ea0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30eb0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
30ec0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
30ed0 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43  , C_DeriveKey)(C
30ee0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30ef0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
30f00 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
30f10 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
30f20 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65  T_HANDLE hBaseKe
30f30 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  y, CK_ATTRIBUTE_
30f40 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
30f50 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
30f60 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
30f70 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
30f80 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
30f90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
30fa0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
30fb0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
30fc0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
30fd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30fe0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
30ff0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
31000 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
31010 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
31020 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
31030 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
31040 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
31050 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
31060 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
31070 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
31080 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
31090 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
310a0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
310b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
310c0 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61  (CK_RV, C_SeedRa
310d0 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
310e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
310f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
31100 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  eed, CK_ULONG ul
31110 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  SeedLen) {..CACK
31120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31130 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
31140 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
31150 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
31160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31170 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
31180 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
31190 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
311a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
311b0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
311c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
311d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
311e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
311f0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
31200 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
31210 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
31220 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
31230 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
31240 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
31250 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
31260 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f  erateRandom)(CK_
31270 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
31280 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
31290 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61  _PTR pRandomData
312a0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e  , CK_ULONG ulRan
312b0 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  domLen) {..CACKE
312c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
312d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
312e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
312f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
31300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31310 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
31320 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
31330 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
31340 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
31350 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
31360 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
31370 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
31380 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
31390 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
313a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
313b0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
313c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
313d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
313e0 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
313f0 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
31400 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
31410 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
31420 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53  nStatus)(CK_SESS
31430 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
31440 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ion) {..CACKEY_D
31450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
31460 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
31470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
31480 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
31490 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
314a0 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  EL (%i)", CKR_FU
314b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
314c0 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  LEL);...return(C
314d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
314e0 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65  PARALLEL);...hSe
314f0 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e  ssion = hSession
31500 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
31510 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
31520 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65  ning */.}../* De
31530 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
31540 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
31550 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
31560 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29  _CancelFunction)
31570 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
31580 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
31590 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
315a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
315b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
315c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
315d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
315e0 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22  T_PARALLEL (%i)"
315f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
31600 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
31610 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
31620 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
31630 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20  );...hSession = 
31640 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70  hSession; /* Sup
31650 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
31660 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
31670 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
31680 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
31690 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28  etFunctionList)(
316a0 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
316b0 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74  _PTR_PTR ppFunct
316c0 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46  ionList) {..CK_F
316d0 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
316e0 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
316f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31700 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
31710 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69  ;...if (ppFuncti
31720 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  onList == NULL) 
31730 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
31740 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
31750 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69  ppFunctionList i
31760 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
31770 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
31780 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46  TS_BAD);..}...pF
31790 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61  unctionList = ma
317a0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75  lloc(sizeof(*pFu
317b0 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09  nctionList));...
317c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
317d0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
317e0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
317f0 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
31800 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
31810 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
31820 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28  rsion.minor = ((
31830 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
31840 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
31850 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46   8) & 0xff;...pF
31860 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
31870 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e  nitialize = C_In
31880 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  itialize;..pFunc
31890 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61  tionList->C_Fina
318a0 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a  lize = C_Finaliz
318b0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
318c0 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43  t->C_GetInfo = C
318d0 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  _GetInfo;..pFunc
318e0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
318f0 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53  lotList = C_GetS
31900 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  lotList;..pFunct
31910 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
31920 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c  otInfo = C_GetSl
31930 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  otInfo;..pFuncti
31940 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b  onList->C_GetTok
31950 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f  enInfo = C_GetTo
31960 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  kenInfo;..pFunct
31970 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46  ionList->C_WaitF
31980 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f  orSlotEvent = C_
31990 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
319a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
319b0 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
319c0 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68  List = C_GetMech
319d0 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e  anismList;..pFun
319e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
319f0 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20  MechanismInfo = 
31a00 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
31a10 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
31a20 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20  st->C_InitToken 
31a30 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09  = C_InitToken;..
31a40 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31a50 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69  _InitPIN = C_Ini
31a60 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tPIN;..pFunction
31a70 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d  List->C_SetPIN =
31a80 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e   C_SetPIN;..pFun
31a90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65  ctionList->C_Ope
31aa0 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65  nSession = C_Ope
31ab0 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  nSession;..pFunc
31ac0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
31ad0 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f  eSession = C_Clo
31ae0 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  seSession;..pFun
31af0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
31b00 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20  seAllSessions = 
31b10 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
31b20 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ns;..pFunctionLi
31b30 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e  st->C_GetSession
31b40 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73  Info = C_GetSess
31b50 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ionInfo;..pFunct
31b60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70  ionList->C_GetOp
31b70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43  erationState = C
31b80 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
31b90 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
31ba0 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69  st->C_SetOperati
31bb0 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f  onState = C_SetO
31bc0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09  perationState;..
31bd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31be0 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e  _Login = C_Login
31bf0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31c00 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c  ->C_Logout = C_L
31c10 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f  ogout;..pFunctio
31c20 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f  nList->C_CreateO
31c30 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65  bject = C_Create
31c40 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
31c50 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62  onList->C_CopyOb
31c60 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a  ject = C_CopyObj
31c70 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
31c80 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62  ist->C_DestroyOb
31c90 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79  ject = C_Destroy
31ca0 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
31cb0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a  onList->C_GetObj
31cc0 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f  ectSize = C_GetO
31cd0 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e  bjectSize;..pFun
31ce0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
31cf0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
31d00 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
31d10 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  alue;..pFunction
31d20 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69  List->C_SetAttri
31d30 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65  buteValue = C_Se
31d40 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b  tAttributeValue;
31d50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31d60 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e  >C_FindObjectsIn
31d70 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  it = C_FindObjec
31d80 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  tsInit;..pFuncti
31d90 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
31da0 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62  jects = C_FindOb
31db0 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f  jects;..pFunctio
31dc0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
31dd0 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69  ectsFinal = C_Fi
31de0 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a  ndObjectsFinal;.
31df0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31e00 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20  C_EncryptInit = 
31e10 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_EncryptInit;..
31e20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31e30 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63  _Encrypt = C_Enc
31e40 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
31e50 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55  List->C_EncryptU
31e60 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70  pdate = C_Encryp
31e70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
31e80 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
31e90 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72  ptFinal = C_Encr
31ea0 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
31eb0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
31ec0 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72  yptInit = C_Decr
31ed0 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  yptInit;..pFunct
31ee0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
31ef0 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a  pt = C_Decrypt;.
31f00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31f10 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20  C_DecryptUpdate 
31f20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
31f30 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
31f40 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61  t->C_DecryptFina
31f50 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  l = C_DecryptFin
31f60 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
31f70 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74  st->C_DigestInit
31f80 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b   = C_DigestInit;
31f90 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31fa0 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69  >C_Digest = C_Di
31fb0 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  gest;..pFunction
31fc0 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70  List->C_DigestUp
31fd0 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55  date = C_DigestU
31fe0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
31ff0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b  nList->C_DigestK
32000 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79  ey = C_DigestKey
32010 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
32020 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20  ->C_DigestFinal 
32030 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b  = C_DigestFinal;
32040 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
32050 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f  >C_SignInit = C_
32060 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63  SignInit;..pFunc
32070 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
32080 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e   = C_Sign;..pFun
32090 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
320a0 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  nUpdate = C_Sign
320b0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
320c0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69  onList->C_SignFi
320d0 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  nal = C_SignFina
320e0 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
320f0 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
32100 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63  Init = C_SignRec
32110 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63  overInit;..pFunc
32120 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
32130 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e  Recover = C_Sign
32140 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
32150 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
32160 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79  yInit = C_Verify
32170 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
32180 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d  List->C_Verify =
32190 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e   C_Verify;..pFun
321a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
321b0 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65  ifyUpdate = C_Ve
321c0 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75  rifyUpdate;..pFu
321d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
321e0 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65  rifyFinal = C_Ve
321f0 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  rifyFinal;..pFun
32200 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
32210 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d  ifyRecoverInit =
32220 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
32230 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
32240 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65  List->C_VerifyRe
32250 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79  cover = C_Verify
32260 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
32270 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
32280 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  tEncryptUpdate =
32290 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74   C_DigestEncrypt
322a0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
322b0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
322c0 74 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  tDigestUpdate = 
322d0 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
322e0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
322f0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63  nList->C_SignEnc
32300 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53  ryptUpdate = C_S
32310 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
32320 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
32330 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  ->C_DecryptVerif
32340 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  yUpdate = C_Decr
32350 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b  yptVerifyUpdate;
32360 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
32370 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d  >C_GenerateKey =
32380 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a   C_GenerateKey;.
32390 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
323a0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
323b0 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  r = C_GenerateKe
323c0 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f  yPair;..pFunctio
323d0 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79  nList->C_WrapKey
323e0 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70   = C_WrapKey;..p
323f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
32400 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e  UnwrapKey = C_Un
32410 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74  wrapKey;..pFunct
32420 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76  ionList->C_Deriv
32430 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b  eKey = C_DeriveK
32440 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
32450 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d  st->C_SeedRandom
32460 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b   = C_SeedRandom;
32470 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
32480 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f  >C_GenerateRando
32490 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61  m = C_GenerateRa
324a0 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ndom;..pFunction
324b0 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
324c0 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65  ionStatus = C_Ge
324d0 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b  tFunctionStatus;
324e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
324f0 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f  >C_CancelFunctio
32500 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63  n = C_CancelFunc
32510 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tion;..pFunction
32520 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
32530 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46  ionList = C_GetF
32540 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a  unctionList;...*
32550 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
32560 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
32570 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32580 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32590 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
325a0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
325b0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a           (CKR_OK);.}..