Hex Artifact Content

Artifact a840779390b3a565b8c9307b3d23fc7e597f1a07:


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 2c 20 2a 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62  , *dyn_auth_tmpb
121c0 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  uf;..unsigned ch
121d0 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70  ar *tmpbuf, *tmp
121e0 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73  buf_s, *outbuf_s
121f0 2c 20 2a 6f 75 74 62 75 66 5f 70 3b 0a 09 75 6e  , *outbuf_p;..un
12200 73 69 67 6e 65 64 20 63 68 61 72 20 62 79 74 65  signed char byte
12210 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 2c 20 63  s_to_send, p1, c
12220 6c 61 73 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  lass;..unsigned 
12230 63 68 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a  char blocktype;.
12240 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64  .cackey_ret send
12250 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20  _ret;..uint16_t 
12260 72 65 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65  respcode;..ssize
12270 5f 74 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75  _t retval = 0, u
12280 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a  npadoffset;..siz
12290 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70  e_t tmpbuflen, p
122a0 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66  adlen, tmpoutbuf
122b0 6c 65 6e 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 3b  len, outbuf_len;
122c0 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75  ..int free_tmpbu
122d0 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a  f = 0;..int le;.
122e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
122f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
12300 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20  ;...if (slot == 
12310 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
12320 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
12330 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e  rror.  slot is N
12340 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
12350 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62  (-1);..}...if (b
12360 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
12370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12380 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66  NTF("Error.  buf
12390 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
123a0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
123b0 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55  if (outbuf == NU
123c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
123d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
123e0 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e  or.  outbuf is N
123f0 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
12400 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69  (-1);..}...if (i
12410 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
12420 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
12430 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12440 20 20 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55    identity is NU
12450 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
12460 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64  -1);..}...if (id
12470 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12480 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
12490 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
124a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
124b0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
124c0 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22  dentity is NULL"
124d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
124e0 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d  ;..}...id_type =
124f0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
12500 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70  identity->id_typ
12510 65 3b 0a 09 69 66 20 28 69 64 5f 74 79 70 65 20  e;..if (id_type 
12520 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  == CACKEY_ID_TYP
12530 45 5f 43 45 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09  E_CERT_ONLY) {..
12540 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12550 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
12560 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12570 6e 74 69 74 79 20 69 73 20 43 41 43 4b 45 59 5f  ntity is CACKEY_
12580 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
12590 59 2c 20 77 68 69 63 68 20 63 61 6e 6e 6f 74 20  Y, which cannot 
125a0 62 65 20 75 73 65 64 20 66 6f 72 20 73 69 67 6e  be used for sign
125b0 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 72  /decrypt");....r
125c0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
125d0 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
125e0 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
125f0 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
12600 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
12610 59 50 45 5f 43 41 43 3a 0a 09 09 09 62 72 65 61  YPE_CAC:....brea
12620 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  k;...default:...
12630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12640 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
12650 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12660 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 61 20 73  ntity is not a s
12670 75 70 70 6f 72 74 65 64 20 76 61 6c 75 65 2e 20  upported value. 
12680 54 79 70 65 20 69 73 3a 20 30 78 25 6c 78 20 28  Type is: 0x%lx (
12690 50 49 56 20 3d 20 30 78 25 6c 78 2c 20 43 41 43  PIV = 0x%lx, CAC
126a0 20 3d 20 30 78 25 6c 78 29 22 2c 20 28 75 6e 73   = 0x%lx)", (uns
126b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 5f 74  igned long) id_t
126c0 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ype, (unsigned l
126d0 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54  ong) CACKEY_ID_T
126e0 59 50 45 5f 50 49 56 2c 20 28 75 6e 73 69 67 6e  YPE_PIV, (unsign
126f0 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f  ed long) CACKEY_
12700 49 44 5f 54 59 50 45 5f 43 41 43 29 3b 0a 0a 09  ID_TYPE_CAC);...
12710 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
12720 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
12730 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a  identity Key siz
12740 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  e */..if (identi
12750 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12760 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20  y->keysize < 0) 
12770 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63  {...identity->pc
12780 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
12790 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b  size = x509_to_k
127a0 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d  eysize(identity-
127b0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
127c0 63 65 72 74 69 66 69 63 61 74 65 2c 20 69 64 65  certificate, ide
127d0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
127e0 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
127f0 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  e_len);..}.../* 
12800 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b  Pad message to k
12810 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28  ey size */..if (
12820 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66  padInput) {...if
12830 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
12840 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
12850 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20  ze > 0) {....if 
12860 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74  (buflen != ident
12870 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12880 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09  ty->keysize) {..
12890 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20  ...if (buflen > 
128a0 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
128b0 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
128c0 65 20 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43  e + 3)) {......C
128d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
128e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73  TF("Error.  Mess
128f0 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
12900 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74   to sign/decrypt
12910 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  ");.......return
12920 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  (-1);.....}.....
12930 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65  .tmpbuflen = ide
12940 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12950 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09  tity->keysize;..
12960 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
12970 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09  oc(tmpbuflen);..
12980 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
12990 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20   1;......padlen 
129a0 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75  = tmpbuflen - bu
129b0 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f  flen - 3;....../
129c0 2a 20 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53  * RSA PKCS#1 EMS
129d0 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64  A-PKCS1-v1_5 Pad
129e0 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62  ding */.....tmpb
129f0 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09  uf[0] = 0x00;...
12a00 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78  ..tmpbuf[1] = 0x
12a10 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26  01;.....memset(&
12a20 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c  tmpbuf[2], 0xFF,
12a30 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d   padlen);.....tm
12a40 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d  pbuf[padlen + 2]
12a50 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63  = 0x00;.....memc
12a60 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65  py(&tmpbuf[padle
12a70 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66  n + 3], buf, buf
12a80 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  len);......CACKE
12a90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
12aa0 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75  ("Unpadded:", bu
12ab0 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
12ac0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12ad0 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c  NTBUF("Padded:",
12ae0 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
12af0 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  en);....} else {
12b00 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75  .....tmpbuf = bu
12b10 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  f;.....tmpbuflen
12b20 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66   = buflen;.....f
12b30 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
12b40 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ....padlen = 0;.
12b50 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
12b60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12b70 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
12b80 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20  o determine key 
12b90 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65  size, hoping the
12ba0 20 6d 65 73 73 61 67 65 20 69 73 20 70 72 6f 70   message is prop
12bb0 65 72 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a  erly padded!");.
12bc0 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  ....tmpbuf = buf
12bd0 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  ;....tmpbuflen =
12be0 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65   buflen;....free
12bf0 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09  _tmpbuf = 0;....
12c00 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a  padlen = 0;...}.
12c10 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62  .} else {...tmpb
12c20 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62  uf = buf;...tmpb
12c30 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
12c40 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
12c50 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  0;...padlen = 0;
12c60 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74  ..}.../* Begin t
12c70 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
12c80 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
12c90 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
12ca0 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65  ./* Select corre
12cb0 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 73 77  ct applet */..sw
12cc0 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
12cd0 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
12ce0 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 43  D_TYPE_CAC:....C
12cf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12d00 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70  TF("Selecting ap
12d10 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70  plet found at %p
12d20 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d   ...", identity-
12d30 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12d40 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29  card.cac.applet)
12d50 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65  ;....cackey_sele
12d60 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
12d70 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12d80 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61  dentity->card.ca
12d90 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  c.applet, sizeof
12da0 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
12db0 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63  identity->card.c
12dc0 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09  ac.applet));....
12dd0 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65  ./* Select corre
12de0 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09 09 63 61  ct file */....ca
12df0 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
12e00 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d  (slot, identity-
12e10 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12e20 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 29 3b 0a  card.cac.file);.
12e30 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
12e40 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
12e50 50 49 56 3a 0a 09 09 09 64 79 6e 5f 61 75 74 68  PIV:....dyn_auth
12e60 5f 74 65 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30  _template[0] = 0
12e70 78 37 43 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68  x7C;....dyn_auth
12e80 5f 74 65 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30  _template[1] = 0
12e90 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68  x82;....dyn_auth
12ea0 5f 74 65 6d 70 6c 61 74 65 5b 32 5d 20 3d 20 28  _template[2] = (
12eb0 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20  (tmpbuflen + 6) 
12ec0 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a  & 0xff00) >> 8;.
12ed0 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ...dyn_auth_temp
12ee0 6c 61 74 65 5b 33 5d 20 3d 20 28 74 6d 70 62 75  late[3] = (tmpbu
12ef0 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 30 30  flen + 6) & 0x00
12f00 66 66 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f  ff;....dyn_auth_
12f10 74 65 6d 70 6c 61 74 65 5b 34 5d 20 3d 20 30 78  template[4] = 0x
12f20 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f  82;....dyn_auth_
12f30 74 65 6d 70 6c 61 74 65 5b 35 5d 20 3d 20 30 78  template[5] = 0x
12f40 30 30 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f  00;....dyn_auth_
12f50 74 65 6d 70 6c 61 74 65 5b 36 5d 20 3d 20 30 78  template[6] = 0x
12f60 38 31 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f  81;....dyn_auth_
12f70 74 65 6d 70 6c 61 74 65 5b 37 5d 20 3d 20 30 78  template[7] = 0x
12f80 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f  82;....dyn_auth_
12f90 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d 20 28 74  template[8] = (t
12fa0 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 66 66 30  mpbuflen & 0xff0
12fb0 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f  0) >> 8;....dyn_
12fc0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 39 5d  auth_template[9]
12fd0 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26 20 30   = tmpbuflen & 0
12fe0 78 30 30 66 66 3b 0a 0a 09 09 09 64 79 6e 5f 61  x00ff;.....dyn_a
12ff0 75 74 68 5f 74 6d 70 62 75 66 20 3d 20 6d 61 6c  uth_tmpbuf = mal
13000 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20  loc(tmpbuflen + 
13010 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f  sizeof(dyn_auth_
13020 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d  template));....m
13030 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74  emcpy(dyn_auth_t
13040 6d 70 62 75 66 2c 20 64 79 6e 5f 61 75 74 68 5f  mpbuf, dyn_auth_
13050 74 65 6d 70 6c 61 74 65 2c 20 73 69 7a 65 6f 66  template, sizeof
13060 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  (dyn_auth_templa
13070 74 65 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28  te));....memcpy(
13080 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 20  dyn_auth_tmpbuf 
13090 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  + sizeof(dyn_aut
130a0 68 5f 74 65 6d 70 6c 61 74 65 29 2c 20 74 6d 70  h_template), tmp
130b0 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b  buf, tmpbuflen);
130c0 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d  .....if (free_tm
130d0 70 62 75 66 29 20 7b 0a 09 09 09 09 66 72 65 65  pbuf) {.....free
130e0 28 74 6d 70 62 75 66 29 3b 0a 09 09 09 7d 0a 0a  (tmpbuf);....}..
130f0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 2b 3d 20  ...tmpbuflen += 
13100 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f  sizeof(dyn_auth_
13110 74 65 6d 70 6c 61 74 65 29 3b 0a 09 09 09 74 6d  template);....tm
13120 70 62 75 66 20 3d 20 64 79 6e 5f 61 75 74 68 5f  pbuf = dyn_auth_
13130 74 6d 70 62 75 66 3b 0a 09 09 09 66 72 65 65 5f  tmpbuf;....free_
13140 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
13150 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
13160 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
13170 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b  T_ONLY:....break
13180 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75 66 5f 73 20  ;..}...tmpbuf_s 
13190 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75  = tmpbuf;..outbu
131a0 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77  f_s = outbuf;..w
131b0 68 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29  hile (tmpbuflen)
131c0 20 7b 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65   {...tmpoutbufle
131d0 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a  n = outbuflen;..
131e0 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20  ..if (tmpbuflen 
131f0 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  > CACKEY_APDU_MT
13200 55 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f  U) {....bytes_to
13210 5f 73 65 6e 64 20 3d 20 43 41 43 4b 45 59 5f 41  _send = CACKEY_A
13220 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 20 65 6c 73  PDU_MTU;...} els
13230 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  e {....bytes_to_
13240 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e  send = tmpbuflen
13250 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 5f 72 65  ;...}....send_re
13260 74 20 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f  t = CACKEY_PCSC_
13270 45 5f 47 45 4e 45 52 49 43 3b 0a 09 09 73 77 69  E_GENERIC;...swi
13280 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a  tch (id_type) {.
13290 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
132a0 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09  D_TYPE_CAC:.....
132b0 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
132c0 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29  CACKEY_APDU_MTU)
132d0 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78 38   {......p1 = 0x8
132e0 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30  0;......le = 0x0
132f0 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  0;.....} else {.
13300 09 09 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a  .....p1 = 0x00;.
13310 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  .....le = 0x00;.
13320 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f  ....}......send_
13330 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
13340 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
13350 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
13360 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f  PLATFORM, GSCIS_
13370 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50  INSTR_SIGNDECRYP
13380 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74  T, p1, 0x00, byt
13390 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62  es_to_send, tmpb
133a0 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64  uf, le, &respcod
133b0 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f  e, outbuf, &tmpo
133c0 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62  utbuflen);.....b
133d0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41  reak;....case CA
133e0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
133f0 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  :.....if (tmpbuf
13400 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
13410 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 63 6c  U_MTU) {......cl
13420 61 73 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09  ass = 0x10;.....
13430 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  .le = 0x00;.....
13440 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 63 6c  } else {......cl
13450 61 73 73 20 3d 20 47 53 43 49 53 5f 43 4c 41 53  ass = GSCIS_CLAS
13460 53 5f 49 53 4f 37 38 31 36 3b 0a 09 09 09 09 09  S_ISO7816;......
13470 6c 65 20 3d 20 32 35 36 3b 0a 09 09 09 09 7d 0a  le = 256;.....}.
13480 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  .....send_ret = 
13490 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
134a0 28 73 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49  (slot, class, NI
134b0 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
134c0 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54  TR_GENAUTH, NIST
134d0 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f  SP800_78_3_ALGO_
134e0 52 53 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74  RSA2048, identit
134f0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13500 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69  ->card.piv.key_i
13510 64 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  d, bytes_to_send
13520 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72  , tmpbuf, le, &r
13530 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c  espcode, outbuf,
13540 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b   &tmpoutbuflen);
13550 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
13560 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
13570 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
13580 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
13590 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
135a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
135b0 29 20 7b 0a 09 09 09 69 66 20 28 66 72 65 65 5f  ) {....if (free_
135c0 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66  tmpbuf) {.....if
135d0 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
135e0 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
135f0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
13600 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63  ../* End transac
13610 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
13620 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
13630 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20  n(slot);.....if 
13640 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
13650 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
13660 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
13670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
13680 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64  U Sending Failed
13690 20 2d 2d 20 72 65 74 72 79 69 6e 67 2e 22 29 3b   -- retrying.");
136a0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 63  ......return(cac
136b0 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
136c0 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2c 20  slot, identity, 
136d0 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20 6f 75 74  buf, buflen, out
136e0 62 75 66 2c 20 6f 75 74 62 75 66 6c 65 6e 2c 20  buf, outbuflen, 
136f0 70 61 64 49 6e 70 75 74 2c 20 75 6e 70 61 64 4f  padInput, unpadO
13700 75 74 70 75 74 29 29 3b 0a 09 09 09 7d 0a 0a 09  utput));....}...
13710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13720 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
13730 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
13740 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
13750 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73  .");.....if (res
13760 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 20  pcode == 0x6982 
13770 7c 7c 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  || respcode == 0
13780 78 36 65 30 30 29 20 7b 0a 09 09 09 09 69 66 20  x6e00) {.....if 
13790 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
137a0 45 30 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  E00) {......CACK
137b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
137c0 22 47 6f 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41  "Got \"WRONG CLA
137d0 53 53 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e 73  SS\", this means
137e0 20 77 65 20 61 72 65 20 74 61 6c 6b 69 6e 67 20   we are talking 
137f0 74 6f 20 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a  to the wrong obj
13800 65 63 74 20 28 6c 69 6b 65 6c 79 20 62 65 63 61  ect (likely beca
13810 75 73 65 20 74 68 65 20 63 61 72 64 20 77 65 6e  use the card wen
13820 74 20 61 77 61 79 29 20 2d 2d 20 72 65 73 65 74  t away) -- reset
13830 74 69 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65 6c  ting");.....} el
13840 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  se {......CACKEY
13850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
13860 65 63 75 72 69 74 79 20 73 74 61 74 75 73 20 6e  ecurity status n
13870 6f 74 20 73 61 74 69 73 69 66 69 65 64 20 28 72  ot satisified (r
13880 65 73 70 63 6f 64 65 20 3d 20 30 78 25 30 34 78  espcode = 0x%04x
13890 29 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45  ).  Returning NE
138a0 45 44 4c 4f 47 49 4e 22 2c 20 28 69 6e 74 29 20  EDLOGIN", (int) 
138b0 72 65 73 70 63 6f 64 65 29 3b 0a 09 09 09 09 7d  respcode);.....}
138c0 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
138d0 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
138e0 74 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  t);......slot->t
138f0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
13900 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
13910 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
13920 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
13930 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  OGIN);....}.....
13940 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
13950 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
13960 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
13970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13980 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65  INTF("Token abse
13990 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54  nt.  Returning T
139a0 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09  OKENABSENT");...
139b0 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
139c0 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
139d0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
139e0 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
139f0 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09  ABSENT);....}...
13a00 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
13a10 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62  }....tmpbuf += b
13a20 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09  ytes_to_send;...
13a30 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74  tmpbuflen -= byt
13a40 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f  es_to_send;....o
13a50 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62  utbuf += tmpoutb
13a60 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c  uflen;...outbufl
13a70 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c  en -= tmpoutbufl
13a80 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20  en;...retval += 
13a90 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d  tmpoutbuflen;..}
13aa0 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
13ab0 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62  uf) {...if (tmpb
13ac0 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28  uf_s) {....free(
13ad0 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09  tmpbuf_s);...}..
13ae0 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74  }...outbuf = out
13af0 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20  buf_s;.../* End 
13b00 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
13b10 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
13b20 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23  action(slot);..#
13b30 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
13b40 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
13b50 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
13b60 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
13b70 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
13b80 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
13b90 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62  BUG_PRINTF("Outb
13ba0 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61  uflen exceeds ma
13bb0 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
13bc0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
13bd0 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
13be0 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22  utbuflen = %lu)"
13bf0 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
13c00 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
13c10 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
13c20 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  flen);....return
13c30 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
13c40 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 57 65  f.#endif.../* We
13c50 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68 65   must remove the
13c60 20 22 37 43 22 20 74 61 67 20 74 6f 20 67 65 74   "7C" tag to get
13c70 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74 75 72   to the signatur
13c80 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  e */..switch (id
13c90 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
13ca0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
13cb0 49 56 3a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65  IV:....outbuf_le
13cc0 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f  n = retval;....o
13cd0 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79  utbuf_p = cackey
13ce0 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
13cf0 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66  (outbuf, &outbuf
13d00 5f 6c 65 6e 2c 20 30 78 37 43 2c 20 4e 55 4c 4c  _len, 0x7C, NULL
13d10 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b  ,  &outbuf_len);
13d20 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70  ....if (outbuf_p
13d30 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
13d40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13d50 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72  NTF("Response fr
13d60 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52  om PIV for GENER
13d70 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49  ATE AUTHENTICATI
13d80 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 37  ON was not a 0x7
13d90 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67  C tag, returning
13da0 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
13db0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13dc0 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20  ...}.....retval 
13dd0 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09  = outbuf_len;...
13de0 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72  ..outbuf_len = r
13df0 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66  etval;....outbuf
13e00 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
13e10 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62  _bertlv_tag(outb
13e20 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c  uf, &outbuf_len,
13e30 20 30 78 38 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f   0x82, NULL,  &o
13e40 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69  utbuf_len);....i
13e50 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e  f (outbuf_p == N
13e60 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
13e70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13e80 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49  Response from PI
13e90 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41  V for GENERATE A
13ea0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61  UTHENTICATION wa
13eb0 73 20 6e 6f 74 20 61 20 30 78 38 32 20 77 69 74  s not a 0x82 wit
13ec0 68 69 6e 20 61 20 30 78 37 43 20 74 61 67 2c 20  hin a 0x7C tag, 
13ed0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
13ee0 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74  lure");......ret
13ef0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09  urn(-1);....}...
13f00 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75  ..retval = outbu
13f10 66 5f 6c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b  f_len;.....break
13f20 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
13f30 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 63  ID_TYPE_CAC:...c
13f40 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
13f50 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
13f60 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20  .break;..}.../* 
13f70 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09  Unpad reply */..
13f80 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29  if (unpadOutput)
13f90 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20   {...if (retval 
13fa0 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  < 3) {....CACKEY
13fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13fc0 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c  eply is too smal
13fd0 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62  l, we are not ab
13fe0 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70  le to unpad -- p
13ff0 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
14000 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
14010 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b  est!");.....CACK
14020 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14030 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
14040 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
14050 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
14060 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09  ong) retval);...
14070 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
14080 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62  ...}....if (outb
14090 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 7b  uf[0] != 0x00) {
140a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
140b0 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f 67  _PRINTF("Unrecog
140c0 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 63  nized padding sc
140d0 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 20  heme -- passing 
140e0 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
140f0 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
14100 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14110 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
14120 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
14130 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
14140 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
14150 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
14160 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
14170 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74  .blocktype = out
14180 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f  buf[1];...unpado
14190 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77  ffset = 0;....sw
141a0 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29  itch (blocktype)
141b0 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a   {....case 0x00:
141c0 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
141d0 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69  Scheme 1, the fi
141e0 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
141f0 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  e is the start o
14200 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f  f data */.....fo
14210 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
14220 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
14230 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
14240 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
14250 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
14260 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29  offset] != 0x00)
14270 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
14280 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
14290 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
142a0 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x01:...../* Pad
142b0 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70  ding Scheme 2, p
142c0 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46  ad bytes are 0xF
142d0 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78  F followed by 0x
142e0 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  00 */.....for (u
142f0 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
14300 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
14310 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
14320 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
14330 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
14340 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09  et] != 0xFF) {..
14350 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
14360 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
14370 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75  0x00) {........u
14380 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
14390 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
143a0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
143b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
143c0 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
143d0 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75  padding data fou
143e0 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  nd, returning in
143f0 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64   failure, should
14400 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20   have been 0x00 
14410 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28  found 0x%02x", (
14420 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75  unsigned int) ou
14430 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
14440 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75  ]);.........retu
14450 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a  rn(-1);.......}.
14460 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
14470 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14480 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
14490 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
144a0 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
144b0 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
144c0 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46  d have been 0xFF
144d0 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
144e0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
144f0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
14500 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75  t]);........retu
14510 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09  rn(-1);......}..
14520 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
14530 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
14540 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
14550 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73  eme 3, pad bytes
14560 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69   are non-zero fi
14570 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 6f  rst zero byte fo
14580 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 72  und is the seper
14590 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 09  ator byte */....
145a0 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
145b0 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
145c0 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
145d0 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
145e0 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
145f0 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
14600 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 61  00) {.......unpa
14610 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
14620 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
14630 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
14640 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61  ...}....if (unpa
14650 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 6c  doffset > retval
14660 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
14670 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
14680 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  et greater than 
14690 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72  reply size, abor
146a0 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 66  ting.  (unpadoff
146b0 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 61  set = %lu, retva
146c0 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  l = %lu)", (unsi
146d0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64  gned long) unpad
146e0 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e 65  offset, (unsigne
146f0 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b  d long) retval);
14700 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14710 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
14720 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
14730 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c  added:", outbuf,
14740 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74   retval);....ret
14750 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73  val -= unpadoffs
14760 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75  et;...memmove(ou
14770 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 75  tbuf, outbuf + u
14780 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 76  npadoffset, retv
14790 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  al);....CACKEY_D
147a0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
147b0 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  npadded:", outbu
147c0 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  f, retval);..}..
147d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
147e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
147f0 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
14800 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
14810 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
14820 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
14830 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  val);.}../*. * S
14840 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
14850 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
14860 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
14870 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
14880 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
14890 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
148a0 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
148b0 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
148c0 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74 20  ey_login(struct 
148d0 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
148e0 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
148f0 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20   *pin, unsigned 
14900 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e  long pin_len, in
14910 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  t *tries_remaini
14920 6e 67 5f 70 29 20 7b 0a 09 73 74 72 75 63 74 20  ng_p) {..struct 
14930 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
14940 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
14950 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
14960 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d   char cac_pin[8]
14970 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20   = {0xFF, 0xFF, 
14980 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
14990 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
149a0 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  FF};..unsigned l
149b0 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
149c0 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73  uint16_t respons
149d0 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69  e_code;..int tri
149e0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
149f0 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e  nt send_ret;..in
14a00 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20  t key_reference 
14a10 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 49 6e 64  = 0x00;.../* Ind
14a20 69 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f  icate that we do
14a30 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20   not know about 
14a40 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61  how many tries a
14a50 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a  re remaining */.
14a60 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
14a70 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69  ning_p) {...*tri
14a80 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d  es_remaining_p =
14a90 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70   -1;..}.../* App
14aa0 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e  arently, CAC PIN
14ab0 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20  s are *EXACTLY* 
14ac0 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20  8 bytes long -- 
14ad0 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66  pad with 0xFF if
14ae0 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
14af0 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29  f (pin_len >= 8)
14b00 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f   {...memcpy(cac_
14b10 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d  pin, pin, 8);..}
14b20 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
14b30 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70  (cac_pin, pin, p
14b40 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a  in_len);..}.../*
14b50 20 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69   Reject PINs whi
14b60 63 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74  ch are too short
14b70 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e   */..if (pin_len
14b80 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 5) {...CACKEY
14b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14ba0 65 6a 65 63 74 69 6e 67 20 50 49 4e 20 77 68 69  ejecting PIN whi
14bb0 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20  ch is too short 
14bc0 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d  (length = %lu, m
14bd0 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35  ust be atleast 5
14be0 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09  )", pin_len);...
14bf0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
14c00 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
14c10 7d 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65  }.../* PIV authe
14c20 6e 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61  ntication uses a
14c30 20 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22   "key_reference"
14c40 20 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73   of 0x80 */..pcs
14c50 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  c_identities = c
14c60 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
14c70 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75  (slot, NULL, &nu
14c80 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e  m_certs);..if (n
14c90 75 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20  um_certs > 0 && 
14ca0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
14cb0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69  != NULL) {...swi
14cc0 74 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69  tch (pcsc_identi
14cd0 74 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29  ties[0].id_type)
14ce0 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45   {....case CACKE
14cf0 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09  Y_ID_TYPE_PIV:..
14d00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14d10 50 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20  PRINTF("We have 
14d20 50 49 56 20 63 61 72 64 2c 20 73 6f 20 77 65 20  PIV card, so we 
14d30 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  will attempt to 
14d40 61 75 74 68 65 6e 74 69 63 61 74 65 20 75 73 69  authenticate usi
14d50 6e 67 20 74 68 65 20 50 49 56 20 41 70 70 6c 69  ng the PIV Appli
14d60 63 61 74 69 6f 6e 20 6b 65 79 20 72 65 66 65 72  cation key refer
14d70 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09 6b 65 79  ence");......key
14d80 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38  _reference = 0x8
14d90 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  0;.....break;...
14da0 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72  .default:.....br
14db0 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  eak;...}....cack
14dc0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
14dd0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
14de0 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d  um_certs, 1);..}
14df0 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20  .../* Issue PIN 
14e00 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f  Verify */..send_
14e10 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
14e20 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
14e30 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
14e40 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45  , GSCIS_INSTR_VE
14e50 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f  RIFY, 0x00, key_
14e60 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f  reference, sizeo
14e70 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f  f(cac_pin), cac_
14e80 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70  pin, 0x00, &resp
14e90 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c  onse_code, NULL,
14ea0 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65   NULL);...if (se
14eb0 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
14ec0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
14ed0 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f  if ((response_co
14ee0 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20  de & 0x63C0) == 
14ef0 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69  0x63C0) {....tri
14f00 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28  es_remaining = (
14f10 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
14f20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  0xF);.....CACKEY
14f30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
14f40 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
14f50 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73  failed, %i tries
14f60 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69   remaining", tri
14f70 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a  es_remaining);..
14f80 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
14f90 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09  aining_p) {.....
14fa0 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
14fb0 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69  _p = tries_remai
14fc0 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  ning;....}.....r
14fd0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
14fe0 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d  C_E_BADPIN);...}
14ff0 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65  ....if (response
15000 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29  _code == 0x6983)
15010 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
15020 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
15030 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c  erification fail
15040 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f  ed, device is lo
15050 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75  cked");.....retu
15060 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
15070 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09  _LOCKED);...}...
15080 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15090 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
150a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
150b0 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
150c0 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65  rification succe
150d0 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  eded");...return
150e0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
150f0 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
15100 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
15110 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
15120 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15130 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
15140 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
15150 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
15160 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
15170 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
15180 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73  _token_present(s
15190 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
151a0 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b  t *slot) {..cack
151b0 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e  ey_ret pcsc_conn
151c0 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20  ect_ret;..DWORD 
151d0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20  reader_len = 0, 
151e0 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f  state = 0, proto
151f0 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e  col = 0, atr_len
15200 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f  ;..BYTE atr[MAX_
15210 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47  ATR_SIZE];..LONG
15220 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61   status_ret, sca
15230 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a  rd_reconn_ret;..
15240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15250 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
15260 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74  ...if (slot->int
15270 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45  ernal) {...CACKE
15280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15290 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  Returning token 
152a0 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61  present (interna
152b0 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72  l token)");....r
152c0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
152d0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
152e0 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
152f0 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
15300 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
15310 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  lot);..if (pcsc_
15320 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
15330 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
15340 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15350 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
15360 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63   to connect to c
15370 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ard, returning t
15380 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a  oken absent");..
15390 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
153a0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
153b0 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
153c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
153d0 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74  alling SCardStat
153e0 75 73 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  us() to determin
153f0 65 20 63 61 72 64 20 73 74 61 74 75 73 22 29 3b  e card status");
15400 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
15410 65 6f 66 28 61 74 72 29 3b 0a 09 73 74 61 74 75  eof(atr);..statu
15420 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61  s_ret = SCardSta
15430 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  tus(slot->pcsc_c
15440 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64  ard, NULL, &read
15450 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20  er_len, &state, 
15460 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20  &protocol, atr, 
15470 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  &atr_len);...if 
15480 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53  (status_ret == S
15490 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
154a0 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45  ANDLE) {...CACKE
154b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
154c0 53 43 61 72 64 53 74 61 74 75 73 28 29 20 72 65  SCardStatus() re
154d0 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49  turned SCARD_E_I
154e0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d  NVALID_HANDLE, m
154f0 61 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61 6c  arking is not al
15500 72 65 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20  ready connected 
15510 61 6e 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e  and trying again
15520 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ");...cackey_mar
15530 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
15540 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e  t);....pcsc_conn
15550 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
15560 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
15570 6f 74 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  ot);...if (pcsc_
15580 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
15590 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
155a0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
155b0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
155c0 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
155d0 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
155e0 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
155f0 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
15600 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
15610 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  SENT);...}....CA
15620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15630 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64  F("Calling SCard
15640 53 74 61 74 75 73 28 29 20 61 67 61 69 6e 22 29  Status() again")
15650 3b 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73  ;....atr_len = s
15660 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74  izeof(atr);...st
15670 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64  atus_ret = SCard
15680 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73  Status(slot->pcs
15690 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72  c_card, NULL, &r
156a0 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74  eader_len, &stat
156b0 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74  e, &protocol, at
156c0 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d  r, &atr_len);..}
156d0 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
156e0 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
156f0 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79  CESS) {...cackey
15700 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
15710 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73  (slot);....if (s
15720 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
15730 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
15740 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
15750 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
15760 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
15770 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
15780 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
15790 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
157a0 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
157b0 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
157c0 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
157d0 4f 4c 5f 54 31 29 3b 0a 09 09 09 69 66 20 28 73  OL_T1);....if (s
157e0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
157f0 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
15800 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65 2d  SS) {...../* Re-
15810 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61  establish transa
15820 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73  ction, if it was
15830 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09   present */.....
15840 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
15850 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
15860 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72   {......slot->tr
15870 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
15880 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  -;......slot->tr
15890 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
158a0 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09  w_lock = 1;.....
158b0 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
158c0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
158d0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
158e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
158f0 22 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75  "Reset successfu
15900 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b  l, requerying");
15910 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65 74 20  .....status_ret 
15920 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
15930 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e  ot->pcsc_card, N
15940 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e  ULL, &reader_len
15950 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f  , &state, &proto
15960 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c  col, atr, &atr_l
15970 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61  en);.....if (sta
15980 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  tus_ret != SCARD
15990 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
159a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
159b0 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e  PRINTF("Still un
159c0 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61  able to query ca
159d0 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72  rd status, retur
159e0 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
159f0 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28  t.  SCardStatus(
15a00 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ) = %s", CACKEY_
15a10 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
15a20 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75  ERR_TO_STR(statu
15a30 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72  s_ret));.......r
15a40 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
15a50 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
15a60 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
15a70 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
15a80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
15a90 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74  ble to reconnect
15aa0 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
15ab0 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
15ac0 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  .  SCardReconnec
15ad0 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  t() = %s", CACKE
15ae0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
15af0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
15b00 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b  rd_reconn_ret));
15b10 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
15b20 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
15b30 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09  ABSENT);....}...
15b40 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
15b50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15b60 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79  "Unable to query
15b70 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
15b80 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
15b90 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
15ba0 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
15bb0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
15bc0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
15bd0 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
15be0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15bf0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
15c00 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
15c10 28 73 74 61 74 65 20 26 20 53 43 41 52 44 5f 41  (state & SCARD_A
15c20 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f  BSENT) == SCARD_
15c30 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  ABSENT) {...CACK
15c40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15c50 22 43 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c  "Card is absent,
15c60 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
15c70 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65   absent");....re
15c80 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15c90 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
15ca0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
15cb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
15cc0 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65  ning token prese
15cd0 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  nt.");...return(
15ce0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
15cf0 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a  KENPRESENT);.}..
15d00 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
15d10 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
15d20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
15d30 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
15d40 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
15d50 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
15d60 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
15d70 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
15d80 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
15d90 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74  tity_to_label(st
15da0 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
15db0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
15dc0 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
15dd0 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75  ar *label_buf, u
15de0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62  nsigned long lab
15df0 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75  el_buf_len) {..u
15e00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
15e10 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 76  tificate_len;..v
15e20 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b  oid *label_asn1;
15e30 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63  ..void *certific
15e40 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72  ate;..int x509_r
15e50 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69  ead_ret;...certi
15e60 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
15e70 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
15e80 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
15e90 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
15ea0 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
15eb0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
15ec0 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  len < 0) {...ret
15ed0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35  urn(-1);..}...x5
15ee0 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
15ef0 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
15f00 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
15f10 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69  ficate_len, (voi
15f20 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e  d **) &label_asn
15f30 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  1);..if (x509_re
15f40 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
15f50 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
15f60 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
15f70 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
15f80 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
15f90 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
15fa0 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
15fb0 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
15fc0 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30   "CN");..if (x50
15fd0 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
15fe0 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72   {...x509_read_r
15ff0 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
16000 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
16010 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
16020 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
16030 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
16040 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69  len, NULL);....i
16050 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
16060 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   <= 0) {....retu
16070 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
16080 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
16090 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
160a0 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
160b0 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
160c0 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  ret > _POSIX_SSI
160d0 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
160e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
160f0 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65  "x509_read_ret e
16100 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
16110 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
16120 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
16130 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61   = %li, x509_rea
16140 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  d_ret = %lu)", (
16150 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
16160 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
16170 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61  d long) x509_rea
16180 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  d_ret);....retur
16190 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
161a0 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  if.#endif...retu
161b0 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  rn(x509_read_ret
161c0 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
161d0 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
161e0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
161f0 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
16200 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a  void **mutex) {.
16210 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
16220 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
16230 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
16240 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
16250 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
16260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16270 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
16280 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
16290 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
162a0 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
162b0 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
162c0 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
162d0 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tex = malloc(siz
162e0 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74  eof(*pthread_mut
162f0 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68  ex));...if (!pth
16300 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09  read_mutex) {...
16310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16320 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
16330 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e  allocate memory.
16340 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
16350 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65  1);...}....pthre
16360 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
16370 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70  ead_mutex_init(p
16380 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55  thread_mutex, NU
16390 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  LL);...if (pthre
163a0 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
163b0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
163c0 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
163d0 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72  d_mutex_init() r
163e0 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
163f0 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
16400 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
16410 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d  n(-1);...}....*m
16420 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d  utex = pthread_m
16430 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  utex;..} else {.
16440 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
16450 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b  s.CreateMutex) {
16460 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
16470 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
16480 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65  CreateMutex(mute
16490 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
164a0 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
164b0 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
164c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
164d0 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
164e0 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  teMutex() return
164f0 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
16500 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
16510 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
16520 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
16530 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
16540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
16550 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
16560 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
16570 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
16580 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
16590 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
165a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
165b0 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
165c0 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
165d0 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
165e0 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
165f0 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
16600 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
16610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16620 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
16630 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
16640 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
16650 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
16660 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
16670 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
16680 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
16690 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
166a0 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
166b0 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74  lock(pthread_mut
166c0 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  ex);...if (pthre
166d0 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
166e0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
166f0 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
16700 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72  d_mutex_lock() r
16710 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
16720 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
16730 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
16740 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n(-1);...}..} el
16750 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
16760 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
16770 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
16780 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
16790 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  gs.LockMutex(mut
167a0 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
167b0 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
167c0 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
167d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
167e0 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  "cackey_args.Loc
167f0 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
16800 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
16810 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
16820 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
16830 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
16840 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
16850 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16860 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
16870 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
16880 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
16890 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
168a0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
168b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
168c0 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
168d0 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
168e0 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
168f0 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
16900 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
16910 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
16920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16930 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
16940 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
16950 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
16960 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
16970 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
16980 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
16990 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
169a0 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
169b0 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
169c0 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  _unlock(pthread_
169d0 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
169e0 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
169f0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
16a00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
16a10 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
16a20 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
16a30 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
16a40 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
16a50 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
16a60 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
16a70 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
16a80 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
16a90 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
16aa0 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
16ab0 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
16ac0 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
16ad0 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
16ae0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16af0 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
16b00 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
16b10 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
16b20 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
16b30 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
16b40 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
16b50 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
16b60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16b70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
16b80 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
16b90 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
16ba0 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54  .}..static CK_AT
16bb0 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b  TRIBUTE_PTR cack
16bc0 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
16bd0 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  s(CK_OBJECT_CLAS
16be0 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73  S objectclass, s
16bf0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
16c00 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
16c10 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c  tity, unsigned l
16c20 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ong identity_num
16c30 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
16c40 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74  ulCount) {..stat
16c50 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74  ic CK_BBOOL ck_t
16c60 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63  rue = 1;..static
16c70 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c   CK_BBOOL ck_fal
16c80 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 63 20  se = 0;..static 
16c90 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 75 73  CK_TRUST ck_trus
16ca0 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 45 44  ted = CK_TRUSTED
16cb0 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 4b 5f  _DELEGATOR;..CK_
16cc0 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d  ULONG numattrs =
16cd0 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74   0, retval_count
16ce0 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ;..CK_ATTRIBUTE_
16cf0 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 5f 74  TYPE curr_attr_t
16d00 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  ype;..CK_ATTRIBU
16d10 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 2a 72  TE curr_attr, *r
16d20 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f  etval;..CK_VOID_
16d30 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f  PTR pValue;..CK_
16d40 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e  ULONG ulValueLen
16d50 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  ;..CK_OBJECT_CLA
16d60 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  SS ck_object_cla
16d70 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49 43  ss;..CK_CERTIFIC
16d80 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 72 74  ATE_TYPE ck_cert
16d90 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 43  ificate_type;..C
16da0 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65  K_KEY_TYPE ck_ke
16db0 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38  y_type;..CK_UTF8
16dc0 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b 31 30  CHAR ucTmpBuf[10
16dd0 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 65 78  24];..SHA1Contex
16de0 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d 44 35  t sha1_ctx;..MD5
16df0 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a 09 75  _CTX md5_ctx;..u
16e00 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 73 68  int8_t sha1_hash
16e10 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d 3b 0a  [SHA1HashSize];.
16e20 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 61 73  .uint8_t md5_has
16e30 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d 3b 0a  h[MD5HashSize];.
16e40 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
16e50 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73  certificate;..ss
16e60 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74  ize_t certificat
16e70 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39  e_len = -1, x509
16e80 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20  _read_ret;..int 
16e90 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43  pValue_free;...C
16ea0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16eb0 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65  TF("Called (obje
16ec0 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69  ctClass = %lu, i
16ed0 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c  dentity_num = %l
16ee0 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
16ef0 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73  long) objectclas
16f00 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29  s, identity_num)
16f10 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  ;...*pulCount = 
16f20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63  0;...if (objectc
16f30 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
16f40 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
16f50 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
16f60 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65  BLIC_KEY && obje
16f70 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
16f80 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62  RIVATE_KEY && ob
16f90 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
16fa0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
16fb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16fc0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
16fd0 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
16fe0 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f 62  ULL), invalid ob
16ff0 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a 09  ject class");...
17000 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
17010 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74 20  }.../* Get Cert 
17020 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  */..if (identity
17030 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
17040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17050 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
17060 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69  bjects (NULL), i
17070 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20 70  nvalid identiy p
17080 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72 65  rovided");....re
17090 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
170a0 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69  .certificate = i
170b0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
170c0 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61  cate;..certifica
170d0 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74  te_len = identit
170e0 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  y->certificate_l
170f0 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66  en;...if (certif
17100 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20  icate_len == -1 
17110 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65 20 3d  || certificate =
17120 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
17130 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17140 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a  "Returning 0 obj
17150 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 69  ects (NULL), thi
17160 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73 20  s identity does 
17170 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35 30  not have an X.50
17180 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73  9 certificate as
17190 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 74  sociated with it
171a0 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77 6f   and will not wo
171b0 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  rk");....return(
171c0 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56  NULL);..}.../* V
171d0 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74 69  erify that certi
171e0 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31 20  ficate is ASN.1 
171f0 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63 65  encoded X.509 ce
17200 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66  rtificate */..if
17210 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c   (x509_to_serial
17220 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
17230 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 4e  rtificate_len, N
17240 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43 41  ULL) < 0) {...CA
17250 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17260 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
17270 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
17280 68 65 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  he X.509 certifi
17290 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20  cate associated 
172a0 77 69 74 68 20 74 68 69 73 20 69 64 65 6e 74 69  with this identi
172b0 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 22  ty is not valid"
172c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
172d0 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 5f  L);..}...retval_
172e0 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 65 74  count = 64;..ret
172f0 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74  val = malloc(ret
17300 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
17310 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09  of(*retval));...
17320 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 74  for (curr_attr_t
17330 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61 74  ype = 0; curr_at
17340 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35 33  tr_type < 0xce53
17350 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74 72 5f  63bf; curr_attr_
17360 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20 28  type++) {...if (
17370 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
17380 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63 75  = 0x800) {....cu
17390 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30  rr_attr_type = 0
173a0 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a 0a  xce536300;...}..
173b0 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d 20  ..pValue_free = 
173c0 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  0;...pValue = NU
173d0 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
173e0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
173f0 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72  ....switch (curr
17400 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09 09  _attr_type) {...
17410 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a  .case CKA_CLASS:
17420 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17430 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
17440 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
17450 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38 6c  KA_CLASS (0x%08l
17460 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
17470 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
17480 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 63  tr_type);......c
17490 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20 3d  k_object_class =
174a0 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a 09   objectclass;...
174b0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
174c0 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 09  object_class;...
174d0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
174e0 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74 5f  izeof(ck_object_
174f0 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41 43  class);......CAC
17500 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17510 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17520 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
17530 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17540 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  *((CK_OBJECT_CLA
17550 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  SS *) pValue), p
17560 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17570 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17580 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17590 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45  ...case CKA_TOKE
175a0 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
175b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
175c0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
175d0 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25 30   CKA_TOKEN (0x%0
175e0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
175f0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
17600 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
17610 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
17620 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
17630 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
17640 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
17650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17660 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
17670 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
17680 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
17690 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
176a0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
176b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
176c0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
176d0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
176e0 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 09  KA_PRIVATE:.....
176f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17700 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
17710 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 52  attribute CKA_PR
17720 49 56 41 54 45 20 28 30 78 25 30 38 6c 78 29 20  IVATE (0x%08lx) 
17730 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
17740 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
17750 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
17760 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
17770 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
17780 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
17790 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
177a0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
177b0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
177c0 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73  e are not a Nets
177d0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
177e0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
177f0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61  ;.....}......pVa
17800 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
17810 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17820 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
17830 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
17840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17850 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
17860 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
17870 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
17880 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
17890 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
178a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
178b0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
178c0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
178d0 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09 43 41  _TRUSTED:.....CA
178e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
178f0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
17900 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
17910 54 45 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  TED (0x%08lx) ..
17920 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
17930 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
17940 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
17950 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
17960 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
17970 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
17980 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17990 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
179a0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
179b0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
179c0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
179d0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
179e0 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  }......pValue = 
179f0 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c  &ck_true;.....ul
17a00 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
17a10 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09  f(ck_true);.....
17a20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17a30 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
17a40 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
17a50 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
17a60 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
17a70 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
17a80 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
17a90 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
17aa0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17ab0 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  case CKA_MODIFIA
17ac0 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BLE:.....CACKEY_
17ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17ae0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17af0 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  te CKA_MODIFIABL
17b00 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
17b10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17b20 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
17b30 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
17b40 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
17b50 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
17b60 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a  eof(ck_false);..
17b70 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17b80 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
17b90 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
17ba0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
17bb0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
17bc0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
17bd0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17be0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17bf0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17c00 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45  ...case CKA_LABE
17c10 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  L:.....CACKEY_DE
17c20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
17c30 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
17c40 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25 30   CKA_LABEL (0x%0
17c50 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
17c60 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
17c70 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
17c80 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 69  .if (identity->i
17c90 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59  d_type == CACKEY
17ca0 5f 49 44 5f 54 59 50 45 5f 50 49 56 29 20 7b 0a  _ID_TYPE_PIV) {.
17cb0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64  .....pValue = id
17cc0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76  entity->card.piv
17cd0 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75 6c 56  .label;......ulV
17ce0 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  alueLen = strlen
17cf0 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 20  (pValue);.....} 
17d00 65 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c 56 61  else {......ulVa
17d10 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e 74  lueLen = snprint
17d20 66 28 28 63 68 61 72 20 2a 29 20 75 63 54 6d 70  f((char *) ucTmp
17d30 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d  Buf, sizeof(ucTm
17d40 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74 79  pBuf), "Identity
17d50 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65   #%lu", (unsigne
17d60 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
17d70 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56 61 6c  _num);......pVal
17d80 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a  ue = ucTmpBuf;..
17d90 09 09 09 09 09 69 66 20 28 75 6c 56 61 6c 75 65  .....if (ulValue
17da0 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 75 63  Len >= sizeof(uc
17db0 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09 09 09  TmpBuf)) {......
17dc0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 30 3b  .ulValueLen = 0;
17dd0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
17de0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09 09  NULL;......}....
17df0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
17e00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17e10 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
17e20 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
17e30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17e40 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17e50 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17e60 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43  CKA_VALUE:.....C
17e70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17e80 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17e90 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c  ttribute CKA_VAL
17ea0 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  UE (0x%08lx) ...
17eb0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
17ec0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
17ed0 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20  e);......switch 
17ee0 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a  (objectclass) {.
17ef0 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52  .....case CKO_PR
17f00 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09  IVATE_KEY:......
17f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17f20 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17f30 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17f40 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70  cause we are a p
17f50 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a  rivate key.");..
17f60 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17f70 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43  ..case CKO_NETSC
17f80 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 09 09  APE_TRUST:......
17f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17fa0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17fb0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17fc0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
17fd0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
17fe0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 09 62  ject");........b
17ff0 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
18000 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a  CKO_PUBLIC_KEY:.
18010 09 09 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
18020 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
18030 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f 72 65  {........x509_re
18040 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
18050 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66 69 63  _pubkey(certific
18060 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
18070 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
18080 09 09 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  .......if (x509_
18090 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 20  read_ret < 0) { 
180a0 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75 65 20  .........pValue 
180b0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d  = NULL;........}
180c0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09   else {.........
180d0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
180e0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
180f0 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09  ...}.......}....
18100 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
18110 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49  case CKO_CERTIFI
18120 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c  CATE:.......pVal
18130 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  ue = certificate
18140 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  ;.......ulValueL
18150 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  en = certificate
18160 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65  _len;........bre
18170 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ak;.....}......C
18180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18190 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
181a0 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
181b0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
181c0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
181d0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
181e0 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a  case CKA_ISSUER:
181f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18200 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18210 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18220 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38  KA_ISSUER (0x%08
18230 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
18240 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
18250 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
18260 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18270 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
18280 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
18290 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
182a0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
182b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
182c0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
182d0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
182e0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
182f0 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72  a certificate or
18300 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
18310 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
18320 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
18330 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
18340 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
18350 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
18360 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65   = x509_to_issue
18370 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  r(certificate, c
18380 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
18390 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
183a0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
183b0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
183c0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
183d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
183e0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
183f0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
18400 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
18410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18420 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
18430 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
18440 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18450 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18460 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18470 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
18480 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b  NUMBER:.....CACK
18490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
184a0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
184b0 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c  ibute CKA_SERIAL
184c0 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78  _NUMBER (0x%08lx
184d0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
184e0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
184f0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
18500 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
18510 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
18520 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
18530 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
18540 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
18550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18560 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
18570 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
18580 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
18590 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e  certificate or N
185a0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
185b0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
185c0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
185d0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
185e0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
185f0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
18600 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28   x509_to_serial(
18610 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
18620 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
18630 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
18640 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
18650 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
18660 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
18670 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
18680 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
18690 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
186a0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
186b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
186c0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
186d0 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
186e0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
186f0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18700 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18710 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  case CKA_SUBJECT
18720 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18730 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
18740 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
18750 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25  CKA_SUBJECT (0x%
18760 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
18770 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
18780 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
18790 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
187a0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
187b0 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
187c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
187d0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
187e0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
187f0 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
18800 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a 0a 09  ertificate");...
18810 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
18820 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
18830 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
18840 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
18850 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73  _ret = x509_to_s
18860 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61  ubject(certifica
18870 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
18880 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
18890 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
188a0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
188b0 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
188c0 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
188d0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
188e0 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
188f0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
18900 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18910 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
18920 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
18930 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
18940 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18950 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18960 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44  ;....case CKA_ID
18970 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18980 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
18990 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
189a0 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78 29  CKA_ID (0x%08lx)
189b0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
189c0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
189d0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
189e0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
189f0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
18a00 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
18a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18a20 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
18a30 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
18a40 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
18a50 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
18a60 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
18a70 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42  ...}......ucTmpB
18a80 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69  uf[0] = ((identi
18a90 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38  ty_num + 1) >> 8
18aa0 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63  ) & 0xff;.....uc
18ab0 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64  TmpBuf[1] =  (id
18ac0 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20  entity_num + 1) 
18ad0 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61  & 0xff;......pVa
18ae0 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b  lue = &ucTmpBuf;
18af0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18b00 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  = 2;......CACKEY
18b10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18b20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
18b30 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
18b40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
18b50 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
18b60 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
18b70 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
18b80 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
18b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18ba0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18bb0 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43  ute CKA_CERTIFIC
18bc0 41 54 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c  ATE_TYPE (0x%08l
18bd0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
18be0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
18bf0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
18c00 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
18c10 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
18c20 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
18c30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18c40 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18c50 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18c60 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
18c70 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09  ificate.");.....
18c80 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18c90 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73  ..../* We only s
18ca0 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69  upport one certi
18cb0 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09  ficate type */..
18cc0 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74  ...ck_certificat
18cd0 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35  e_type = CKC_X_5
18ce0 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  09;......pValue 
18cf0 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74  = &ck_certificat
18d00 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  e_type;.....ulVa
18d10 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18d20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
18d30 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ype);......CACKE
18d40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18d50 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43   ... returning C
18d60 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28  KC_X_509 (%lu) (
18d70 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
18d80 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
18d90 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
18da0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
18db0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
18dc0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
18dd0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
18de0 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59  .case CKA_KEY_TY
18df0 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PE:.....CACKEY_D
18e00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18e10 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18e20 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28  e CKA_KEY_TYPE (
18e30 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
18e40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
18e50 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
18e60 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
18e70 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56  lass != CKO_PRIV
18e80 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63  ATE_KEY && objec
18e90 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
18ea0 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09  BLIC_KEY) {.....
18eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18ec0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
18ed0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
18ee0 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
18ef0 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09   a key.");......
18f00 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
18f10 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75  .../* We only su
18f20 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79  pport one key ty
18f30 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79  pe */.....ck_key
18f40 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b  _type = CKK_RSA;
18f50 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
18f60 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09  ck_key_type;....
18f70 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
18f80 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65  zeof(ck_key_type
18f90 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
18fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18fb0 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f  . returning CKK_
18fc0 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  RSA (%lu) (%p/%l
18fd0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
18fe0 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
18ff0 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
19000 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
19010 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19020 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19030 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19040 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43   CKA_SIGN:.....C
19050 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19060 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
19070 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47  ttribute CKA_SIG
19080 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  N (0x%08lx) ..."
19090 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
190a0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
190b0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
190c0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
190d0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
190e0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
190f0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19100 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
19110 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
19120 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
19130 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
19140 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
19150 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
19160 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
19170 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
19180 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
19190 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
191a0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
191b0 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
191c0 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
191d0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
191e0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
191f0 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
19200 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
19210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19220 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
19230 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
19240 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
19250 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
19260 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
19270 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
19280 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
19290 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
192a0 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a  KA_SIGN_RECOVER:
192b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
192c0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
192d0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
192e0 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20  KA_SIGN_RECOVER 
192f0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
19300 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19310 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
19320 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19330 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
19340 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
19350 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19360 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
19370 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
19380 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
19390 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
193a0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
193b0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
193c0 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74  .../* We current
193d0 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ly only support 
193e0 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e  "Sign with Appen
193f0 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c  dix" */.....pVal
19400 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
19410 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
19420 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
19430 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
19440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19450 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
19460 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
19470 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
19480 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
19490 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
194a0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
194b0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
194c0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
194d0 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43  DECRYPT:.....CAC
194e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
194f0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
19500 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59  ribute CKA_DECRY
19510 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PT (0x%08lx) ...
19520 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19530 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19540 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
19550 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
19560 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
19570 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19580 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19590 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
195a0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
195b0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
195c0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
195d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
195e0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
195f0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
19600 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65  VATE_KEY || obje
19610 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
19620 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09  UBLIC_KEY) {....
19630 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
19640 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
19650 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
19660 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
19670 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
19680 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
19690 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
196a0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
196b0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
196c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
196d0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
196e0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
196f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19700 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
19710 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
19720 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19730 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19740 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19750 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
19760 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19770 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19780 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19790 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78 25  A_SENSITIVE (0x%
197a0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
197b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
197c0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
197d0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
197e0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
197f0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
19800 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19810 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19820 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19830 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
19840 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
19850 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
19860 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
19870 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
19880 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
19890 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
198a0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
198b0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
198c0 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
198d0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
198e0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
198f0 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
19900 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
19910 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
19920 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19930 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
19940 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
19950 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
19960 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
19970 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
19980 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
19990 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
199a0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
199b0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54  ....case CKA_EXT
199c0 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 43 41  RACTABLE:.....CA
199d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
199e0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
199f0 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58 54 52  tribute CKA_EXTR
19a00 41 43 54 41 42 4c 45 20 28 30 78 25 30 38 6c 78  ACTABLE (0x%08lx
19a10 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19a20 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19a30 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
19a40 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
19a50 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19a60 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
19a70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19a80 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
19a90 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
19aa0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
19ab0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
19ac0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
19ad0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
19ae0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
19af0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
19b00 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
19b10 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
19b20 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
19b30 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
19b40 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
19b50 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
19b60 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
19b70 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
19b80 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
19b90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19ba0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
19bb0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
19bc0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
19bd0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
19be0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
19bf0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
19c00 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
19c10 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19c20 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
19c30 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19c40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19c50 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19c60 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25  CKA_MODULUS (0x%
19c70 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19c80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19c90 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
19ca0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
19cb0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
19cc0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
19cd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19ce0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19cf0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19d00 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
19d10 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
19d20 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
19d30 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
19d40 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
19d50 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
19d60 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
19d70 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28  x509_to_modulus(
19d80 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
19d90 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
19da0 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
19db0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
19dc0 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
19dd0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
19de0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
19df0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
19e00 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
19e10 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
19e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19e30 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
19e40 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
19e50 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
19e60 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
19e70 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19e80 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f  case CKA_PUBLIC_
19e90 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41  EXPONENT:.....CA
19ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19eb0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
19ec0 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c  tribute CKA_PUBL
19ed0 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25  IC_EXPONENT (0x%
19ee0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19ef0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19f00 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
19f10 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
19f20 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
19f30 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
19f40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19f50 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19f60 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19f70 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
19f80 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
19f90 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
19fa0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
19fb0 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
19fc0 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
19fd0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
19fe0 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74  x509_to_exponent
19ff0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
1a000 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
1a010 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
1a020 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
1a030 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
1a040 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1a050 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1a060 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
1a070 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
1a080 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
1a090 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a0a0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1a0b0 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
1a0c0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1a0d0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1a0e0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1a0f0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
1a100 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52  DIGITAL_SIGNATUR
1a110 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  E:....case CKA_T
1a120 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41  RUST_NON_REPUDIA
1a130 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  TION:....case CK
1a140 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49  A_TRUST_KEY_ENCI
1a150 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73  PHERMENT:....cas
1a160 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 54 41  e CKA_TRUST_DATA
1a170 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09  _ENCIPHERMENT:..
1a180 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1a190 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a  _KEY_AGREEMENT:.
1a1a0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1a1b0 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a  T_KEY_CERT_SIGN:
1a1c0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1a1d0 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09  ST_CRL_SIGN:....
1a1e0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53  case CKA_TRUST_S
1a1f0 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 63  ERVER_AUTH:....c
1a200 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c  ase CKA_TRUST_CL
1a210 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63 61  IENT_AUTH:....ca
1a220 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  se CKA_TRUST_COD
1a230 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61  E_SIGNING:....ca
1a240 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41  se CKA_TRUST_EMA
1a250 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09  IL_PROTECTION:..
1a260 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a270 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1a280 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1a290 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30  _TRUST_... (0x%0
1a2a0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1a2b0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1a2c0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1a2d0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
1a2e0 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c  usted;.....ulVal
1a2f0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1a300 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 09 09  k_trusted);.....
1a310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a320 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1a330 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
1a340 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1a350 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 54 20  ng) *((CK_TRUST 
1a360 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1a370 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1a380 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1a390 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1a3a0 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 53 48  case CKA_CERT_SH
1a3b0 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43  A1_HASH:.....CAC
1a3c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a3d0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1a3e0 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f  ribute CKA_CERT_
1a3f0 53 48 41 31 5f 48 41 53 48 20 28 30 78 25 30 38  SHA1_HASH (0x%08
1a400 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1a410 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1a420 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1a430 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1a440 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
1a450 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1a460 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a470 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1a480 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1a490 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
1a4a0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1a4b0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1a4c0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1a4d0 09 53 48 41 31 52 65 73 65 74 28 26 73 68 61 31  .SHA1Reset(&sha1
1a4e0 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41 31 49  _ctx);.....SHA1I
1a4f0 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78 2c 20  nput(&sha1_ctx, 
1a500 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
1a510 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
1a520 09 09 09 53 48 41 31 52 65 73 75 6c 74 28 26 73  ...SHA1Result(&s
1a530 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f 68 61  ha1_ctx, sha1_ha
1a540 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  sh);......pValue
1a550 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a 09 09   = sha1_hash;...
1a560 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1a570 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 68 29  izeof(sha1_hash)
1a580 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1a590 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a5a0 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
1a5b0 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
1a5c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a5d0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a5e0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a5f0 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a  _CERT_MD5_HASH:.
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 52 65 71 75 65 73 74  _PRINTF("Request
1a620 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1a630 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 20  A_CERT_MD5_HASH 
1a640 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1a650 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a660 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1a670 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1a680 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
1a690 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1a6a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a6b0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1a6c0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1a6d0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1a6e0 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74  not a Netscape t
1a6f0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1a700 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1a710 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 28 26  }......MD5Init(&
1a720 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44  md5_ctx);.....MD
1a730 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63 74 78  5Update(&md5_ctx
1a740 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  , certificate, c
1a750 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1a760 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64  .....MD5Final(md
1a770 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 74 78  5_hash, &md5_ctx
1a780 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
1a790 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 09 75   md5_hash;.....u
1a7a0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1a7b0 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09  of(md5_hash);...
1a7c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a7d0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1a7e0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1a7f0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a800 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a810 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a820 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
1a830 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
1a840 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a850 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09   (CK_LONG) -1;..
1a860 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
1a870 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20  .if (((CK_LONG) 
1a880 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28  ulValueLen) != (
1a890 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b  (CK_LONG) -1)) {
1a8a0 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72  ..../* Push curr
1a8b0 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73  _attr onto the s
1a8c0 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f  tack */....curr_
1a8d0 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72  attr.type = curr
1a8e0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63  _attr_type;....c
1a8f0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
1a900 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
1a910 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  ;.....curr_attr.
1a920 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
1a930 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
1a940 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79  eLen);....memcpy
1a950 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  (curr_attr.pValu
1a960 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  e, pValue, curr_
1a970 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
1a980 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65  ;.....if (pValue
1a990 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29  _free && pValue)
1a9a0 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c   {.....free(pVal
1a9b0 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ue);....}.....if
1a9c0 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65   (numattrs >= re
1a9d0 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  tval_count) {...
1a9e0 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
1a9f0 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61  oc(retval, retva
1aa00 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
1aa10 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d  (*retval));....}
1aa20 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74  .....memcpy(&ret
1aa30 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26  val[numattrs], &
1aa40 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f  curr_attr, sizeo
1aa50 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09  f(curr_attr));..
1aa60 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09  ..numattrs++;...
1aa70 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74  }..}...if (numat
1aa80 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65  trs != 0) {...re
1aa90 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d  tval_count = num
1aaa0 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20  attrs;...retval 
1aab0 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
1aac0 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
1aad0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
1aae0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66  );..} else {...f
1aaf0 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ree(retval);....
1ab00 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  retval = NULL;..
1ab10 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  }...*pulCount = 
1ab20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b  numattrs;...CACK
1ab30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ab40 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f  "Returning %lu o
1ab50 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e  bjects (%p).", n
1ab60 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 20 2a  umattrs, (void *
1ab70 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
1ab80 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1ab90 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
1aba0 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
1abb0 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
1abc0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
1abd0 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20  ities, unsigned 
1abe0 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
1abf0 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54  count) {..CK_ATT
1ac00 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
1ac10 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  r;..unsigned lon
1ac20 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69  g id_idx, attr_i
1ac30 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  dx;...if (identi
1ac40 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  ties == NULL || 
1ac50 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
1ac60 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   == 0) {...retur
1ac70 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f  n;..}...for (id_
1ac80 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20  idx = 0; id_idx 
1ac90 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  < identities_cou
1aca0 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a  nt; id_idx++) {.
1acb0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1acc0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1acd0 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61  tes) {....for (a
1ace0 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
1acf0 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69  r_idx < identiti
1ad00 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1ad10 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74  butes_count; att
1ad20 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63  r_idx++) {.....c
1ad30 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e  urr_attr = &iden
1ad40 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1ad50 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69  ttributes[attr_i
1ad60 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75  dx];......if (cu
1ad70 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
1ad80 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
1ad90 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b  r_attr->pValue);
1ada0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
1adb0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
1adc0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1add0 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64  s) {.....free(id
1ade0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1adf0 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09  .attributes);...
1ae00 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
1ae10 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74  ee_certs(identit
1ae20 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1ae30 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29  _identity, 1, 1)
1ae40 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28  ;...}..}...free(
1ae50 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a  identities);.}..
1ae60 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
1ae70 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 61 64  long cackey_read
1ae80 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
1ae90 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
1aea0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69  entity *identiti
1aeb0 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  es, unsigned lon
1aec0 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  g num_dod_certs)
1aed0 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
1aee0 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64 5f 69  g cert_idx, id_i
1aef0 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64  dx = 0;...if (id
1af00 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
1af10 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d  ) {...return(num
1af20 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 29 3b  _dod_certs * 3);
1af30 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f  ..}...for (cert_
1af40 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64  idx = 0; cert_id
1af50 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  x < num_dod_cert
1af60 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
1af70 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1af80 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1af90 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64  ity = NULL;...id
1afa0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1afb0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
1afc0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
1afd0 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43  tes(CKO_CERTIFIC
1afe0 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74  ATE, &extra_cert
1aff0 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66  s[cert_idx], 0xf
1b000 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20  000 | cert_idx, 
1b010 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
1b020 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
1b030 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b  ount);...id_idx+
1b040 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73  +;....identities
1b050 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1b060 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
1b070 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1b080 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
1b090 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
1b0a0 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49  ibutes(CKO_PUBLI
1b0b0 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65  C_KEY, &extra_ce
1b0c0 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
1b0d0 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
1b0e0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1b0f0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1b100 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
1b110 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69  x++;....identiti
1b120 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1b130 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
1b140 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1b150 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1b160 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
1b170 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54  tributes(CKO_NET
1b180 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78  SCAPE_TRUST, &ex
1b190 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69  tra_certs[cert_i
1b1a0 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65  dx], 0xf000 | ce
1b1b0 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
1b1c0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1b1d0 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  ibutes_count);..
1b1e0 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09  .id_idx++;..}...
1b1f0 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a  return(id_idx);.
1b200 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
1b210 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1b220 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64   *cackey_read_id
1b230 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20  entities(struct 
1b240 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
1b250 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  t, unsigned long
1b260 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09   *ids_found) {..
1b270 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
1b280 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
1b290 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73  c_identities;..s
1b2a0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1b2b0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
1b2c0 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
1b2d0 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64  g num_ids, id_id
1b2e0 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b  x, curr_id_type;
1b2f0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
1b300 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64  num_certs, num_d
1b310 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69  od_certs, cert_i
1b320 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65  dx;..int include
1b330 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30  _extra_certs = 0
1b340 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  , include_dod_ce
1b350 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  rts;...CACKEY_DE
1b360 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1b370 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73  ed.");...if (ids
1b380 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20  _found == NULL) 
1b390 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b3a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b3b0 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55   ids_found is NU
1b3c0 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
1b3d0 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64 65  NULL);..}..#ifde
1b3e0 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f 53 4c  f CACKEY_CARD_SL
1b3f0 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41  OT_INCLUDE_EXTRA
1b400 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 65 5f  _CERTS..include_
1b410 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b  extra_certs = 1;
1b420 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65  .#endif...if (ge
1b430 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 4f 44  tenv("CACKEY_DOD
1b440 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f  _CERTS_ON_HW_SLO
1b450 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1b460 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
1b470 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09  certs = 1;..}...
1b480 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1b490 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 53 5f  EY_NO_DOD_CERTS_
1b4a0 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d  ON_HW_SLOTS") !=
1b4b0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1b4c0 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1b4d0 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43   0;..}..#ifdef C
1b4e0 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1b4f0 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76  ERTS..if (getenv
1b500 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43  ("CACKEY_EXTRA_C
1b510 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1b520 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1b530 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c  certs = 1;..} el
1b540 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  se {...include_d
1b550 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1b560 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65  .#else..if (gete
1b570 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  nv("CACKEY_NO_EX
1b580 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1b590 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1b5a0 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1b5b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c  .} else {...incl
1b5c0 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1b5d0 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69  1;..}.#endif...i
1b5e0 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  f (include_dod_c
1b5f0 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f  erts) {...num_do
1b600 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 6f 66  d_certs = sizeof
1b610 28 65 78 74 72 61 5f 63 65 72 74 73 29 20 2f 20  (extra_certs) / 
1b620 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72  sizeof(extra_cer
1b630 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73 65 20  ts[0]);..} else 
1b640 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  {...num_dod_cert
1b650 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 0;..}...if (
1b660 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20  slot->internal) 
1b670 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  {...num_ids = ca
1b680 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64  ckey_read_dod_id
1b690 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e  entities(NULL, n
1b6a0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 0a  um_dod_certs);..
1b6b0 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 21 3d  ..if (num_ids !=
1b6c0 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 69 74   0) {....identit
1b6d0 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d  ies = malloc(num
1b6e0 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69  _ids * sizeof(*i
1b6f0 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09  dentities));....
1b700 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64  .cackey_read_dod
1b710 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e  _identities(iden
1b720 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f  tities, num_dod_
1b730 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73 65  certs);...} else
1b740 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73   {....identities
1b750 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
1b760 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d  *ids_found = num
1b770 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _ids;....return(
1b780 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a  identities);..}.
1b790 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
1b7a0 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
1b7b0 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c  certs(slot, NULL
1b7c0 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
1b7d0 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
1b7e0 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
1b7f0 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62  ./* Convert numb
1b800 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e  er of Certs to n
1b810 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
1b820 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20   */...num_ids = 
1b830 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59  (CKO_PRIVATE_KEY
1b840 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   - CKO_CERTIFICA
1b850 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65  TE + 1) * num_ce
1b860 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63 6c  rts;....if (incl
1b870 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29  ude_extra_certs)
1b880 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b 3d   {....num_ids +=
1b890 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1b8a0 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c  _identities(NULL
1b8b0 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1b8c0 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69 74  ;...}....identit
1b8d0 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d  ies = malloc(num
1b8e0 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69  _ids * sizeof(*i
1b8f0 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09  dentities));....
1b900 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 63 61  /* Add certifica
1b910 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79 73  tes, public keys
1b920 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b 65  , and private ke
1b930 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61 72  ys from the smar
1b940 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64  tcard */...id_id
1b950 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65  x = 0;...for (ce
1b960 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74  rt_idx = 0; cert
1b970 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73  _idx < num_certs
1b980 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
1b990 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ...for (curr_id_
1b9a0 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49  type = CKO_CERTI
1b9b0 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f  FICATE; curr_id_
1b9c0 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56  type <= CKO_PRIV
1b9d0 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64  ATE_KEY; curr_id
1b9e0 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69  _type++) {.....i
1b9f0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1ba00 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1ba10 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1ba20 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70  utes(curr_id_typ
1ba30 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74  e, &pcsc_identit
1ba40 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63  ies[cert_idx], c
1ba50 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
1ba60 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1ba70 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
1ba80 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
1ba90 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1baa0 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
1bab0 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
1bac0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1bad0 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d  dentity));.....m
1bae0 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
1baf0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1bb00 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64  entity, &pcsc_id
1bb10 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1bb20 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e  x], sizeof(*iden
1bb30 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1bb40 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a  csc_identity));.
1bb50 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
1bb60 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1bb70 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
1bb80 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  te = malloc(pcsc
1bb90 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1bba0 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
1bbb0 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63  e_len);.....memc
1bbc0 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  py(identities[id
1bbd0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1bbe0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
1bbf0 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  , pcsc_identitie
1bc00 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
1bc10 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
1bc20 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1bc30 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
1bc40 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78  en);......id_idx
1bc50 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ++;....}...}....
1bc60 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72  if (include_extr
1bc70 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43 41  a_certs) {....CA
1bc80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bc90 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 53 20  F("Including US 
1bca0 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69  Government Certi
1bcb0 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64 77  ficates on hardw
1bcc0 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09  are slot");.....
1bcd0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1bce0 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74  identities(ident
1bcf0 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c 20  ities + id_idx, 
1bd00 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
1bd10 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
1bd20 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
1bd30 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
1bd40 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73  rts, 1);....*ids
1bd50 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
1bd60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
1bd70 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a  tities);..}....*
1bd80 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09  ids_found = 0;..
1bd90 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a  return(NULL);.}.
1bda0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1bdb0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
1bdc0 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  tialize)(CK_VOID
1bdd0 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 20  _PTR pInitArgs) 
1bde0 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  {..CK_C_INITIALI
1bdf0 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61  ZE_ARGS CK_PTR a
1be00 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69  rgs;..uint32_t i
1be10 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74  dx, highest_slot
1be20 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69  ;..int mutex_ini
1be30 74 5f 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c  t_ret;..int incl
1be40 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a  ude_dod_certs;..
1be50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1be60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1be70 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e  ...if (cackey_in
1be80 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1be90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bea0 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65  TF("Error.  Alre
1beb0 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  ady initialized.
1bec0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1bed0 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41  R_CRYPTOKI_ALREA
1bee0 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  DY_INITIALIZED);
1bef0 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41  ..}...if (pInitA
1bf00 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rgs != NULL) {..
1bf10 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67  .args = pInitArg
1bf20 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63  s;...memcpy(&cac
1bf30 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20  key_args, args, 
1bf40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72  sizeof(cackey_ar
1bf50 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67  gs));....if (arg
1bf60 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d  s->CreateMutex =
1bf70 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1bf80 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20  DestroyMutex == 
1bf90 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f  NULL || args->Lo
1bfa0 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  ckMutex == NULL 
1bfb0 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d  || args->UnlockM
1bfc0 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  utex == NULL) {.
1bfd0 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
1bfe0 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ateMutex != NULL
1bff0 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
1c000 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  yMutex != NULL |
1c010 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
1c020 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1c030 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21  s->UnlockMutex !
1c040 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
1c050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c060 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20  F("Error. Some, 
1c070 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65  but not All thre
1c080 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  ading primitives
1c090 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09   provided.");...
1c0a0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1c0b0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
1c0c0 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  .}...}..} else {
1c0d0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  ...cackey_args.C
1c0e0 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c  reateMutex = NUL
1c0f0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1c100 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20  .DestroyMutex = 
1c110 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1c120 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20  rgs.LockMutex = 
1c130 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1c140 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  rgs.UnlockMutex 
1c150 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1c160 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b  _args.flags = 0;
1c170 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1c180 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
1c190 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c1a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c1b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1c1c0 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63  ; idx++) {...cac
1c1d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1c1e0 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  ].active = 0;..}
1c1f0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1c200 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1c210 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1c220 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1c230 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
1c240 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  {...cackey_slots
1c250 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30  [idx].active = 0
1c260 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1c270 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
1c280 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  r = NULL;...cack
1c290 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
1c2a0 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
1c2b0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1c2c0 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
1c2d0 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
1c2e0 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  k = 0;...cackey_
1c2f0 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f  slots[idx].slot_
1c300 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63  reset = 0;...cac
1c310 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
1c320 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
1c330 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1c340 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  dx].label = NULL
1c350 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1c360 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  [idx].internal =
1c370 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43   0;..}..#ifdef C
1c380 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1c390 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76  ERTS..if (getenv
1c3a0 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43  ("CACKEY_EXTRA_C
1c3b0 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1c3c0 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1c3d0 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c  certs = 1;..} el
1c3e0 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  se {...include_d
1c3f0 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1c400 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65  .#else..if (gete
1c410 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  nv("CACKEY_NO_EX
1c420 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1c430 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1c440 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1c450 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c  .} else {...incl
1c460 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1c470 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69  1;..}.#endif...i
1c480 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  f (include_dod_c
1c490 65 72 74 73 20 3d 3d 20 30 29 20 7b 0a 09 09 43  erts == 0) {...C
1c4a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c4b0 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f  TF("Asked not to
1c4c0 20 69 6e 63 6c 75 64 65 20 44 6f 44 20 63 65 72   include DoD cer
1c4d0 74 69 66 69 63 61 74 65 73 22 29 3b 0a 09 7d 20  tificates");..} 
1c4e0 65 6c 73 65 20 7b 0a 09 09 68 69 67 68 65 73 74  else {...highest
1c4f0 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28  _slot = (sizeof(
1c500 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1c510 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1c520 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09  ots[0])) - 1;...
1c530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c540 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20  INTF("Including 
1c550 44 6f 44 20 63 65 72 74 73 20 69 6e 20 73 6c 6f  DoD certs in slo
1c560 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  t %lu", (unsigne
1c570 64 20 6c 6f 6e 67 29 20 68 69 67 68 65 73 74 5f  d long) highest_
1c580 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79  slot);....cackey
1c590 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1c5a0 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b  lot].active = 1;
1c5b0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1c5c0 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e  highest_slot].in
1c5d0 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61  ternal = 1;...ca
1c5e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1c5f0 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  st_slot].label =
1c600 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1c610 2a 29 20 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e  *) "US Governmen
1c620 74 20 43 65 72 74 69 66 69 63 61 74 65 73 22 3b  t Certificates";
1c630 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1c640 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63  highest_slot].pc
1c650 73 63 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43  sc_reader = "CAC
1c660 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73  Key";...cackey_s
1c670 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1c680 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t].token_flags =
1c690 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f   0;..}...cackey_
1c6a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
1c6b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62  ...if (!cackey_b
1c6c0 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09  iglock_init) {..
1c6d0 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  .mutex_init_ret 
1c6e0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63  = cackey_mutex_c
1c6f0 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69  reate(&cackey_bi
1c700 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d  glock);....if (m
1c710 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d  utex_init_ret !=
1c720 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
1c730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c740 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74  ror.  Mutex init
1c750 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65  ialization faile
1c760 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
1c770 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b  (CKR_CANT_LOCK);
1c780 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62  ...}....cackey_b
1c790 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b  iglock_init = 1;
1c7a0 0a 09 7d 0a 0a 09 2f 2a 20 44 65 66 69 6e 65 20  ..}.../* Define 
1c7b0 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f  a command to pro
1c7c0 6d 70 74 20 75 73 65 72 20 66 6f 72 20 61 20 50  mpt user for a P
1c7d0 49 4e 20 2a 2f 0a 23 69 66 64 65 66 20 43 41 43  IN */.#ifdef CAC
1c7e0 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1c7f0 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f  DEFAULT..cackey_
1c800 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 43 41  pin_command = CA
1c810 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1c820 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41  _DEFAULT_XSTR(CA
1c830 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1c840 5f 44 45 46 41 55 4c 54 29 3b 0a 23 65 6e 64 69  _DEFAULT);.#endi
1c850 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  f..#ifdef CACKEY
1c860 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1c870 4c 59 5f 44 45 46 41 55 4c 54 0a 09 69 66 20 28  LY_DEFAULT..if (
1c880 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22  getenv("DISPLAY"
1c890 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1c8a0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1c8b0 64 20 3d 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43  d = CACKEY_PIN_C
1c8c0 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 5f 58  OMMAND_DEFAULT_X
1c8d0 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43  STR(CACKEY_PIN_C
1c8e0 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46  OMMAND_XONLY_DEF
1c8f0 41 55 4c 54 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  AULT);..}.#endif
1c900 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1c910 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1c920 44 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  D") != NULL) {..
1c930 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  .cackey_pin_comm
1c940 61 6e 64 20 3d 20 67 65 74 65 6e 76 28 22 43 41  and = getenv("CA
1c950 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1c960 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74  ");..}...if (get
1c970 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f  env("CACKEY_PIN_
1c980 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 20  COMMAND_XONLY") 
1c990 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65 74 65 6e  != NULL && geten
1c9a0 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20  v("DISPLAY") != 
1c9b0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1c9c0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 67  _pin_command = g
1c9d0 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1c9e0 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22  N_COMMAND_XONLY"
1c9f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1ca00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1ca10 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1ca20 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1ca30 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1ca40 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1ca50 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
1ca60 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  inalize)(CK_VOID
1ca70 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
1ca80 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
1ca90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1caa0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1cab0 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
1cac0 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
1cad0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cae0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
1caf0 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
1cb00 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1cb10 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1cb20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1cb30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1cb40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1cb50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cb60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1cb70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1cb80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1cb90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1cba0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
1cbb0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1cbc0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1cbd0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1cbe0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
1cbf0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1cc00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1cc10 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
1cc20 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
1cc30 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  (idx);...}..}...
1cc40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
1cc50 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
1cc60 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1cc70 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1cc80 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1cc90 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1cca0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1ccb0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1ccc0 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
1ccd0 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
1cce0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
1ccf0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1cd00 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09  sc_reader) {....
1cd10 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
1cd20 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
1cd30 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  er);...}....if (
1cd40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1cd50 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ].cached_certs) 
1cd60 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  {....cackey_free
1cd70 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f 73 6c  _certs(cackey_sl
1cd80 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1cd90 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f 73 6c  certs, cackey_sl
1cda0 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1cdb0 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b  certs_count, 1);
1cdc0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1cdd0 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
1cde0 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  rts = NULL;...}.
1cdf0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  .}...cackey_pcsc
1ce00 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  _disconnect();..
1ce10 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
1ce20 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  zed = 0;...CACKE
1ce30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ce40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1ce50 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1ce60 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1ce70 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1ce80 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1ce90 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e  C_GetInfo)(CK_IN
1cea0 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1ceb0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1cec0 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
1ced0 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
1cee0 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
1cef0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69  c CK_UTF8CHAR li
1cf00 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1cf10 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a  [] = "CACKey";..
1cf20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cf30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1cf40 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
1cf50 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1cf60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cf70 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
1cf80 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1cf90 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1cfa0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1cfb0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1cfc0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1cfd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cfe0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1cff0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1d000 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1d010 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1d020 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72  ;..}...pInfo->cr
1d030 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61  yptokiVersion.ma
1d040 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
1d050 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
1d060 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
1d070 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  xff;..pInfo->cry
1d080 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e  ptokiVersion.min
1d090 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
1d0a0 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
1d0b0 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
1d0c0 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  f;...memset(pInf
1d0d0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1d0e0 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
1d0f0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1d100 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
1d110 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1d120 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
1d130 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
1d140 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
1d150 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  1);...pInfo->fla
1d160 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d  gs = 0x00;...mem
1d170 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  set(pInfo->libra
1d180 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  ryDescription, '
1d190 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1d1a0 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1d1b0 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
1d1c0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
1d1d0 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61  scription, libra
1d1e0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  ryDescription, s
1d1f0 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73  izeof(libraryDes
1d200 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
1d210 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  ..pInfo->library
1d220 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1d230 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
1d240 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
1d250 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  ff;..pInfo->libr
1d260 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  aryVersion.minor
1d270 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1d280 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1d290 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
1d2a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1d2b0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1d2c0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1d2d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1d2e0 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73  }../*. * Process
1d2f0 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
1d300 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70  , and create map
1d310 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61  ping between rea
1d320 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f  der name and slo
1d330 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49  t ID. */.CK_DEFI
1d340 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1d350 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  V, C_GetSlotList
1d360 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e  )(CK_BBOOL token
1d370 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54  Present, CK_SLOT
1d380 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73  _ID_PTR pSlotLis
1d390 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1d3a0 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
1d3b0 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63 61  tic int first_ca
1d3c0 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  ll = 1;..int mut
1d3d0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
1d3e0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
1d3f0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e  ;..CK_ULONG coun
1d400 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  t, slot_count = 
1d410 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f  0, currslot, slo
1d420 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63  t_idx;..char *pc
1d430 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73  sc_readers, *pcs
1d440 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63  c_readers_s, *pc
1d450 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44  sc_readers_e;..D
1d460 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72  WORD pcsc_reader
1d470 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  s_len;..LONG sca
1d480 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1d490 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72  et;..size_t curr
1d4a0 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e  _reader_len;..in
1d4b0 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09  t slot_reset;...
1d4c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d4d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1d4e0 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d  ..if (pulCount =
1d4f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1d500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d510 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74  "Error. pulCount
1d520 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1d530 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1d540 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1d550 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1d560 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1d570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d580 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1d590 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1d5a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1d5b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1d5c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  IZED);..}...mute
1d5d0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1d5e0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1d5f0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1d600 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1d610 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1d620 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d630 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1d640 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1d650 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1d660 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ERROR);..}.../* 
1d670 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c  Clear list of sl
1d680 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73  ots */..slot_res
1d690 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c  et = 0;..if (pSl
1d6a0 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69 66 20 28  otList) {...if (
1d6b0 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09  first_call) {...
1d6c0 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b  .first_call = 0;
1d6d0 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20  .....slot_reset 
1d6e0 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49  = 1;...}..../* I
1d6f0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f  f any of the slo
1d700 74 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 73  ts have been res
1d710 65 74 20 74 68 65 6e 20 70 75 72 67 65 20 61 6c  et then purge al
1d720 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  l information an
1d730 64 20 63 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f  d check again */
1d740 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
1d750 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
1d760 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1d770 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1d780 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1d790 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1d7a0 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1d7b0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
1d7c0 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63  nternal) {.....c
1d7d0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
1d7e0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
1d7f0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1d800 74 69 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74  tive) {.....cont
1d810 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
1d820 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1d830 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72  currslot].slot_r
1d840 65 73 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74  eset) {.....slot
1d850 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09  _reset = 1;.....
1d860 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
1d870 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73  ....if (slot_res
1d880 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
1d890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75  DEBUG_PRINTF("Pu
1d8a0 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69  rging all slot i
1d8b0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a  nformation.");..
1d8c0 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74  .../* Only updat
1d8d0 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c  e the list of sl
1d8e0 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63  ots if we are ac
1d8f0 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70  tually being sup
1d900 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66  ply the slot inf
1d910 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  ormation */....c
1d920 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
1d930 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
1d940 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
1d950 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
1d960 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1d970 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1d980 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1d990 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
1d9a0 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1d9b0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
1d9c0 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09  nternal) {......
1d9d0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
1d9e0 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1d9f0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1da00 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09  pcsc_reader) {..
1da10 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
1da20 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1da30 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
1da40 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1da50 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1da60 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
1da70 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61  ...}......if (ca
1da80 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1da90 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09  lot].label) {...
1daa0 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
1dab0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1dac0 61 62 65 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63  abel);.......cac
1dad0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1dae0 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
1daf0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
1db00 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1db10 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  ot].active = 0;.
1db20 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
1db30 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  ......}..}.../* 
1db40 44 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f  Determine list o
1db50 66 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63  f readers */..pc
1db60 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
1db70 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
1db80 6e 65 63 74 28 29 3b 0a 2f 2a 20 58 58 58 3a 20  nect();./* XXX: 
1db90 43 41 4e 20 48 41 4e 47 20 48 45 52 45 20 21 20  CAN HANG HERE ! 
1dba0 2a 2f 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  */..if (pcsc_con
1dbb0 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
1dbc0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
1dbd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dbe0 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
1dbf0 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
1dc00 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73  d, assuming no s
1dc10 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f  lots");....slot_
1dc20 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c  count = 0;..} el
1dc30 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64  se {...pcsc_read
1dc40 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09  ers_len = 0;....
1dc50 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1dc60 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
1dc70 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
1dc80 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
1dc90 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
1dca0 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09  readers_len);...
1dcb0 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1dcc0 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1dcd0 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
1dce0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1dcf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1dd00 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  r. SCardListRead
1dd10 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  ers() returned S
1dd20 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
1dd30 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e  R, assuming Conn
1dd40 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20  ection to PC/SC 
1dd50 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e  went away. Recon
1dd60 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09  necting.");.....
1dd70 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1dd80 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63  onnect();....cac
1dd90 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
1dda0 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ();.....CACKEY_D
1ddb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79  EBUG_PRINTF("Try
1ddc0 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61  ing SCardListRea
1ddd0 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a  ders() again");.
1dde0 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1ddf0 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1de00 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1de10 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1de20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63   NULL, NULL, &pc
1de30 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1de40 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
1de50 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1de60 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
1de70 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61  CESS && pcsc_rea
1de80 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  ders_len != 0) {
1de90 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
1dea0 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72   = malloc(pcsc_r
1deb0 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
1dec0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d  pcsc_readers_s =
1ded0 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a   pcsc_readers;..
1dee0 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1def0 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1df00 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1df10 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1df20 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64   NULL, pcsc_read
1df30 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ers, &pcsc_reade
1df40 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  rs_len);....if (
1df50 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1df60 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
1df70 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
1df80 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d  pcsc_readers_e =
1df90 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20   pcsc_readers + 
1dfa0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1dfb0 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20  ;....../* Start 
1dfc0 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20  with Slot ID 1, 
1dfd0 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69  to avoid a bug i
1dfe0 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f  n GDM on RHEL */
1dff0 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39  ...../* Bug 5949
1e000 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a  11: https://bugz
1e010 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f  illa.redhat.com/
1e020 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
1e030 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75  594911 */.....cu
1e040 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09  rrslot = 1;.....
1e050 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  slot_count = 0;.
1e060 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f  ....while (pcsc_
1e070 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72  readers < pcsc_r
1e080 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
1e090 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76  ./* Find next av
1e0a0 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a  ailable slot */.
1e0b0 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72  .....for (; curr
1e0c0 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1e0d0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1e0e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1e0f0 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1e100 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20  t++) {.......if 
1e110 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1e120 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1e130 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b   {........break;
1e140 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
1e150 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65  ......curr_reade
1e160 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  r_len = strlen(p
1e170 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
1e180 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65  ....if ((pcsc_re
1e190 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61  aders + curr_rea
1e1a0 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f  der_len) > pcsc_
1e1b0 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
1e1c0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1e1d0 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  .......if (curr_
1e1e0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29  reader_len == 0)
1e1f0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
1e200 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
1e210 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69  (currslot >= (si
1e220 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e230 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e240 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1e250 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1e260 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1e270 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74  d more readers t
1e280 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76  han slots are av
1e290 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09  ailable!");.....
1e2a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1e2b0 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1e2c0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1e2d0 64 20 72 65 61 64 65 72 3a 20 25 73 20 28 63 75  d reader: %s (cu
1e2e0 72 72 73 6c 6f 74 20 3d 20 25 6c 75 29 22 2c 20  rrslot = %lu)", 
1e2f0 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 28 75  pcsc_readers, (u
1e300 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1e310 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 2f  rrslot);......./
1e320 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
1e330 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
1e340 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
1e350 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73  ly being asked s
1e360 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
1e370 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
1e380 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
1e390 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 6c  ) {.......if (sl
1e3a0 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09  ot_reset) {.....
1e3b0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1e3c0 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
1e3d0 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63 61 63   = 1;........cac
1e3e0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1e3f0 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30  ot].internal = 0
1e400 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
1e410 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1e420 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74  pcsc_reader = st
1e430 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72  rdup(pcsc_reader
1e440 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65  s);........cacke
1e450 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1e460 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
1e470 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09  ected = 0;......
1e480 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1e490 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63  urrslot].transac
1e4a0 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
1e4b0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1e4c0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
1e4d0 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
1e4e0 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 09  w_lock = 0;.....
1e4f0 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
1e500 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c  n_command == NUL
1e510 4c 29 20 7b 0a 09 09 09 09 09 09 09 09 63 61 63  L) {.........cac
1e520 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1e530 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot].token_flags 
1e540 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
1e550 49 52 45 44 3b 0a 09 09 09 09 09 09 09 7d 20 65  IRED;........} e
1e560 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 63 61  lse {.........ca
1e570 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1e580 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot].token_flags
1e590 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 7d 0a 09   = 0;........}..
1e5a0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1e5b0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1e5c0 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  el = NULL;......
1e5d0 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
1e5e0 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65  lot_reset(&cacke
1e5f0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1e600 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ]);.......}.....
1e610 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1e620 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1e630 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1e640 76 65 29 20 7b 0a 09 09 09 09 09 09 09 2f 2a 20  ve) {......../* 
1e650 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69 6e 63  Artificially inc
1e660 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62 65 72  rease the number
1e670 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f 74 73   of active slots
1e680 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20 62 65   by what will be
1e690 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a 09  come active */..
1e6a0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1e6b0 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1e6c0 20 69 6e 2d 61 63 74 69 76 65 20 73 6c 6f 74 20   in-active slot 
1e6d0 25 6c 75 2c 20 62 75 74 20 69 74 20 77 69 6c 6c  %lu, but it will
1e6e0 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
1e6f0 20 61 20 72 65 73 65 74 20 2d 2d 20 6d 61 72 6b   a reset -- mark
1e700 69 6e 67 20 61 73 20 61 63 74 69 76 65 20 66 6f  ing as active fo
1e710 72 20 61 63 63 6f 75 6e 74 69 6e 67 20 70 75 72  r accounting pur
1e720 70 6f 73 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  poses", (unsigne
1e730 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74  d long) currslot
1e740 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c 6f 74 5f  );.........slot_
1e750 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 09 7d  count++;.......}
1e760 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72  ......}......cur
1e770 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70  rslot++;.......p
1e780 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63  csc_readers += c
1e790 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b  urr_reader_len +
1e7a0 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66   1;.....}......f
1e7b0 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
1e7c0 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1e7d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e7e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e7f0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1e800 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1e810 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1e820 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
1e830 69 76 65 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ive) {.......CAC
1e840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e850 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65 20 73  ("Found active s
1e860 6c 6f 74 20 25 6c 75 2c 20 72 65 61 64 65 72 20  lot %lu, reader 
1e870 3d 20 25 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  = %s", (unsigned
1e880 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 2c   long) currslot,
1e890 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75   cackey_slots[cu
1e8a0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1e8b0 64 65 72 29 3b 0a 0a 09 09 09 09 09 09 73 6c 6f  der);........slo
1e8c0 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09  t_count++;......
1e8d0 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  }.....}....} els
1e8e0 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
1e8f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
1e900 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72  ond call to SCar
1e910 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69  dListReaders fai
1e920 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25  led, return %s/%
1e930 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  li", CACKEY_DEBU
1e940 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
1e950 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73  TO_STR(scard_lis
1e960 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28  treaders_ret), (
1e970 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74  long) scard_list
1e980 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09  readers_ret);...
1e990 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63  .}.....free(pcsc
1e9a0 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d  _readers_s);...}
1e9b0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
1e9c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e9d0 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43  First call to SC
1e9e0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
1e9f0 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
1ea00 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
1ea10 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
1ea20 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
1ea30 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
1ea40 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
1ea50 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
1ea60 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
1ea70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1ea80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ea90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1eaa0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1eab0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1eac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ead0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1eae0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1eaf0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1eb00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1eb10 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
1eb20 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
1eb30 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b  nt = slot_count;
1eb40 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1eb50 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1eb60 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
1eb70 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
1eb80 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72  rs, but not stor
1eb90 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69  ing IDs (pSlotLi
1eba0 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b  st == NULL)", CK
1ebb0 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
1ebc0 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
1ebd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ebe0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74  _OK);..}...count
1ebf0 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69   = *pulCount;..i
1ec00 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f  f (count < slot_
1ec10 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45  count) {...CACKE
1ec20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ec30 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
1ec40 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
1ec50 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25  s, but we have %
1ec60 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f  lu entries.", co
1ec70 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  unt, slot_count)
1ec80 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1ec90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1eca0 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
1ecb0 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72  OO_SMALL");....r
1ecc0 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
1ecd0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
1ece0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1ecf0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1ed00 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1ed10 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1ed20 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1ed30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ed40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1ed50 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1ed60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1ed70 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1ed80 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20 30  }...slot_idx = 0
1ed90 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ;..for (currslot
1eda0 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74 20   = 0; (currslot 
1edb0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1edc0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1edd0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1ede0 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ))); currslot++)
1edf0 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
1ee00 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1ee10 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63 6f  .active) {....co
1ee20 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
1ee30 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20 63  f (slot_idx >= c
1ee40 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
1ee50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ee60 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
1ee70 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
1ee80 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20 74  s, but we just t
1ee90 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ried to write to
1eea0 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20 2d   the %lu index -
1eeb0 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f 75  - ignoring", cou
1eec0 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a  nt, slot_idx);..
1eed0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1eee0 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73 6c  ....pSlotList[sl
1eef0 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73 6c  ot_idx] = currsl
1ef00 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b 2b  ot;...slot_idx++
1ef10 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1ef20 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1ef30 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ef40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ef50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ef60 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ef70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ef80 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1ef90 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1efa0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1efb0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  RROR);..}...*pul
1efc0 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
1efd0 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  nt;...CACKEY_DEB
1efe0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1eff0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1f000 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
1f010 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20  ders.", CKR_OK, 
1f020 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1f030 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72  slot_count);...r
1f040 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a  eturn(CKR_OK);..
1f050 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20  .tokenPresent = 
1f060 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a  tokenPresent; /*
1f070 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
1f080 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
1f090 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
1f0a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f0b0 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28   C_GetSlotInfo)(
1f0c0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1f0d0 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f  D, CK_SLOT_INFO_
1f0e0 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
1f0f0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1f100 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e   slotDescription
1f110 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f  [] = "CACKey Slo
1f120 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  t";..int mutex_r
1f130 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65  etval;..int byte
1f140 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43  s_to_copy;...CAC
1f150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f160 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f170 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1f180 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f190 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f1a0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1f1b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f1c0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1f1d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1f1e0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1f1f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f200 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f210 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1f220 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f230 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1f240 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f250 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1f260 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1f270 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f280 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1f290 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1f2a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f2b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f2c0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1f2d0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1f2e0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1f2f0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1f300 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1f310 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1f320 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1f330 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1f340 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1f350 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1f360 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1f370 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f380 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f390 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1f3a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f3b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1f3c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1f3d0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1f3e0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1f3f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f400 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1f410 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1f420 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1f430 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1f440 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1f450 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1f460 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f470 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1f480 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1f490 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
1f4a0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
1f4b0 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 21  HW_SLOT;...if (!
1f4c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f4d0 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  tID].internal) {
1f4e0 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1f4f0 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45  |= CKF_REMOVABLE
1f500 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69 66  _DEVICE;..}...if
1f510 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
1f520 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
1f530 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d  lots[slotID]) ==
1f540 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
1f550 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
1f560 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
1f570 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
1f580 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74  NT;..}...bytes_t
1f590 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28  o_copy = strlen(
1f5a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f5b0 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
1f5c0 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70  );..if (sizeof(p
1f5d0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1f5e0 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f  erID) < bytes_to
1f5f0 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73  _copy) {...bytes
1f600 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f  _to_copy = sizeo
1f610 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1f620 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65  turerID);..}..me
1f630 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
1f640 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b  facturerID, cack
1f650 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f660 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79  .pcsc_reader, by
1f670 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09  tes_to_copy);...
1f680 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1f690 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f6a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f6b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f6c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f6d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f6e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1f6f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1f700 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f710 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f720 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
1f730 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69  o->slotDescripti
1f740 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
1f750 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
1f760 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70  iption));..memcp
1f770 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  y(pInfo->slotDes
1f780 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65  cription, slotDe
1f790 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f  scription, sizeo
1f7a0 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  f(slotDescriptio
1f7b0 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  n) - 1);...memse
1f7c0 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
1f7d0 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
1f7e0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1f7f0 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09  facturerID));...
1f800 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
1f810 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
1f820 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
1f830 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
1f840 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
1f850 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1f860 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1f870 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1f880 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
1f890 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
1f8a0 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
1f8b0 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1f8c0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
1f8d0 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
1f8e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f8f0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1f900 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1f910 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1f920 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1f930 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54  ON(CK_RV, C_GetT
1f940 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  okenInfo)(CK_SLO
1f950 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
1f960 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  TOKEN_INFO_PTR p
1f970 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1f980 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
1f990 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
1f9a0 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
1f9b0 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
1f9c0 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62  8CHAR defaultLab
1f9d0 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20  el[] = "Unknown 
1f9e0 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20  Token";..static 
1f9f0 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65  CK_UTF8CHAR mode
1fa00 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e  l[] = "CAC Token
1fa10 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ";..struct cacke
1fa20 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
1fa30 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
1fa40 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1fa50 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69   num_certs;..ssi
1fa60 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a  ze_t label_ret;.
1fa70 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1fa80 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61  l;..int use_defa
1fa90 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43  ult_label;...CAC
1faa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fab0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1fac0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1fad0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fae0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1faf0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1fb00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fb10 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1fb20 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1fb30 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1fb40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fb50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fb60 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1fb70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fb80 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1fb90 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1fba0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1fbb0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1fbc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1fbd0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1fbe0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1fbf0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fc00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fc10 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1fc20 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1fc30 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1fc40 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1fc50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1fc60 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1fc70 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1fc80 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1fc90 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1fca0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1fcb0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1fcc0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fcd0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fce0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1fcf0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fd00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1fd10 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1fd20 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1fd30 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1fd40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fd50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1fd60 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1fd70 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1fd80 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1fd90 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1fda0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1fdb0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1fdc0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1fdd0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1fde0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1fdf0 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
1fe00 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
1fe10 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
1fe20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
1fe30 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
1fe40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fe50 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73  NTF("No token is
1fe60 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74   present in slot
1fe70 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49  ID = %lu", slotI
1fe80 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1fe90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1fea0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1feb0 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
1fec0 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d  NOT_PRESENT);..}
1fed0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1fee0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1fef0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1ff00 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1ff10 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1ff20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ff30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ff40 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1ff50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1ff60 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1ff70 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
1ff80 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c  mine token label
1ff90 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74   from certificat
1ffa0 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49  es */..memset(pI
1ffb0 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c  nfo->label, ' ',
1ffc0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1ffd0 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66  abel));..use_def
1ffe0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a  ault_label = 1;.
1fff0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
20000 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
20010 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63   == NULL) {...pc
20020 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
20030 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
20040 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
20050 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26  slotID], NULL, &
20060 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66  num_certs);...if
20070 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
20080 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
20090 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
200a0 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72  0) {.....label_r
200b0 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63  et = cackey_pcsc
200c0 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
200d0 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  el(pcsc_identiti
200e0 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  es, pInfo->label
200f0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
20100 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20  label));.....if 
20110 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20  (label_ret > 0) 
20120 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75  {......use_defau
20130 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09  lt_label = 0;...
20140 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
20150 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
20160 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70   malloc(sizeof(p
20170 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
20180 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
20190 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
201a0 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c  .label, pInfo->l
201b0 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
201c0 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
201d0 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  .}....}.....cack
201e0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
201f0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
20200 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09  um_certs, 1);...
20210 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  }..} else {...me
20220 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mcpy(pInfo->labe
20230 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  l, cackey_slots[
20240 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73  slotID].label, s
20250 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
20260 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66  el));....use_def
20270 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
20280 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66  .}...if (use_def
20290 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09  ault_label) {...
202a0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
202b0 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65  bel, defaultLabe
202c0 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c  l, sizeof(defaul
202d0 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d  tLabel) - 1);..}
202e0 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
202f0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
20300 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
20310 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
20320 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  ID));..memcpy(pI
20330 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
20340 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65  rID, manufacture
20350 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75  rID, sizeof(manu
20360 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29  facturerID) - 1)
20370 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
20380 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69  ->model, ' ', si
20390 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65  zeof(pInfo->mode
203a0 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  l));..memcpy(pIn
203b0 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c  fo->model, model
203c0 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20  , sizeof(model) 
203d0 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
203e0 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62  Info->serialNumb
203f0 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  er, ' ', sizeof(
20400 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
20410 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28  ber));...memset(
20420 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20  pInfo->utcTime, 
20430 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
20440 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09  o->utcTime));...
20450 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
20460 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
20470 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
20480 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
20490 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
204a0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
204b0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
204c0 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
204d0 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
204e0 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
204f0 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
20500 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
20510 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
20520 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  0;...pInfo->flag
20530 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52  s = CKF_WRITE_PR
20540 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53  OTECTED | CKF_US
20550 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a  ER_PIN_INITIALIZ
20560 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49  ED | CKF_TOKEN_I
20570 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63  NITIALIZED | cac
20580 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
20590 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a  ].token_flags;..
205a0 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
205b0 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29  command != NULL)
205c0 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
205d0 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43 54  s |= CKF_PROTECT
205e0 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ED_AUTHENTICATIO
205f0 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49 6e  N_PATH;..}...pIn
20600 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e  fo->ulMaxSession
20610 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28  Count = (sizeof(
20620 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
20630 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
20640 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d  _sessions[0])) -
20650 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65   1;..pInfo->ulSe
20660 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f  ssionCount = CK_
20670 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
20680 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
20690 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43  >ulMaxRwSessionC
206a0 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f  ount = 0;..pInfo
206b0 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75  ->ulRwSessionCou
206c0 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  nt = CK_UNAVAILA
206d0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
206e0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69  ..pInfo->ulMaxPi
206f0 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e  nLen = 128;..pIn
20700 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20  fo->ulMinPinLen 
20710 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  = 0;..pInfo->ulT
20720 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79  otalPublicMemory
20730 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
20740 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
20750 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62  pInfo->ulFreePub
20760 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
20770 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
20780 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
20790 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65  ulTotalPrivateMe
207a0 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
207b0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
207c0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
207d0 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  ePrivateMemory =
207e0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
207f0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43  INFORMATION;...C
20800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20810 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20820 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
20830 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
20840 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
20850 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20860 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  RV, C_WaitForSlo
20870 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53  tEvent)(CK_FLAGS
20880 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f   flags, CK_SLOT_
20890 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20  ID_PTR pSlotID, 
208a0 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73  CK_VOID_PTR pRes
208b0 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59  erved) {..CACKEY
208c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
208d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
208e0 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
208f0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
20900 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20910 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
20920 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
20930 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
20940 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
20950 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20960 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20980 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20990 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
209a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
209b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
209c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58  IZED);..}.../* X
209d0 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d  XX: TODO: Implem
209e0 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09  ent this... */..
209f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20a00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20a10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20a20 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
20a30 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
20a40 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
20a50 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
20a60 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20a70 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
20a80 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20a90 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c   C_GetMechanismL
20aa0 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ist)(CK_SLOT_ID 
20ab0 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
20ac0 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d  NISM_TYPE_PTR pM
20ad0 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b  echanismList, CK
20ae0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
20af0 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  unt) {..CACKEY_D
20b00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20b10 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20b20 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20b30 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20b40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20b50 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20b60 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20b70 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20b80 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20b90 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75  ..}...if (pulCou
20ba0 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
20bb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20bc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c  NTF("Error.  pul
20bd0 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29  Count is NULL.")
20be0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20bf0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
20c00 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
20c10 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  ismList == NULL)
20c20 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d   {...*pulCount =
20c30 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   1;....CACKEY_DE
20c40 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20c50 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20c60 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
20c70 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
20c80 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75  .}...if (*pulCou
20c90 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b  nt < 1) {...CACK
20ca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20cb0 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20  "Error.  Buffer 
20cc0 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09  too small.");...
20cd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46  .return(CKR_BUFF
20ce0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09  ER_TOO_SMALL);..
20cf0 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69  }...pMechanismLi
20d00 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f  st[0] = CKM_RSA_
20d10 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74  PKCS;..*pulCount
20d20 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 1;...CACKEY_D
20d30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20d40 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
20d50 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
20d60 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
20d70 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20d80 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
20d90 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29  etMechanismInfo)
20da0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
20db0 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  ID, CK_MECHANISM
20dc0 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d  _TYPE type, CK_M
20dd0 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54  ECHANISM_INFO_PT
20de0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
20df0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
20e00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20e10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20e20 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
20e30 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
20e40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20e50 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
20e60 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
20e70 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
20e80 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
20e90 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20ea0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20eb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20ec0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20ed0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20ee0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20ef0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20f00 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
20f10 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
20f20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
20f30 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
20f40 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
20f50 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
20f60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20f70 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
20f80 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
20f90 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
20fa0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
20fb0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
20fc0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
20fd0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
20fe0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20ff0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
21000 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
21010 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
21020 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21030 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21040 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
21050 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21060 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21070 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
21080 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
21090 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
210a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
210b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
210c0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
210d0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
210e0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
210f0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
21100 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
21110 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21120 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
21130 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
21140 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
21150 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
21160 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21170 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21180 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
21190 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
211a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
211b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
211c0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
211d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
211e0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
211f0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70  .}...switch (typ
21200 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  e) {...case CKM_
21210 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e  RSA_PKCS:....pIn
21220 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
21230 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
21240 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
21250 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
21260 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
21270 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
21280 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
21290 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
212a0 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
212b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
212c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
212d0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
212e0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
212f0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  rn(CKR_OK);.}../
21300 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
21310 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
21320 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
21330 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
21340 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f  nitToken)(CK_SLO
21350 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
21360 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
21370 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
21380 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
21390 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a  R_PTR pLabel) {.
213a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
213b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
213c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
213d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
213e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
213f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21400 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21410 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21420 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21430 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
21440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21450 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21460 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
21470 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
21480 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
21490 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
214a0 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
214b0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
214c0 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
214d0 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
214e0 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
214f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
21500 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53   C_InitPIN)(CK_S
21510 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21520 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
21530 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
21540 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
21550 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
21560 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
21570 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
21580 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
21590 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
215a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
215b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
215c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
215d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
215e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
215f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21600 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
21610 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
21620 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
21630 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
21640 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
21650 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
21660 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
21670 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
21680 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
21690 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
216a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
216b0 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b  RV, C_SetPIN)(CK
216c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
216d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
216e0 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69  8CHAR_PTR pOldPi
216f0 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c  n, CK_ULONG ulOl
21700 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  dPinLen, CK_UTF8
21710 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e  CHAR_PTR pNewPin
21720 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77  , CK_ULONG ulNew
21730 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  PinLen) {..CACKE
21740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21750 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21760 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21770 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21790 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
217a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
217b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
217c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
217d0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
217e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
217f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
21800 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21810 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
21820 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21830 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
21840 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21850 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
21860 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21870 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e  ON(CK_RV, C_Open
21880 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54  Session)(CK_SLOT
21890 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46  _ID slotID, CK_F
218a0 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56  LAGS flags, CK_V
218b0 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61  OID_PTR pApplica
218c0 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20  tion, CK_NOTIFY 
218d0 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49  notify, CK_SESSI
218e0 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  ON_HANDLE_PTR ph
218f0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69  Session) {..unsi
21900 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09  gned long idx;..
21910 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
21920 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73  ;..int found_ses
21930 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  sion = 0;...CACK
21940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21950 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
21960 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53   ((flags & CKF_S
21970 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21  ERIAL_SESSION) !
21980 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  = CKF_SERIAL_SES
21990 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e  SION) {...return
219a0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52  (CKR_SESSION_PAR
219b0 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52  ALLEL_NOT_SUPPOR
219c0 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  TED);..}...if (!
219d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
219e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
219f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21a00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
21a10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
21a20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
21a30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
21a40 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
21a50 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
21a60 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21a70 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21a80 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21a90 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21ab0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21ac0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21ad0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
21ae0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
21af0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
21b00 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
21b10 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
21b20 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21b30 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
21b40 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21b50 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21b60 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21b70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21b80 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21b90 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21ba0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21bb0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
21bc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21bd0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
21be0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21bf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21c00 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21c10 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21c20 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
21c30 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
21c40 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
21c50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21c60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
21c70 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
21c80 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21c90 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
21ca0 74 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75  the card is actu
21cb0 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74  ally in the slot
21cc0 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68  . */../* XXX: Ch
21cd0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
21ce0 20 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20   this is in the 
21cf0 50 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63  PKCS#11 specific
21d00 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61  ation */..if (ca
21d10 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
21d20 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  nt(&cackey_slots
21d30 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43  [slotID]) != CAC
21d40 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
21d50 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43  PRESENT) {...CAC
21d60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21d70 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e  ("Error.  Card n
21d80 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74  ot present.  Ret
21d90 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43  urning CKR_DEVIC
21da0 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09  E_REMOVED");....
21db0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21dc0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21dd0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
21de0 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
21df0 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
21e00 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69  x = 1; idx < (si
21e10 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21e20 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
21e30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
21e40 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
21e50 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
21e60 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
21e70 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73  ) {....found_ses
21e80 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70  sion = 1;.....*p
21e90 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a  hSession = idx;.
21ea0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21eb0 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20  ons[idx].active 
21ec0 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 1;....cackey_s
21ed0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f  essions[idx].slo
21ee0 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09  tID = slotID;...
21ef0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21f00 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b  [idx].state = CK
21f10 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
21f20 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ION;....cackey_s
21f30 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61  essions[idx].fla
21f40 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63  gs = flags;....c
21f50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21f60 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f  dx].ulDeviceErro
21f70 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79  r = 0;....cackey
21f80 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70  _sessions[idx].p
21f90 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41  Application = pA
21fa0 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63  pplication;....c
21fb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21fc0 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74  dx].Notify = not
21fd0 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ify;.....cackey_
21fe0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
21ff0 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
22000 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
22010 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
22020 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a  ies_count = 0;..
22030 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
22040 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61  ns[idx].search_a
22050 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
22060 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
22070 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  dx].sign_active 
22080 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
22090 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65  sessions[idx].de
220a0 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30  crypt_active = 0
220b0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
220c0 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
220d0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
220e0 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
220f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22100 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65  tID], &cackey_se
22110 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
22120 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
22130 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
22140 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
22150 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
22160 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22170 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
22180 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22190 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
221a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
221b0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
221c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
221d0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
221e0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f  R);..}...if (!fo
221f0 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09  und_session) {..
22200 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22210 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22220 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
22230 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53  T (%i)", CKR_SES
22240 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09  SION_COUNT);....
22250 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
22260 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09  ON_COUNT);..}...
22270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22280 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22290 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
222a0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
222b0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
222c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
222d0 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73  _RV, C_CloseSess
222e0 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion)(CK_SESSION_
222f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
22300 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
22310 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
22320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22330 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22340 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
22350 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
22360 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22370 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
22380 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
22390 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
223a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
223b0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
223c0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
223d0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
223e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
223f0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
22400 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
22410 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22420 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22430 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
22440 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
22450 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
22460 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
22470 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
22480 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
22490 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
224a0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
224b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
224c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
224d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
224e0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
224f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22500 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22510 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
22520 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22530 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
22540 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
22550 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22560 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
22570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22580 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
22590 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
225a0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
225b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
225c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
225d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
225e0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20  ssion].active = 
225f0 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  0;..cackey_free_
22600 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
22610 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22620 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
22630 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
22640 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
22650 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
22660 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
22670 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
22680 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
22690 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
226a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
226b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
226c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
226d0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
226e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
226f0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22700 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22710 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22720 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
22730 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
22740 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
22750 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
22760 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
22770 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b  eAllSessions)(CK
22780 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29  _SLOT_ID slotID)
22790 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
227a0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
227b0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
227c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
227d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
227e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
227f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22800 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22810 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22820 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22830 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22840 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22850 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
22860 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
22870 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
22880 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
22890 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
228a0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
228b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
228c0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
228d0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
228e0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
228f0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
22900 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22910 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
22920 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
22930 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
22940 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
22950 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22960 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22970 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22990 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
229a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
229b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
229c0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
229d0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
229e0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
229f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22a00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
22a10 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
22a20 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
22a30 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
22a40 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
22a50 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
22a60 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22a70 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
22a80 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
22a90 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66  INVALID);..}...f
22aa0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
22ab0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
22ac0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
22ad0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22ae0 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
22af0 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
22b00 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
22b10 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28  ctive) {....if (
22b20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22b30 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73  idx].slotID != s
22b40 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e  lotID) {.....con
22b50 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
22b60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22b70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22b80 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53  ck);....C_CloseS
22b90 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09  ession(idx);....
22ba0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
22bb0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22bc0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
22bd0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
22be0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22bf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22c00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22c10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22c20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22c30 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
22c40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22c50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22c60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22c80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22c90 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
22ca0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
22cb0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
22cc0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22cd0 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69  K_RV, C_GetSessi
22ce0 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49  onInfo)(CK_SESSI
22cf0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22d00 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49  on, CK_SESSION_I
22d10 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
22d20 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
22d30 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
22d40 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22d50 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
22d60 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
22d70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22d80 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
22d90 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
22da0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
22db0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
22dc0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22dd0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22de0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22df0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22e00 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22e10 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22e20 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22e30 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
22e40 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
22e50 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
22e60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22e70 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
22e80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
22e90 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
22ea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22eb0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
22ec0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
22ed0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22ee0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
22ef0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
22f00 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22f10 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22f20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22f30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22f40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22f50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22f60 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
22f70 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22f80 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22f90 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
22fa0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22fb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
22fc0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
22fd0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22fe0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
22ff0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23000 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
23010 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
23020 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
23030 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
23040 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
23050 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44  ...pInfo->slotID
23060 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
23070 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
23080 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61  tID;..pInfo->sta
23090 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  te = cackey_sess
230a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
230b0 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c  tate;..pInfo->fl
230c0 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ags = cackey_ses
230d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
230e0 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75  flags;..pInfo->u
230f0 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63  lDeviceError = c
23100 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23110 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63  Session].ulDevic
23120 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f  eError;...mutex_
23130 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23140 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23150 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
23160 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
23170 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
23180 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23190 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
231a0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
231b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
231c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
231d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
231e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
231f0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
23200 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
23210 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
23220 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23230 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69  RV, C_GetOperati
23240 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
23250 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23260 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
23270 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
23280 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
23290 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
232a0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
232b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
232c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
232d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
232e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
232f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23300 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
23310 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
23320 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
23330 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
23340 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
23350 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23360 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
23370 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
23380 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
23390 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
233a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
233b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
233c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
233d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
233e0 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72  CK_RV, C_SetOper
233f0 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
23400 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23410 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
23420 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
23430 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
23440 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65  OperationStateLe
23450 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
23460 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b  DLE hEncryptionK
23470 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
23480 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61  NDLE hAuthentica
23490 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b  tionKey) {..CACK
234a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
234b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
234c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
234d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
234e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
234f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
23500 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
23510 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
23520 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
23530 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
23540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23550 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
23560 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23570 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
23580 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23590 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
235a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
235b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
235c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
235d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 5f 43 5f 4c 6f  ION(CK_RV, _C_Lo
235e0 67 69 6e 4d 75 74 65 78 41 72 67 29 28 43 4b 5f  ginMutexArg)(CK_
235f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
23600 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
23610 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
23620 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
23630 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
23640 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f 63  lPinLen, int loc
23650 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43 4b 5f 53  k_mutex) {..CK_S
23660 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
23670 46 49 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68  FILE *pinfd;..ch
23680 61 72 20 2a 70 69 6e 63 6d 64 2c 20 70 69 6e 62  ar *pincmd, pinb
23690 75 66 5b 36 34 5d 2c 20 2a 66 67 65 74 73 5f 72  uf[64], *fgets_r
236a0 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
236b0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65  etval;..int trie
236c0 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e  s_remaining;..in
236d0 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 09 69 6e  t login_ret;..in
236e0 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09  t pclose_ret;...
236f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23700 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
23710 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
23720 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
23730 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23740 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
23750 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
23760 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
23770 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
23780 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
23790 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
237a0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
237b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
237c0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
237d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
237e0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
237f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23800 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
23810 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
23820 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23830 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
23840 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
23850 66 20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43  f (userType != C
23860 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43  KU_USER) {...CAC
23870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23880 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c  ("Error.  We onl
23890 79 20 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d  y support USER m
238a0 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25  ode, asked for %
238b0 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69  lu mode.", (unsi
238c0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54  gned long) userT
238d0 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43  ype)....return(C
238e0 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56  KR_USER_TYPE_INV
238f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
23900 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
23910 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
23920 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
23930 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23940 3b 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ;...if (mutex_re
23950 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
23960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23970 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
23980 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
23990 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
239a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
239b0 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  .}..}...if (!cac
239c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
239d0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
239e0 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
239f0 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d  x) {....cackey_m
23a00 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23a10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d  ey_biglock);...}
23a20 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23a30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23a40 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
23a50 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
23a60 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
23a70 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
23a80 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
23a90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23aa0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
23ab0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
23ac0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
23ad0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23ae0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
23af0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
23b00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23b10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23b20 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
23b30 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
23b40 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
23b50 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
23b60 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
23b70 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  ex) {....cackey_
23b80 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23b90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
23ba0 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  }....return(CKR_
23bb0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23bc0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
23bd0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
23be0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
23bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23c00 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
23c10 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
23c20 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
23c30 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
23c40 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
23c50 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29  .if (lock_mutex)
23c60 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
23c70 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23c80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a  _biglock);...}..
23c90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23ca0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
23cb0 0a 09 70 69 6e 63 6d 64 20 3d 20 63 61 63 6b 65  ..pincmd = cacke
23cc0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 3b 0a 09  y_pin_command;..
23cd0 69 66 20 28 70 69 6e 63 6d 64 20 21 3d 20 4e 55  if (pincmd != NU
23ce0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
23cf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 43  EBUG_PRINTF("CAC
23d00 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20  KEY_PIN_COMMAND 
23d10 3d 20 25 73 22 2c 20 70 69 6e 63 6d 64 29 3b 0a  = %s", pincmd);.
23d20 0a 09 09 69 66 20 28 70 50 69 6e 20 21 3d 20 4e  ...if (pPin != N
23d30 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ULL) {....CACKEY
23d40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
23d50 72 6f 74 65 63 74 65 64 20 61 75 74 68 65 6e 74  rotected authent
23d60 69 63 61 74 69 6f 6e 20 70 61 74 68 20 69 6e 20  ication path in 
23d70 65 66 66 65 63 74 20 61 6e 64 20 50 49 4e 20 70  effect and PIN p
23d80 72 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a 09 09  rovided !?");...
23d90 7d 0a 0a 09 09 70 69 6e 66 64 20 3d 20 70 6f 70  }....pinfd = pop
23da0 65 6e 28 70 69 6e 63 6d 64 2c 20 22 72 22 29 3b  en(pincmd, "r");
23db0 0a 09 09 69 66 20 28 70 69 6e 66 64 20 3d 3d 20  ...if (pinfd == 
23dc0 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  NULL) {....CACKE
23dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23de0 45 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62  Error.  %s: Unab
23df0 6c 65 20 74 6f 20 72 75 6e 22 2c 20 70 69 6e 63  le to run", pinc
23e00 6d 64 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63  md);.....if (loc
23e10 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63  k_mutex) {.....c
23e20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23e30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23e40 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  k);....}.....CAC
23e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23e60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23e70 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25  PIN_INCORRECT (%
23e80 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50  i)", (int) CKR_P
23e90 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a  IN_INCORRECT);..
23ea0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
23eb0 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
23ec0 7d 0a 0a 09 09 66 67 65 74 73 5f 72 65 74 20 3d  }....fgets_ret =
23ed0 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c 20 73   fgets(pinbuf, s
23ee0 69 7a 65 6f 66 28 70 69 6e 62 75 66 29 2c 20 70  izeof(pinbuf), p
23ef0 69 6e 66 64 29 3b 0a 09 09 69 66 20 28 66 67 65  infd);...if (fge
23f00 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20  ts_ret == NULL) 
23f10 7b 0a 09 09 09 70 69 6e 62 75 66 5b 30 5d 20 3d  {....pinbuf[0] =
23f20 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09 09 70 63   '\0';...}....pc
23f30 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c 6f 73  lose_ret = pclos
23f40 65 28 70 69 6e 66 64 29 3b 0a 09 09 69 66 20 28  e(pinfd);...if (
23f50 70 63 6c 6f 73 65 5f 72 65 74 20 3d 3d 20 2d 31  pclose_ret == -1
23f60 20 26 26 20 65 72 72 6e 6f 20 3d 3d 20 45 43 48   && errno == ECH
23f70 49 4c 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ILD) {....CACKEY
23f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e  _DEBUG_PRINTF("N
23f90 6f 74 69 63 65 2e 20 20 70 63 6c 6f 73 65 28 29  otice.  pclose()
23fa0 20 69 6e 64 69 63 61 74 65 64 20 69 74 20 63 6f   indicated it co
23fb0 75 6c 64 20 6e 6f 74 20 67 65 74 20 74 68 65 20  uld not get the 
23fc0 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 63 68  status of the ch
23fd0 69 6c 64 2c 20 61 73 73 75 6d 69 6e 67 20 69 74  ild, assuming it
23fe0 20 73 75 63 63 65 65 65 64 65 64 20 21 22 29 3b   succeeeded !");
23ff0 0a 0a 09 09 09 70 63 6c 6f 73 65 5f 72 65 74 20  .....pclose_ret 
24000 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  = 0;...}....if (
24010 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20 30 29  pclose_ret != 0)
24020 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
24030 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24040 2e 20 20 25 73 3a 20 65 78 69 74 65 64 20 77 69  .  %s: exited wi
24050 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74 61 74  th non-zero stat
24060 75 73 20 6f 66 20 25 69 22 2c 20 70 69 6e 63 6d  us of %i", pincm
24070 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a  d, pclose_ret);.
24080 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
24090 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ex) {.....cackey
240a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
240b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
240c0 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
240d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
240e0 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49  urning CKR_PIN_I
240f0 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20  NCORRECT (%i)", 
24100 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e  (int) CKR_PIN_IN
24110 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65  CORRECT);.....re
24120 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
24130 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09  ORRECT);...}....
24140 69 66 20 28 73 74 72 6c 65 6e 28 70 69 6e 62 75  if (strlen(pinbu
24150 66 29 20 3c 20 31 29 20 7b 0a 09 09 09 43 41 43  f) < 1) {....CAC
24160 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24170 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 72 65  ("Error.  %s: re
24180 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 61 22 2c  turned no data",
24190 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09 09 69 66   pincmd);.....if
241a0 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
241b0 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
241c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
241d0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a 0a 09  iglock);....}...
241e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
241f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24200 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45   CKR_PIN_INCORRE
24210 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  CT (%i)", (int) 
24220 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
24230 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  T);.....return(C
24240 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
24250 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 69  );...}....if (pi
24260 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62  nbuf[strlen(pinb
24270 75 66 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27  uf) - 1] == '\n'
24280 29 20 7b 0a 09 09 09 70 69 6e 62 75 66 5b 73 74  ) {....pinbuf[st
24290 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31  rlen(pinbuf) - 1
242a0 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09  ] = '\0';...}...
242b0 09 70 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38  .pPin = (CK_UTF8
242c0 43 48 41 52 5f 50 54 52 29 20 70 69 6e 62 75 66  CHAR_PTR) pinbuf
242d0 3b 0a 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 73  ;...ulPinLen = s
242e0 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a 09  trlen(pinbuf);..
242f0 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
24300 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
24310 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
24320 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
24330 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69  en, &tries_remai
24340 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69  ning);..if (logi
24350 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
24360 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
24370 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
24380 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
24390 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
243a0 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09  iglock);...}....
243b0 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d  if (login_ret ==
243c0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c   CACKEY_PCSC_E_L
243d0 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b  OCKED) {....CACK
243e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
243f0 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69  "Error.  Token i
24400 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09  s locked.");....
24410 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
24420 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
24430 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
24440 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41  N_LOCKED;.....CA
24450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24460 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
24470 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29  _PIN_LOCKED (%i)
24480 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e  ", (int) CKR_PIN
24490 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65  _LOCKED);.....re
244a0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43  turn(CKR_PIN_LOC
244b0 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69  KED);...} else i
244c0 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
244d0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
244e0 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45  DPIN) {....CACKE
244f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24500 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20  Error.  Invalid 
24510 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  PIN.");.....cack
24520 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24530 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
24540 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55  CKF_USER_PIN_COU
24550 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28  NT_LOW;.....if (
24560 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20  tries_remaining 
24570 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b  == 1) {.....cack
24580 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24590 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
245a0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
245b0 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09  AL_TRY;....}....
245c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
245d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
245e0 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
245f0 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43  T (%i)", (int) C
24600 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
24610 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
24620 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
24630 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
24640 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24650 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72  ror.  Unknown er
24660 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f  ror returned fro
24670 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29  m cackey_login()
24680 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65   (%i)", login_re
24690 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
246a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
246b0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c  ;..}...cackey_sl
246c0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
246d0 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46  n_flags &= ~(CKF
246e0 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  _USER_PIN_LOCKED
246f0 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
24700 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f  COUNT_LOW | CKF_
24710 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c  LOGIN_REQUIRED |
24720 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49   CKF_USER_PIN_FI
24730 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b  NAL_TRY);...cack
24740 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24750 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
24760 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49  S_RO_USER_FUNCTI
24770 4f 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f  ONS;...if (lock_
24780 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78  mutex) {...mutex
24790 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
247a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
247b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
247c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
247d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
247e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
247f0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
24800 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
24810 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24820 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
24830 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
24840 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
24850 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
24860 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
24870 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
24880 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
24890 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
248a0 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  gin)(CK_SESSION_
248b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
248c0 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73   CK_USER_TYPE us
248d0 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43  erType, CK_UTF8C
248e0 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
248f0 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
24900 20 7b 0a 09 72 65 74 75 72 6e 28 5f 43 5f 4c 6f   {..return(_C_Lo
24910 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73  ginMutexArg(hSes
24920 73 69 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c 20  sion, userType, 
24930 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
24940 31 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  1));.}..CK_DEFIN
24950 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24960 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53  , C_Logout)(CK_S
24970 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24980 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c  ession) {..CK_SL
24990 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69  OT_ID slotID;..i
249a0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
249b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
249c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
249d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
249e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
249f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24a00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24a10 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24a20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24a30 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24a40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24a50 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
24a60 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
24a70 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
24a80 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
24a90 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
24aa0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
24ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24ac0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
24ad0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
24ae0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
24af0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
24b00 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
24b10 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
24b20 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
24b30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24b40 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
24b50 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
24b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
24b80 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
24b90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24ba0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24bb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
24bc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24bd0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
24be0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24bf0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24c00 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
24c10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24c20 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
24c30 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
24c40 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
24c50 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
24c60 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
24c70 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
24c80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
24c90 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
24ca0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
24cb0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
24cc0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
24cd0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
24ce0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
24cf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24d00 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
24d10 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
24d20 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
24d30 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
24d40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24d50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24d60 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
24d70 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
24d80 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
24d90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24da0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
24db0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
24dc0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
24dd0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
24de0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
24df0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24e00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24e10 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
24e20 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
24e30 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
24e40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24e50 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
24e60 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f  RO_PUBLIC_SESSIO
24e70 4e 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  N;...if (cackey_
24e80 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
24e90 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
24ea0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
24eb0 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
24ec0 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
24ed0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b  .} else {...cack
24ee0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24ef0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
24f00 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
24f10 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24f20 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24f30 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
24f40 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
24f50 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
24f60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24f70 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
24f80 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
24f90 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24fa0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
24fb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24fc0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
24fd0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
24fe0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
24ff0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
25000 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25010 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29   C_CreateObject)
25020 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
25030 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
25040 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
25050 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
25060 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
25070 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
25080 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  phObject) {..CAC
25090 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
250a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
250b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
250c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
250d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
250e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
250f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25100 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25110 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25120 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
25130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25140 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
25150 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
25160 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
25170 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25180 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
25190 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
251a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
251b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
251c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f  TION(CK_RV, C_Co
251d0 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  pyObject)(CK_SES
251e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
251f0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
25200 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
25210 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
25220 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
25230 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
25240 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
25250 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20  TR phNewObject) 
25260 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
25270 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
25280 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
25290 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
252a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
252b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
252c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
252d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
252e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
252f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25310 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25320 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25330 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
25340 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
25350 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
25360 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
25370 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25380 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
25390 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
253a0 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  , C_DestroyObjec
253b0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
253c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
253d0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
253e0 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
253f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25400 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25410 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25420 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25440 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
25450 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
25460 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
25470 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25480 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
25490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
254a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
254b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
254c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
254d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
254e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
254f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
25500 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
25510 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25520 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
25530 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53  ObjectSize)(CK_S
25540 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25550 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
25560 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
25570 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
25580 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45  ulSize) {..CACKE
25590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
255a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
255b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
255c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
255d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
255e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
255f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
25600 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
25610 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
25620 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
25630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
25640 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
25650 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25660 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
25670 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
25680 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
25690 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
256a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
256b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
256c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41  ON(CK_RV, C_GetA
256d0 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
256e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
256f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
25700 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
25710 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
25720 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
25730 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
25740 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
25750 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
25760 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
25770 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
25780 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
25790 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61   identity_idx, a
257a0 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
257b0 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b  tr_idx, num_ids;
257c0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
257d0 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  al;..CK_RV retva
257e0 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f  l = CKR_OK;..CK_
257f0 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
25800 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
25810 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ueLen;...CACKEY_
25820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25830 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
25840 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
25850 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
25860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25870 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
25880 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
25890 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
258a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
258b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
258c0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
258d0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
258e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
258f0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
25900 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
25910 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25920 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25930 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
25940 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
25950 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
25960 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
25970 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a  );..}...if (hObj
25980 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ect == 0) {...CA
25990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
259a0 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
259b0 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
259c0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
259d0 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
259e0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
259f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75  ;..}...if (ulCou
25a00 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
25a10 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
25a20 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
25a30 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
25a40 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
25a50 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
25a60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25a70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25a80 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
25a90 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
25aa0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
25ab0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
25ac0 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20  f (pTemplate == 
25ad0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
25ae0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25af0 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65  rror.  pTemplate
25b00 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
25b10 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
25b20 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
25b30 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68  identity_idx = h
25b40 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75  Object - 1;...mu
25b50 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
25b60 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
25b70 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25b80 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
25b90 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25bb0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
25bc0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25bd0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25be0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
25bf0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
25c00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
25c10 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
25c20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25c30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25c40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25c50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
25c60 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
25c70 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25c80 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
25c90 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
25ca0 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  }...num_ids = ca
25cb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25cc0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
25cd0 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28  es_count;...if (
25ce0 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20  identity_idx >= 
25cf0 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63  num_ids) {...cac
25d00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25d10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25d20 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
25d30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25d40 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
25d50 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69  out of range.  i
25d60 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c  dentity_idx = %l
25d70 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75  u, num_ids = %lu
25d80 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
25d90 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
25da0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25db0 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72  ) num_ids);....r
25dc0 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
25dd0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
25de0 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20  ;..}...identity 
25df0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
25e00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
25e10 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79  ntities[identity
25e20 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74  _idx];...for (at
25e30 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
25e40 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20  _idx < ulCount; 
25e50 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
25e60 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65  curr_attr = &pTe
25e70 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d  mplate[attr_idx]
25e80 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  ;....pValue = NU
25e90 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
25ea0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
25eb0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25ec0 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67  _PRINTF("Looking
25ed0 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30   for attribute 0
25ee0 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79  x%08lx (identity
25ef0 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  :%lu) ...", (uns
25f00 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
25f10 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e  _attr->type, (un
25f20 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
25f30 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66  ntity_idx);....f
25f40 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
25f50 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
25f60 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d  _idx < identity-
25f70 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
25f80 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
25f90 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65  ++) {....if (ide
25fa0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
25fb0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
25fc0 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74  .type == curr_at
25fd0 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09  tr->type) {.....
25fe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25ff0 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20  NTF(" ... found 
26000 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c  it, pValue = %p,
26010 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c   ulValueLen = %l
26020 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  u", identity->at
26030 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
26040 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
26050 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
26060 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
26070 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
26080 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65  ..........pValue
26090 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
260a0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
260b0 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09  r_idx].pValue;..
260c0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
260d0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
260e0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
260f0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  dx].ulValueLen;.
26100 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
26110 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
26120 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
26130 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
26140 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75  >ulValueLen >= u
26150 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
26160 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
26170 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  r->pValue, pValu
26180 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  e, ulValueLen);.
26190 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
261a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
261b0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09  _LONG) -1;......
261c0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
261d0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
261e0 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f  ..}...}....curr_
261f0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
26200 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09   = ulValueLen;..
26210 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
26220 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
26230 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26240 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
26250 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
26260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26280 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
26290 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
262a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
262b0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74  R);..}...if (ret
262c0 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49  val == CKR_ATTRI
262d0 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
262e0 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
262f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26300 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42  rning CKR_ATTRIB
26310 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
26320 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
26330 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
26340 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
26350 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
26360 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
26370 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26380 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
26390 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22  _TOO_SMALL (%i)"
263a0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
263b0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
263c0 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val == CKR_OK) {
263d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
263e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
263f0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
26400 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
26410 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
26420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26430 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
26440 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
26450 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
26460 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26470 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26480 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
26490 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
264a0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
264b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
264c0 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
264d0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
264e0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
264f0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
26500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26510 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26520 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26530 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
26540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26550 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26560 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
26570 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
26580 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26590 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
265a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
265b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
265c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
265d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
265e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
265f0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
26600 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
26610 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
26620 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26630 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
26640 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b  dObjectsInit)(CK
26650 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
26660 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
26670 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
26680 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
26690 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c  lCount) {..CK_SL
266a0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
266b0 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e  K_ULONG idx;..in
266c0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
266d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
266e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
266f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26700 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26720 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26730 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26740 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26750 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26760 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26770 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
26780 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
26790 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
267a0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
267b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
267c0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
267d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
267e0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
267f0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
26800 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
26810 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
26820 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
26830 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
26840 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
26850 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26860 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
26870 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
26880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26890 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
268a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
268b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
268c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
268d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
268e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
268f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
26900 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26910 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26920 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
26930 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26940 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
26950 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
26960 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
26970 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
26980 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
26990 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
269a0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
269b0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
269c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
269d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
269e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
269f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
26a00 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69  rch already acti
26a10 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
26a20 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
26a30 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73  _ACTIVE);..}...s
26a40 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
26a50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26a60 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
26a70 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
26a80 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
26a90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
26aa0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
26ab0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
26ac0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26ad0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
26ae0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
26af0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
26b00 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
26b10 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
26b20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26b30 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
26b40 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
26b50 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
26b60 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26b70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26b80 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
26b90 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
26ba0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
26bb0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
26bc0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
26bd0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26be0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
26bf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
26c00 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
26c10 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
26c20 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
26c30 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  eset) {...CACKEY
26c40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
26c50 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e  he slot has been
26c60 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20   reset since we 
26c70 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20  last looked for 
26c80 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65  identities -- re
26c90 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69  scanning");....i
26ca0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
26cb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
26cc0 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
26cd0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65   {....cackey_fre
26ce0 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
26cf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26d00 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
26d10 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
26d20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
26d30 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
26d40 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26d50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26d60 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
26d70 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26d80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26d90 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
26da0 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63   0;...}....if (c
26db0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26dc0 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c  ID].label != NUL
26dd0 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  L) {....free(cac
26de0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26df0 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63  ].label);....cac
26e00 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26e10 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
26e20 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61  ..}....cackey_ma
26e30 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63  rk_slot_reset(&c
26e40 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26e50 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73  ID]);...cackey_s
26e60 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f  lots[slotID].slo
26e70 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a  t_reset = 0;..}.
26e80 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
26e90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26ea0 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
26eb0 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  LL) {...cackey_s
26ec0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26ed0 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
26ee0 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
26ef0 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
26f00 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
26f10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26f20 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
26f30 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09  es_count);..}...
26f40 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d  if (pTemplate !=
26f50 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75   NULL) {...if (u
26f60 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
26f70 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26f80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26f90 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
26fa0 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63   ulCount;....cac
26fb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26fc0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
26fd0 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43  ery = malloc(ulC
26fe0 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
26ff0 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09  Template));.....
27000 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
27010 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27020 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70  .search_query, p
27030 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e  Template, ulCoun
27040 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
27050 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20  plate));....for 
27060 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
27070 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  ulCount; idx++) 
27080 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c  {.....if (pTempl
27090 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ate[idx].ulValue
270a0 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  Len == 0) {.....
270b0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
270c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
270d0 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
270e0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  lue = NULL;.....
270f0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09  ..continue;.....
27100 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  }......cackey_se
27110 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27120 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
27130 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c  x].pValue = mall
27140 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  oc(pTemplate[idx
27150 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ].ulValueLen);..
27160 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
27170 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27180 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
27190 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09  dx].pValue) {...
271a0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
271b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
271c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
271d0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54  [idx].pValue, pT
271e0 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61  emplate[idx].pVa
271f0 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69  lue, pTemplate[i
27200 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
27210 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20  .....}....}...} 
27220 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79  else {....cackey
27230 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27240 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
27250 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63  _count = 0;....c
27260 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27270 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
27280 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  query = NULL;...
27290 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
272a0 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
272b0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
272c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
272d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
272e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
272f0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
27300 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65  h query specifie
27310 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e  d as NULL, but n
27320 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
27330 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69  erms not specifi
27340 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09  ed as 0.");.....
27350 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
27360 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a  ENTS_BAD);...}..
27370 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27380 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
27390 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
273a0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73   0;...cackey_ses
273b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
273c0 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
273d0 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
273e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
273f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
27400 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73  e = 1;..cackey_s
27410 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27420 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
27430 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   = 0;...mutex_re
27440 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
27450 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27460 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
27470 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
27480 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
27490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
274a0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
274b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
274c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
274d0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
274e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
274f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27500 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
27510 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27520 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OK);.}..static i
27530 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31  nt cackey_pkcs11
27540 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75  _compare_attribu
27550 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45  tes(CK_ATTRIBUTE
27560 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54   *a, CK_ATTRIBUT
27570 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65  E *b) {..unsigne
27580 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66  d char *smallbuf
27590 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69  , *largebuf;..si
275a0 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  ze_t smallbuf_le
275b0 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b  n, largebuf_len;
275c0 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21  ...if (a->type !
275d0 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72  = b->type) {...r
275e0 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43  eturn(0);..}...C
275f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27600 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  TF("    ... foun
27610 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20  d matching type 
27620 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ...");...CACKEY_
27630 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
27640 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75      ... our valu
27650 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20  e:", a->pValue, 
27660 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  a->ulValueLen);.
27670 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20  ..if (b->pValue 
27680 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
27690 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
276a0 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
276b0 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63  nd wildcard matc
276c0 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  h");....return(1
276d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70  );..}...if (a->p
276e0 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
276f0 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
27700 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c  .. .if (b->ulVal
27710 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61  ueLen == a->ulVa
27720 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70  lueLen && memcmp
27730 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70  (a->pValue, b->p
27740 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75  Value, b->ulValu
27750 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  eLen) == 0) {...
27760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27770 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
27780 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63  found exact matc
27790 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  h");....return(1
277a0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
277b0 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73  a->type) {...cas
277c0 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
277d0 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65  ..if (a->ulValue
277e0 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75  Len == b->ulValu
277f0 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61  eLen) {.....brea
27800 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  k;....}.....if (
27810 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20  a->ulValueLen > 
27820 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  b->ulValueLen) {
27830 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20  .....smallbuf = 
27840 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73  b->pValue;.....s
27850 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d  mallbuf_len = b-
27860 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09  >ulValueLen;....
27870 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e  ..largebuf = a->
27880 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67  pValue;.....larg
27890 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c  ebuf_len = a->ul
278a0 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65  ValueLen;....} e
278b0 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62  lse {.....smallb
278c0 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a  uf = a->pValue;.
278d0 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  ....smallbuf_len
278e0 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e   = a->ulValueLen
278f0 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20  ;......largebuf 
27900 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = b->pValue;....
27910 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20  .largebuf_len = 
27920 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  b->ulValueLen;..
27930 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c  ..}.....for (; l
27940 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73  argebuf_len != s
27950 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72  mallbuf_len; lar
27960 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66  gebuf++,largebuf
27970 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66  _len--) {.....if
27980 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d   (largebuf[0] !=
27990 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   0) {......break
279a0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
279b0 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65  .if (largebuf_le
279c0 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  n != smallbuf_le
279d0 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
279e0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d  ...}.....if (mem
279f0 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d  cmp(largebuf, sm
27a00 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66  allbuf, smallbuf
27a10 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  _len) == 0) {...
27a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27a30 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e  RINTF("       ..
27a40 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d  . found approxim
27a50 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  ate match");....
27a60 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09  ..return(1);....
27a70 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
27a80 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
27a90 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27aa0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
27ab0 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53  Objects)(CK_SESS
27ac0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27ad0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
27ae0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
27af0 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d  ct, CK_ULONG ulM
27b00 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43  axObjectCount, C
27b10 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
27b20 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73  bjectCount) {..s
27b30 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
27b40 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
27b50 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63  .CK_ATTRIBUTE *c
27b60 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c  urr_attr;..CK_UL
27b70 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c  ONG curr_id_idx,
27b80 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78   curr_out_id_idx
27b90 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c  , curr_attr_idx,
27ba0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a   sess_attr_idx;.
27bb0 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65  .CK_ULONG matche
27bc0 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61  d_count, prev_ma
27bd0 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e  tched_count;..in
27be0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
27bf0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
27c00 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
27c10 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d  TEST..struct tim
27c20 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b  eval start, end;
27c30 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74  ..uint64_t start
27c40 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23  _int, end_int;.#
27c50 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
27c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27c70 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27c80 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27c90 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27ca0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27cb0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
27cc0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27cd0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27ce0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27cf0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a  ..}...if (pulObj
27d00 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  ectCount == NULL
27d10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27d20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27d30 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  .  pulObjectCoun
27d40 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
27d50 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
27d60 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
27d70 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
27d80 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62   NULL && ulMaxOb
27d90 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
27da0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
27db0 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
27dc0 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
27dd0 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
27de0 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
27df0 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65  ly */...*pulObje
27e00 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ctCount = 0;....
27e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27e20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27e30 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
27e40 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
27e50 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
27e60 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
27e70 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
27e80 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
27e90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27ea0 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73  or.  phObject is
27eb0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
27ec0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
27ed0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
27ee0 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  (ulMaxObjectCoun
27ef0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
27f00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27f10 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d  "Error.  Maximum
27f20 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
27f30 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ts specified as 
27f40 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75  zero.");....retu
27f50 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
27f60 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
27f70 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
27f80 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
27f90 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27fa0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
27fb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
27fc0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
27fd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27fe0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
27ff0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
28000 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
28010 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
28020 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
28030 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
28040 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
28050 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
28060 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
28070 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
28080 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28090 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
280a0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
280b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
280c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
280d0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
280e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
280f0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
28100 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28110 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
28120 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28130 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
28140 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
28150 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
28160 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
28170 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
28180 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
28190 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
281a0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
281b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
281c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
281d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
281e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
281f0 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
28200 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
28210 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28220 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
28230 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28240 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
28250 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
28260 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64  TEST..gettimeofd
28270 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29  ay(&start, NULL)
28280 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f  ;.#endif...curr_
28290 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a  out_id_idx = 0;.
282a0 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64  .for (curr_id_id
282b0 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x = cackey_sessi
282c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
282d0 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75  arch_curr_id; cu
282e0 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b  rr_id_idx < cack
282f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28300 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
28310 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f  _count && ulMaxO
28320 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72  bjectCount; curr
28330 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63  _id_idx++) {...c
28340 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79  urr_id = &cackey
28350 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28360 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63  on].identities[c
28370 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09  urr_id_idx];....
28380 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28390 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20  NTF("Processing 
283a0 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28  identity:%lu", (
283b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
283c0 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
283d0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20  matched_count = 
283e0 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f  0;....for (curr_
283f0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75  attr_idx = 0; cu
28400 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61  rr_attr_idx < ca
28410 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28420 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
28430 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72  uery_count; curr
28440 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
28450 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63  ..prev_matched_c
28460 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63  ount = matched_c
28470 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61  ount;.....curr_a
28480 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ttr = &cackey_se
28490 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
284a0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75  .search_query[cu
284b0 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  rr_attr_idx];...
284c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
284d0 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e  RINTF("  Checkin
284e0 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
284f0 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20  %s (0x%08lx) in 
28500 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c  identity:%i...",
28510 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
28520 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f  NC_ATTRIBUTE_TO_
28530 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74  STR(curr_attr->t
28540 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ype), (unsigned 
28550 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
28560 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72  >type, (int) cur
28570 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41  r_id_idx);....CA
28580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28590 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c  BUF("    Value l
285a0 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75  ooking for:", cu
285b0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
285c0 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61   curr_attr->ulVa
285d0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72  lueLen);.....for
285e0 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
285f0 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
28600 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74  dx < curr_id->at
28610 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
28620 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
28630 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65   {.....if (cacke
28640 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65  y_pkcs11_compare
28650 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75 72  _attributes(&cur
28660 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
28670 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c  [sess_attr_idx],
28680 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09   curr_attr)) {..
28690 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
286a0 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t++;.......break
286b0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
286c0 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69  ./* If the attri
286d0 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  bute could not b
286e0 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f  e matched, do no
286f0 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61  t try to match a
28700 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62  dditional attrib
28710 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70  utes */....if (p
28720 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
28730 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  t == matched_cou
28740 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  nt) {.....break;
28750 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
28760 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  (matched_count =
28770 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
28780 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
28790 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20  ch_query_count) 
287a0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
287b0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
287c0 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65  All %i attribute
287d0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
287e0 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e  und, adding iden
287f0 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72  tity:%i to retur
28800 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29  ned list", (int)
28810 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
28820 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
28830 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
28840 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
28850 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b  );.....phObject[
28860 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d  curr_out_id_idx]
28870 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b   = curr_id_idx +
28880 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a   1;.....ulMaxObj
28890 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09  ectCount--;.....
288a0 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b  curr_out_id_idx+
288b0 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  +;...} else {...
288c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
288d0 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20  INTF("  ... Not 
288e0 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75  all %i (only fou
288f0 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65  nd %i) attribute
28900 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
28910 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20  und, not adding 
28920 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69  identity:%i", (i
28930 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  nt) cackey_sessi
28940 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
28950 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
28960 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f  , (int) matched_
28970 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72  count, (int) cur
28980 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09  r_id_idx);...}..
28990 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  }..cackey_sessio
289a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
289b0 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75  rch_curr_id = cu
289c0 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c  rr_id_idx;..*pul
289d0 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75  ObjectCount = cu
289e0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a  rr_out_id_idx;..
289f0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
28a00 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
28a10 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64  TEST..gettimeofd
28a20 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a  ay(&end, NULL);.
28a30 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74  .start_int = (st
28a40 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30  art.tv_sec * 100
28a50 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76  0000) + start.tv
28a60 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20  _usec;..end_int 
28a70 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20  = (end.tv_sec * 
28a80 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74  1000000) + end.t
28a90 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66  v_usec;..fprintf
28aa0 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63 68  (stderr, "Search
28ab0 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73   took %lu micros
28ac0 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69  econds\n", (unsi
28ad0 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f  gned long) (end_
28ae0 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29  int - start_int)
28af0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65  );.#endif...mute
28b00 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28b10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28b20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28b30 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
28b40 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
28b50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28b60 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
28b70 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28b80 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28b90 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28ba0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28bb0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28bc0 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d  CKR_OK (%i), num
28bd0 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c   objects = %lu",
28be0 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a   CKR_OK, *pulObj
28bf0 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ectCount);...ret
28c00 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
28c10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
28c20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
28c30 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b  ObjectsFinal)(CK
28c40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
28c50 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f  hSession) {..CK_
28c60 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
28c70 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
28c80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28c90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
28ca0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
28cb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
28cc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28cd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
28ce0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
28cf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
28d00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
28d10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
28d20 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
28d30 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
28d40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
28d50 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
28d60 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28d70 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
28d80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28d90 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
28da0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
28db0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28dc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
28dd0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
28de0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28df0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
28e00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28e10 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
28e20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
28e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28e40 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
28e50 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
28e60 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28e70 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28e80 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28e90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
28ea0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
28eb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28ec0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28ed0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28ee0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28ef0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
28f00 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
28f10 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28f20 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28f30 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
28f40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28f50 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
28f60 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28f70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28f80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28f90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28fa0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
28fb0 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
28fc0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28fd0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
28fe0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
28ff0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29000 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
29010 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
29020 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
29030 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
29040 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29050 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
29060 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
29070 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
29080 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
29090 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
290a0 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65  Value) {....free
290b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
290c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
290d0 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
290e0 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  lue);...}..}...i
290f0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
29100 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
29110 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66  rch_query) {...f
29120 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
29130 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
29140 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a  arch_query);..}.
29150 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
29160 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
29170 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29180 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
29190 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
291a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
291b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
291c0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
291d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
291e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
291f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29200 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29210 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
29220 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
29230 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
29240 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29250 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
29260 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
29270 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
29280 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
29290 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
292a0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
292b0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
292c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
292d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
292e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
292f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
29300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29310 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
29320 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
29330 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
29340 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
29350 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
29360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29370 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
29380 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29390 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
293a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
293b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
293c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
293d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
293e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
293f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
29400 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ncrypt)(CK_SESSI
29410 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29420 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
29430 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
29440 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
29450 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
29460 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dData, CK_ULONG_
29470 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
29480 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
29490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
294a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
294b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
294c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
294d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
294e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
294f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29500 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29510 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29520 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29530 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29540 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29550 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29560 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
29570 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29580 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
29590 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
295a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
295b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
295c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
295d0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
295e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
295f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
29600 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
29610 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
29620 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
29630 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
29640 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
29650 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
29660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29670 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
29680 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
29690 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
296a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
296b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
296c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
296d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
296e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
296f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
29700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29710 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29720 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29730 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
29740 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29750 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
29760 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
29770 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29780 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
29790 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
297a0 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _EncryptFinal)(C
297b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
297c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
297d0 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72  TE_PTR pLastEncr
297e0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
297f0 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45  ONG_PTR pulLastE
29800 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
29810 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
29820 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
29830 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
29840 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
29850 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29860 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29870 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
29880 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29890 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
298a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
298b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
298c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
298d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
298e0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
298f0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
29900 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29910 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
29920 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29930 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
29940 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
29950 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74  V, C_DecryptInit
29960 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29970 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29980 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
29990 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
299a0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
299b0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
299c0 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b  etval;...hKey--;
299d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
299e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
299f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29a00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29a10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29a20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29a30 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
29a40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29a50 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29a60 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29a70 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20  .if (pMechanism 
29a80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
29a90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29aa0 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
29ab0 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ism is NULL.");.
29ac0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
29ad0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
29ae0 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
29af0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
29b00 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a  CKM_RSA_PKCS) {.
29b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29b20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
29b30 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
29b40 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65  ism not specifie
29b50 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  d as CKM_RSA_PKC
29b60 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
29b70 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
29b80 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
29b90 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
29ba0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
29bb0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
29bc0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
29bd0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
29be0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
29bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29c00 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
29c10 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
29c20 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
29c30 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
29c40 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
29c50 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
29c60 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
29c70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29c80 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
29c90 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
29ca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29cb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
29cc0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
29cd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
29ce0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
29cf0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
29d00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29d10 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
29d20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29d30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29d40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
29d50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29d60 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
29d70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
29d80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
29d90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
29da0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
29db0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29dc0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
29dd0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
29de0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29df0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29e00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29e10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29e20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20  Decrypt already 
29e30 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
29e40 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
29e50 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
29e60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
29e70 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
29e80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
29e90 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
29ea0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
29eb0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29ec0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
29ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29ee0 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
29ef0 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
29f00 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
29f10 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
29f20 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
29f30 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
29f40 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
29f50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
29f60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29f70 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
29f80 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
29f90 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
29fa0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
29fb0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29fc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
29fd0 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ypt_active = 1;.
29fe0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29ff0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2a000 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ypt_mechanism = 
2a010 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
2a020 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73  anism;..cackey_s
2a030 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a040 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
2a050 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  arm = pMechanism
2a060 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63  ->pParameter;..c
2a070 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2a080 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2a090 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20  _mech_parmlen = 
2a0a0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61  pMechanism->ulPa
2a0b0 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63  rameterLen;..cac
2a0c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a0d0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
2a0e0 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
2a0f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a100 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
2a110 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
2a120 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2a130 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2a140 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2a150 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2a160 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a180 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2a190 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2a1a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2a1b0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2a1c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a1d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2a1e0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2a1f0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2a200 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2a210 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2a220 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b  V, C_Decrypt)(CK
2a230 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2a240 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2a250 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2a260 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
2a270 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
2a280 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2a290 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
2a2a0 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
2a2b0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c  ..CK_ULONG datal
2a2c0 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c  en_update, datal
2a2d0 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56  en_final;..CK_RV
2a2e0 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69   decrypt_ret;..i
2a2f0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2a300 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a310 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2a320 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2a330 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2a340 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a350 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2a360 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2a370 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a380 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2a390 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a3a0 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20  .if (pulDataLen 
2a3b0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2a3c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a3d0 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61  ("Error. pulData
2a3e0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2a3f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2a400 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2a410 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  ...datalen_updat
2a420 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b  e = *pulDataLen;
2a430 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
2a440 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
2a450 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72  (hSession, pEncr
2a460 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63  yptedData, ulEnc
2a470 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70  ryptedDataLen, p
2a480 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75  Data, &datalen_u
2a490 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63  pdate);..if (dec
2a4a0 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
2a4b0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
2a4c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a4d0 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 61  or.  DecryptUpda
2a4e0 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  te() returned fa
2a4f0 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
2a500 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2a510 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29  ng) decrypt_ret)
2a520 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 74  ;....if (decrypt
2a530 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46  _ret != CKR_BUFF
2a540 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
2a550 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
2a560 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61  decryption opera
2a570 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65  tion */.....mute
2a580 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2a590 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2a5a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
2a5b0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2a5c0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
2a5d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a5e0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2a5f0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2a600 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2a610 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
2a620 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
2a630 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a640 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2a650 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2a660 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a670 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
2a680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a690 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2a6a0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2a6b0 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
2a6c0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2a6d0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09  LE_INVALID);....
2a6e0 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
2a6f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a700 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
2a710 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
2a720 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2a730 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2a740 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2a750 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a760 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
2a770 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
2a780 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2a790 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2a7a0 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  IZED);....}.....
2a7b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a7c0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2a7d0 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  t_active = 0;...
2a7e0 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2a7f0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2a800 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2a810 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
2a820 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2a830 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
2a840 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a850 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2a860 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
2a870 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2a880 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d  ERROR);....}...}
2a890 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
2a8a0 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66  pt_ret);..}...if
2a8b0 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61   (pData) {...pDa
2a8c0 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70  ta += datalen_up
2a8d0 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65  date;..}..datale
2a8e0 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61  n_final = *pulDa
2a8f0 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f  taLen - datalen_
2a900 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70  update;...decryp
2a910 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70  t_ret = C_Decryp
2a920 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c  tFinal(hSession,
2a930 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e   pData, &datalen
2a940 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65  _final);..if (de
2a950 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
2a960 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
2a970 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a980 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e  ror.  DecryptFin
2a990 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  al() returned fa
2a9a0 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
2a9b0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2a9c0 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29  ng) decrypt_ret)
2a9d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72  ;....return(decr
2a9e0 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a  ypt_ret);..}...*
2a9f0 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74  pulDataLen = dat
2aa00 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61  alen_update + da
2aa10 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43  talen_final;...C
2aa20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2aa30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2aa40 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2aa50 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2aa60 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2aa70 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2aa80 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64  RV, C_DecryptUpd
2aa90 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2aaa0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2aab0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2aac0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2aad0 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
2aae0 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
2aaf0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2ab00 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
2ab10 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  tLen) {..static 
2ab20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38  CK_BYTE buf[1638
2ab30 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66  4];..ssize_t buf
2ab40 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  len;..CK_SLOT_ID
2ab50 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20   slotID;..CK_RV 
2ab60 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2ab70 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
2ab80 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2ab90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2aba0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2abb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2abc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2abd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2abe0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2abf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ac00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ac10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ac20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2ac30 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2ac40 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2ac50 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2ac60 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2ac70 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2ac80 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2ac90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2aca0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2acb0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2acc0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2acd0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2ace0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2acf0 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
2ad00 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
2ad10 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2ad20 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
2ad30 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
2ad40 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64  e are asked to d
2ad50 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e  ecrypt nothing..
2ad60 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  . */...CACKEY_DE
2ad70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2ad80 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2ad90 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
2ada0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
2adb0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2adc0 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70  .}...if (pEncryp
2add0 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29  tedPart == NULL)
2ade0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2adf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ae00 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20   pEncryptedPart 
2ae10 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45  is NULL, but ulE
2ae20 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2ae30 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
2ae40 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2ae50 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2ae60 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50  if (ulEncryptedP
2ae70 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
2ae80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ae90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45  INTF("Error. ulE
2aea0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2aeb0 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
2aec0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
2aed0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2aee0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2aef0 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65  ...if (pulPartLe
2af00 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
2af10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2af20 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61  TF("Error. pulPa
2af30 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  rtLen is NULL.")
2af40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2af50 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2af60 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2af70 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2af80 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2af90 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2afa0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2afb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2afc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2afd0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2afe0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2aff0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2b000 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2b010 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b020 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2b030 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2b040 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2b050 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2b060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b070 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2b080 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2b090 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2b0a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2b0b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
2b0c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b0d0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2b0e0 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
2b0f0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2b100 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2b110 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2b120 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b130 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
2b140 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2b150 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2b160 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2b170 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  ZED);..}...slotI
2b180 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
2b190 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
2b1a0 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
2b1b0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
2b1c0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2b1d0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
2b1e0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
2b1f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2b200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b210 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
2b220 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
2b230 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
2b240 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
2b250 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
2b260 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2b270 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
2b280 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2b290 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
2b2a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b2b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
2b2c0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
2b2d0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
2b2e0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
2b2f0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
2b300 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
2b310 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b320 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
2b330 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2b340 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69  ERROR);..}...swi
2b350 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
2b360 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2b370 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
2b380 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
2b390 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
2b3a0 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79  sk card to decry
2b3b0 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20  pt */....buflen 
2b3c0 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
2b3d0 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
2b3e0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
2b3f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b400 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
2b410 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74  entity, pEncrypt
2b420 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70  edPart, ulEncryp
2b430 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c  tedPartLen, buf,
2b440 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c   sizeof(buf), 0,
2b450 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66   1);.....if (buf
2b460 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2b470 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26  SC_E_NEEDLOGIN &
2b480 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  & cackey_pin_com
2b490 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
2b4a0 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e  ....if (_C_Login
2b4b0 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f  MutexArg(hSessio
2b4c0 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c  n, CKU_USER, NUL
2b4d0 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f  L, 0, 0) == CKR_
2b4e0 4f 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c 65  OK) {......bufle
2b4f0 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
2b500 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
2b510 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
2b520 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b530 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2b540 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79  identity, pEncry
2b550 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72  ptedPart, ulEncr
2b560 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75  yptedPartLen, bu
2b570 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20  f, sizeof(buf), 
2b580 30 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09  0, 1);.....}....
2b590 7d 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  }.....if (buflen
2b5a0 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44   < 0) {...../* D
2b5b0 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64  ecryption failed
2b5c0 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66  . */.....if (buf
2b5d0 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2b5e0 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
2b5f0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2b600 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
2b610 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
2b620 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  se if (buflen ==
2b630 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
2b640 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
2b650 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2b660 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a  DEVICE_REMOVED;.
2b670 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
2b680 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b690 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
2b6a0 20 73 65 6e 64 20 41 50 44 55 2c 20 65 72 72 6f   send APDU, erro
2b6b0 72 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e 67 20  r = %li", (long 
2b6c0 69 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  int) buflen);...
2b6d0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2b6e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
2b6f0 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
2b700 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
2b710 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a  ong) buflen) > *
2b720 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50  pulPartLen && pP
2b730 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65  art) {...../* De
2b740 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f  crypted data too
2b750 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65   large */.....re
2b760 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
2b770 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
2b780 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20  } else {.....if 
2b790 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d  (pPart) {......m
2b7a0 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66  emcpy(pPart, buf
2b7b0 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d  , buflen);.....}
2b7c0 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65  ......*pulPartLe
2b7d0 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09  n = buflen;.....
2b7e0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
2b7f0 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
2b800 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2b810 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2b820 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2b830 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2b840 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2b850 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2b860 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b870 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2b880 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2b890 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2b8a0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
2b8b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b8c0 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
2b8d0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
2b8e0 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
2b8f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2b900 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2b910 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  DecryptFinal)(CK
2b920 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2b930 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2b940 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c  E_PTR pLastPart,
2b950 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2b960 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a  lLastPartLen) {.
2b970 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2b980 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  l;..int terminat
2b990 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a  e_decrypt = 1;..
2b9a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b9b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b9c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b9d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b9e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b9f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2ba00 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ba10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ba20 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ba30 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2ba40 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2ba50 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2ba60 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2ba70 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2ba80 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2ba90 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2baa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bab0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2bac0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2bad0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2bae0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2baf0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2bb00 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c  if (pulLastPartL
2bb10 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
2bb20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bb30 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c  NTF("Error. pulL
2bb40 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55  astPartLen is NU
2bb50 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2bb60 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2bb70 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
2bb80 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2bb90 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2bba0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2bbb0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2bbc0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2bbd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2bbe0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2bbf0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2bc00 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2bc10 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2bc20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bc30 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2bc40 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2bc50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2bc60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2bc70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bc80 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2bc90 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2bca0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2bcb0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2bcc0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2bcd0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2bce0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2bcf0 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
2bd00 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2bd10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2bd20 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2bd30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bd40 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
2bd50 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2bd60 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2bd70 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2bd80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2bd90 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  *pulLastPartLen 
2bda0 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74  = 0;...if (pLast
2bdb0 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
2bdc0 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  ..terminate_decr
2bdd0 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ypt = 0;..}...if
2bde0 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72   (terminate_decr
2bdf0 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ypt) {...cackey_
2be00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2be10 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2be20 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
2be30 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2be40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2be50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2be60 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2be70 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2be80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2be90 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2bea0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2beb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2bec0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2bed0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bee0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2bef0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2bf00 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2bf10 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2bf20 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2bf30 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e  K_RV, C_DigestIn
2bf40 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2bf50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2bf60 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2bf70 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09   pMechanism) {..
2bf80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bf90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2bfa0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2bfb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2bfc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bfd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2bfe0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2bff0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c000 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c010 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2c020 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c030 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c040 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c050 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2c060 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c070 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2c080 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2c090 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c0a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c0b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c0c0 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53  _Digest)(CK_SESS
2c0d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2c0e0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2c0f0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2c100 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2c110 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
2c120 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2c130 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
2c140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c150 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c160 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c170 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c190 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c1a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c1b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c1c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c1d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2c1e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c1f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2c200 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c210 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2c220 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c230 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2c240 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2c250 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2c260 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2c270 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2c280 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
2c290 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c2a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2c2b0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2c2c0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
2c2d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2c2e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2c2f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2c300 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2c310 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c320 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c330 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2c340 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c350 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2c360 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2c370 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c380 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2c390 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2c3a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2c3b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2c3c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2c3d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2c3e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c3f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2c400 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2c410 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28  V, C_DigestKey)(
2c420 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c430 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
2c440 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2c450 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2c460 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2c470 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2c480 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2c490 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c4a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c4b0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2c4c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2c4d0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2c4e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2c4f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2c500 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2c510 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2c520 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2c530 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2c540 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c550 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2c560 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c570 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2c580 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2c590 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e  _RV, C_DigestFin
2c5a0 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
2c5b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2c5c0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67  CK_BYTE_PTR pDig
2c5d0 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  est, CK_ULONG_PT
2c5e0 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20  R pulDigestLen) 
2c5f0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2c600 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2c610 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2c620 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2c630 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c640 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2c650 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2c660 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c670 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2c680 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2c690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c6a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2c6b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c6c0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2c6d0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2c6e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2c6f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2c700 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c710 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2c720 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2c730 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b  , C_SignInit)(CK
2c740 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c750 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2c760 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2c770 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2c780 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2c790 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2c7a0 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
2c7b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c7c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c7d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c7e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c7f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c800 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c810 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c820 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c830 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c840 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2c850 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
2c860 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2c870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c880 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
2c890 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2c8a0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2c8b0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2c8c0 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
2c8d0 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
2c8e0 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41  RSA_PKCS) {...CA
2c8f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c900 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
2c910 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
2c920 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
2c930 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b   CKM_RSA_PKCS");
2c940 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
2c950 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
2c960 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2c970 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2c980 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2c990 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2c9a0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2c9b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c9c0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2c9d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c9e0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2c9f0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2ca00 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2ca10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2ca20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
2ca30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2ca40 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2ca50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2ca60 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2ca70 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2ca80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ca90 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2caa0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2cab0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2cac0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2cad0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2cae0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2caf0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2cb00 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2cb10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2cb20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cb30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2cb40 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2cb50 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2cb60 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2cb70 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2cb80 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2cb90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cba0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
2cbb0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2cbc0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2cbd0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2cbe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cbf0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c  "Error.  Sign al
2cc00 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
2cc10 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
2cc20 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2cc30 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
2cc40 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
2cc50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cc60 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2cc70 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
2cc80 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2cc90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2cca0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ccb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
2ccc0 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
2ccd0 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65   range (requeste
2cce0 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20  d key %lu, only 
2ccf0 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61  %lu identities a
2cd00 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e  vailable).", (un
2cd10 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
2cd20 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
2cd30 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  g) cackey_sessio
2cd40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2cd50 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
2cd60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
2cd70 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
2cd80 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
2cd90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cda0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
2cdb0 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  1;...cackey_sess
2cdc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2cdd0 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ign_mechanism = 
2cde0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
2cdf0 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f  anism;...cackey_
2ce00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ce10 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d  n].sign_buflen =
2ce20 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65   128;..cackey_se
2ce30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2ce40 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
2ce50 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  0;..cackey_sessi
2ce60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2ce70 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  gn_buf = malloc(
2ce80 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73  sizeof(*cackey_s
2ce90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cea0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61  ].sign_buf) * ca
2ceb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2cec0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2ced0 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  len);...CACKEY_D
2cee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73  EBUG_PRINTF("Ses
2cef0 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64  sion %lu sign_id
2cf00 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64  entity is %p (id
2cf10 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28  entity #%lu)", (
2cf20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
2cf30 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a  Session, (void *
2cf40 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ) &cackey_sessio
2cf50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2cf60 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28  ntities[hKey], (
2cf70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
2cf80 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65  Key);..cackey_se
2cf90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cfa0 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d  .sign_identity =
2cfb0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
2cfc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2cfd0 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09  tities[hKey];...
2cfe0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2cff0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2d000 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2d010 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2d020 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2d030 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d040 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2d050 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2d060 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d070 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2d080 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2d090 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2d0a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2d0b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
2d0c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
2d0d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2d0e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2d0f0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d100 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d110 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2d120 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2d130 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2d140 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2d150 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
2d160 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e  natureLen) {..un
2d170 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72  signed long star
2d180 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  t_sign_bufused;.
2d190 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b  .CK_RV sign_ret;
2d1a0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2d1b0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
2d1c0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2d1d0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2d1e0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2d1f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d200 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d210 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2d220 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d230 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2d240 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d250 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
2d260 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
2d270 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
2d280 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
2d290 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2d2a0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
2d2b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d2c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2d2d0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
2d2e0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
2d2f0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2d300 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2d310 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f  .}...start_sign_
2d320 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79  bufused = cackey
2d330 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d340 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2d350 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43  ;...sign_ret = C
2d360 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73  _SignUpdate(hSes
2d370 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44  sion, pData, ulD
2d380 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ataLen);..if (si
2d390 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
2d3a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d3b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d3c0 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20  .  SignUpdate() 
2d3d0 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
2d3e0 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
2d3f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
2d400 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20  ign_ret);....if 
2d410 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
2d420 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2d430 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65  L) {....mutex_re
2d440 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2d450 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2d460 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
2d470 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2d480 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
2d490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d4a0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2d4b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2d4c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2d4d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a  L_ERROR);....}..
2d4e0 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2d4f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d500 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
2d510 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2d520 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2d530 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
2d540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d550 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2d560 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2d570 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2d580 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2d590 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09  NVALID);....}...
2d5a0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2d5b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d5c0 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
2d5d0 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2d5e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2d5f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
2d600 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d610 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
2d620 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2d630 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2d640 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2d650 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09  NITIALIZED);....
2d660 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  }.....cackey_ses
2d670 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d680 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b  sign_active = 0;
2d690 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  .....mutex_retva
2d6a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2d6b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2d6c0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
2d6d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2d6e0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
2d6f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d700 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2d710 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
2d720 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2d730 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
2d740 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  ..}....return(si
2d750 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69  gn_ret);..}...si
2d760 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46  gn_ret = C_SignF
2d770 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
2d780 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69  Signature, pulSi
2d790 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66  gnatureLen);..if
2d7a0 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
2d7b0 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69  R_OK) {...if (si
2d7c0 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55  gn_ret == CKR_BU
2d7d0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
2d7e0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
2d7f0 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69  G_PRINTF("SignFi
2d800 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43  nal() returned C
2d810 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2d820 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20  ALL (rv = %lu), 
2d830 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70  undoing C_SignUp
2d840 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e  date()", (unsign
2d850 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
2d860 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  t);.....cackey_s
2d870 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d880 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
2d890 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
2d8a0 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  sed;.....return(
2d8b0 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a  sign_ret);...}..
2d8c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d8d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2d8e0 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72  ignFinal() retur
2d8f0 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
2d900 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
2d910 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
2d920 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73  et);....return(s
2d930 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69  ign_ret);..}...i
2d940 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d  f (pSignature ==
2d950 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2d960 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d970 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 69  pSignature speci
2d980 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e  fied as NULL, un
2d990 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61  doing C_SignUpda
2d9a0 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65  te()");....cacke
2d9b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2d9c0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2d9d0 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62  d = start_sign_b
2d9e0 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72  ufused;....retur
2d9f0 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a  n(sign_ret);..}.
2da00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2da10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2da20 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2da30 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2da40 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2da50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2da60 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64  CK_RV, C_SignUpd
2da70 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2da80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2da90 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2daa0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2dab0 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d  artLen) {..int m
2dac0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2dad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dae0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2daf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2db00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2db10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2db20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2db30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2db40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2db50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2db60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2db70 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2db80 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2db90 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2dba0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2dbb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2dbc0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2dbd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2dbe0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2dbf0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2dc00 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2dc10 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2dc20 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2dc30 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20   (pPart == NULL 
2dc40 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  && ulPartLen == 
2dc50 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
2dc60 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
2dc70 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20  e asked to sign 
2dc80 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
2dc90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dca0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2dcb0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
2dcc0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
2dcd0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
2dce0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
2dcf0 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (pPart == NULL)
2dd00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2dd10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2dd20 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20   pPart is NULL, 
2dd30 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  but ulPartLen is
2dd40 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
2dd50 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2dd60 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2dd70 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30   (ulPartLen == 0
2dd80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2dd90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2dda0 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30  . ulPartLen is 0
2ddb0 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
2ddc0 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
2ddd0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2dde0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
2ddf0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2de00 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2de10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2de20 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2de30 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2de40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2de50 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2de60 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2de70 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2de80 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2de90 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2dea0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2deb0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2dec0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2ded0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2dee0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2def0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2df00 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2df10 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2df20 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2df30 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2df40 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2df50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2df60 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
2df70 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2df80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2df90 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2dfa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2dfb0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
2dfc0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2dfd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2dfe0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2dff0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
2e000 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
2e010 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e020 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
2e030 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
2e040 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63  A_PKCS:..../* Ac
2e050 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c  cumulate directl
2e060 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63  y */....if ((cac
2e070 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e080 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2e090 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29  sed + ulPartLen)
2e0a0 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   > cackey_sessio
2e0b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2e0c0 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09  n_buflen) {.....
2e0d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e0e0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2e0f0 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09  uflen *= 2;.....
2e100 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2e110 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2e120 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61  buf = realloc(ca
2e130 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2e140 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2e150 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  , sizeof(*cackey
2e160 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e170 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20  on].sign_buf) * 
2e180 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e190 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2e1a0 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09  uflen);....}....
2e1b0 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
2e1c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e1d0 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63  ].sign_buf + cac
2e1e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e1f0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2e200 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61  sed, pPart, ulPa
2e210 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b  rtLen);.....cack
2e220 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e230 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2e240 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b  ed += ulPartLen;
2e250 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
2e260 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2e270 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2e280 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e290 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2e2a0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2e2b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e2c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2e2d0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2e2e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e2f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2e300 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2e310 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2e320 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2e330 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2e340 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2e350 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e360 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2e370 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  nFinal)(CK_SESSI
2e380 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e390 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2e3a0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2e3b0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
2e3c0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61  atureLen) {..sta
2e3d0 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62  tic CK_BYTE sigb
2e3e0 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65  uf[1024];..ssize
2e3f0 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43  _t sigbuflen;..C
2e400 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
2e410 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
2e420 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
2e430 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  ROR;..int termin
2e440 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69  ate_sign = 1;..i
2e450 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2e460 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e470 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2e480 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2e490 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2e4a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e4b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2e4c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2e4d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e4e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2e4f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2e500 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72  .if (pulSignatur
2e510 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  eLen == NULL) {.
2e520 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e530 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
2e540 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73  lSignatureLen is
2e550 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2e560 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2e570 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2e580 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2e590 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2e5a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2e5b0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2e5c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e5d0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2e5e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e5f0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2e600 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2e610 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2e620 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2e630 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2e640 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2e650 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2e660 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2e670 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2e680 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2e690 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e6a0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2e6b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2e6c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2e6d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2e6e0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2e6f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2e700 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2e710 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2e720 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2e730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2e750 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2e760 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2e770 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2e780 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2e790 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2e7a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e7b0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
2e7c0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2e7d0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2e7e0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2e7f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e800 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
2e810 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2e820 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2e830 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2e840 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c  ALIZED);..}...sl
2e850 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
2e860 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e870 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
2e880 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
2e890 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
2e8a0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
2e8b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
2e8c0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
2e8d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e8e0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
2e8f0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
2e900 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
2e910 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
2e920 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
2e930 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2e940 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2e950 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2e960 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
2e970 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e990 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
2e9a0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
2e9b0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
2e9c0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
2e9d0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
2e9e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2e9f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2ea00 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2ea10 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2ea20 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
2ea30 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2ea40 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
2ea50 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
2ea60 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
2ea70 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20  sk card to sign 
2ea80 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  */....CACKEY_DEB
2ea90 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e  UG_PRINTF("Askin
2eaa0 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69  g to sign from i
2eab0 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65  dentity %p in se
2eac0 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69  ssion %lu", (voi
2ead0 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73  d *) cackey_sess
2eae0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2eaf0 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75  ign_identity, (u
2eb00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
2eb10 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62  ession);....sigb
2eb20 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
2eb30 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
2eb40 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2eb50 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
2eb60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2eb70 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65  _identity, cacke
2eb80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2eb90 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63  ion].sign_buf, c
2eba0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ebb0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2ebc0 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73  fused, sigbuf, s
2ebd0 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31  izeof(sigbuf), 1
2ebe0 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69  , 0);.....if (si
2ebf0 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  gbuflen == CACKE
2ec00 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
2ec10 49 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e  IN && cackey_pin
2ec20 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
2ec30 29 20 7b 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c  ) {.....if (_C_L
2ec40 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65  oginMutexArg(hSe
2ec50 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c  ssion, CKU_USER,
2ec60 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20   NULL, 0, 0) == 
2ec70 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73  CKR_OK) {......s
2ec80 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  igbuflen = cacke
2ec90 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
2eca0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2ecb0 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ID], cackey_sess
2ecc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ecd0 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61  ign_identity, ca
2ece0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ecf0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2ed00 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
2ed10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2ed20 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66  _bufused, sigbuf
2ed30 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29  , sizeof(sigbuf)
2ed40 2c 20 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09  , 1, 0);.....}..
2ed50 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62  ..}.....if (sigb
2ed60 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
2ed70 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
2ed80 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ed. */.....if (s
2ed90 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
2eda0 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
2edb0 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76  GIN) {......retv
2edc0 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  al = CKR_USER_NO
2edd0 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09  T_LOGGED_IN;....
2ede0 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62  .} else if (sigb
2edf0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2ee00 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
2ee10 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  NT) {......retva
2ee20 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  l = CKR_DEVICE_R
2ee30 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c  EMOVED;.....} el
2ee40 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  se {......retval
2ee50 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2ee60 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  RROR;.....}....}
2ee70 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69   else if (((unsi
2ee80 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
2ee90 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e  flen) > *pulSign
2eea0 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67  atureLen && pSig
2eeb0 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a  nature) {...../*
2eec0 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f   Signed data too
2eed0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41   large */.....CA
2eee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2eef0 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  F("retval = CKR_
2ef00 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2ef10 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25  ;  sigbuflen = %
2ef20 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  lu, pulSignature
2ef30 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  Len = %lu", (uns
2ef40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
2ef50 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64  uflen, (unsigned
2ef60 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61   long) *pulSigna
2ef70 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72  tureLen);......r
2ef80 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2ef90 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09  ER_TOO_SMALL;...
2efa0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
2efb0 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65  n = 0;....} else
2efc0 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65   {.....terminate
2efd0 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09  _sign = 0;......
2efe0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20  if (pSignature) 
2eff0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53  {......memcpy(pS
2f000 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66  ignature, sigbuf
2f010 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09  , sigbuflen);...
2f020 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
2f030 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  gn = 1;.....}...
2f040 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  ...*pulSignature
2f050 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b  Len = sigbuflen;
2f060 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2f070 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09  KR_OK;....}.....
2f080 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28  break;..}...if (
2f090 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20  terminate_sign) 
2f0a0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
2f0b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f0c0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09  ].sign_buf) {...
2f0d0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
2f0e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f0f0 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a  sign_buf);...}..
2f100 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2f110 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2f120 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  _active = 0;..}.
2f130 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2f140 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2f150 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2f160 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2f170 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2f180 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f190 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2f1a0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2f1b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2f1c0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2f1d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f1e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f1f0 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
2f200 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
2f210 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
2f220 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2f230 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
2f240 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
2f250 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2f260 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2f270 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2f280 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2f290 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2f2a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f2b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2f2c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2f2d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2f2e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f2f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2f300 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2f310 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2f320 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2f330 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2f340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f350 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2f360 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f370 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2f380 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f390 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2f3a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f3b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f3c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f3d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f3e0 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f  SignRecover)(CK_
2f3f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2f400 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2f410 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
2f420 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
2f430 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2f440 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2f450 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
2f460 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2f470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f480 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f490 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f4a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f4b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f4c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f4d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f4e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f4f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f500 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f510 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f520 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f530 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f540 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f550 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f560 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f570 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f580 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f590 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f5a0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2f5b0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
2f5c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2f5d0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2f5e0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2f5f0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2f600 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2f610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f620 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f630 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f640 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f660 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f670 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f680 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f690 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f6a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f6c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f6d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f6e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f6f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f700 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f710 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f720 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f730 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f740 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2f750 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2f760 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2f770 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2f780 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2f790 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2f7a0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2f7b0 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
2f7c0 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2f7d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f7e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f7f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f800 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f810 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f820 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f830 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f840 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f850 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f860 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f870 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f880 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f890 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f8a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f8b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f8c0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f8d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f8e0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f8f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f900 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2f910 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2f920 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2f930 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2f940 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2f950 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
2f960 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f970 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2f980 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2f990 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2f9a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f9b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2f9c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2f9d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2f9e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2f9f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2fa00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fa10 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2fa20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2fa30 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2fa40 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2fa50 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2fa60 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2fa70 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2fa80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2fa90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
2faa0 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53  erifyFinal)(CK_S
2fab0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2fac0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2fad0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
2fae0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
2faf0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
2fb00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fb10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2fb20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2fb30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2fb40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fb50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2fb60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2fb70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2fb80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2fb90 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2fba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2fbb0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2fbc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2fbd0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2fbe0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2fbf0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2fc00 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2fc10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2fc20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2fc30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2fc40 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ifyRecoverInit)(
2fc50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2fc60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2fc70 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2fc80 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2fc90 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2fca0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2fcb0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2fcc0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2fcd0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2fce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fcf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2fd00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2fd10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2fd20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2fd30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2fd40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fd50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2fd60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2fd70 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2fd80 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2fd90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2fda0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2fdb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fdc0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2fdd0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2fde0 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
2fdf0 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
2fe00 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2fe10 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
2fe20 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
2fe30 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20  ulSignatureLen, 
2fe40 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2fe50 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
2fe60 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
2fe70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fe80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2fe90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2fea0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2feb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fec0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2fed0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2fee0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2fef0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ff00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2ff10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ff20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ff30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ff40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2ff50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ff60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2ff70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2ff80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ff90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ffa0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2ffb0 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
2ffc0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2ffd0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2ffe0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2fff0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
30000 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
30010 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
30020 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
30030 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
30040 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
30050 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
30060 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
30070 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
30080 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
30090 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
300a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
300b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
300c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
300d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
300e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
300f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
30100 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
30110 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30120 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30130 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30140 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
30150 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30160 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
30170 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
30180 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
30190 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  tDigestUpdate)(C
301a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
301b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
301c0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
301d0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
301e0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
301f0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
30200 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
30210 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
30220 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
30230 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
30240 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
30250 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
30260 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30270 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
30280 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
30290 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
302a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
302b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
302c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
302d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
302e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
302f0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
30300 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
30310 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
30320 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
30330 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30340 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
30350 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
30360 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  , C_SignEncryptU
30370 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
30380 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
30390 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
303a0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
303b0 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
303c0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
303d0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
303e0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
303f0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
30400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30410 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
30420 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
30430 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
30440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30450 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
30460 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
30470 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
30480 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
30490 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
304a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
304b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
304c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
304d0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
304e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
304f0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
30500 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30510 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
30520 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30530 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
30540 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29  yptVerifyUpdate)
30550 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30560 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
30570 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
30580 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
30590 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
305a0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
305b0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
305c0 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
305d0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
305e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
305f0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
30600 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
30610 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30620 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30630 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
30640 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
30650 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
30660 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
30670 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30680 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
30690 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
306a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
306b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
306c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
306d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
306e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
306f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
30700 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
30710 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
30720 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
30730 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
30740 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
30750 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41  pMechanism, CK_A
30760 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
30770 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
30780 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
30790 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
307a0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
307b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
307c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
307d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
307e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
307f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30800 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
30810 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
30820 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
30830 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
30840 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
30850 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
30860 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
30870 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30880 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30890 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
308a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
308b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
308c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
308d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
308e0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
308f0 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45  teKeyPair)(CK_SE
30900 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30910 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
30920 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
30930 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  sm, CK_ATTRIBUTE
30940 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54  _PTR pPublicKeyT
30950 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
30960 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74  G ulPublicKeyAtt
30970 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
30980 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
30990 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74  rivateKeyTemplat
309a0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72  e, CK_ULONG ulPr
309b0 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74  ivateKeyAttribut
309c0 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
309d0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
309e0 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ublicKey, CK_OBJ
309f0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
30a00 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09  hPrivateKey) {..
30a10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30a20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30a30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
30a40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
30a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30a60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
30a70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
30a80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
30a90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30aa0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
30ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30ac0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30ad0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30ae0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
30af0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30b00 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
30b10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30b20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
30b30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
30b40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
30b50 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  _WrapKey)(CK_SES
30b60 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
30b70 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
30b80 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
30b90 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
30ba0 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79  DLE hWrappingKey
30bb0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
30bc0 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45  LE hKey, CK_BYTE
30bd0 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
30be0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
30bf0 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29  ulWrappedKeyLen)
30c00 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
30c10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
30c20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
30c30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
30c40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30c50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30c60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
30c70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
30c80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
30c90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
30ca0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30cb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30cc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30cd0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
30ce0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
30cf0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
30d00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
30d10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30d20 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
30d30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
30d40 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28  V, C_UnwrapKey)(
30d50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
30d60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
30d70 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
30d80 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
30d90 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61  CT_HANDLE hUnwra
30da0 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54  ppingKey, CK_BYT
30db0 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
30dc0 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72  y, CK_ULONG ulWr
30dd0 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f  appedKeyLen, CK_
30de0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
30df0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
30e00 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
30e10 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
30e20 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
30e30 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
30e40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
30e50 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
30e60 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
30e70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30e80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
30e90 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
30ea0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30eb0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
30ec0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
30ed0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30ee0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
30ef0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30f00 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
30f10 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
30f20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
30f30 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
30f40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30f50 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
30f60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
30f70 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43  , C_DeriveKey)(C
30f80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30f90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
30fa0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
30fb0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
30fc0 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65  T_HANDLE hBaseKe
30fd0 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  y, CK_ATTRIBUTE_
30fe0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
30ff0 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
31000 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
31010 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
31020 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
31030 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
31040 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
31050 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
31060 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
31070 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31080 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
31090 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
310a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
310b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
310c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
310d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
310e0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
310f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
31100 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
31110 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
31120 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
31130 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
31140 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
31150 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
31160 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61  (CK_RV, C_SeedRa
31170 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
31180 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
31190 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
311a0 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  eed, CK_ULONG ul
311b0 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  SeedLen) {..CACK
311c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
311d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
311e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
311f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
31200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31210 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
31220 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
31230 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
31240 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
31250 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
31260 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
31270 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
31280 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
31290 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
312a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
312b0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
312c0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
312d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
312e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
312f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
31300 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f  erateRandom)(CK_
31310 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
31320 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
31330 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61  _PTR pRandomData
31340 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e  , CK_ULONG ulRan
31350 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  domLen) {..CACKE
31360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31370 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
31380 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
31390 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
313a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
313b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
313c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
313d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
313e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
313f0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
31400 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
31410 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
31420 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
31430 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
31440 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
31450 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
31460 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
31470 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
31480 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
31490 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
314a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
314b0 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
314c0 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53  nStatus)(CK_SESS
314d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
314e0 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ion) {..CACKEY_D
314f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
31500 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
31510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
31520 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
31530 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
31540 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  EL (%i)", CKR_FU
31550 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
31560 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  LEL);...return(C
31570 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
31580 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65  PARALLEL);...hSe
31590 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e  ssion = hSession
315a0 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
315b0 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
315c0 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65  ning */.}../* De
315d0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
315e0 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
315f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
31600 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29  _CancelFunction)
31610 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
31620 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
31630 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31640 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
31650 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31660 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
31670 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
31680 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22  T_PARALLEL (%i)"
31690 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
316a0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
316b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
316c0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
316d0 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20  );...hSession = 
316e0 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70  hSession; /* Sup
316f0 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
31700 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
31710 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
31720 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
31730 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28  etFunctionList)(
31740 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
31750 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74  _PTR_PTR ppFunct
31760 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46  ionList) {..CK_F
31770 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
31780 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
31790 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
317a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
317b0 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69  ;...if (ppFuncti
317c0 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  onList == NULL) 
317d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
317e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
317f0 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69  ppFunctionList i
31800 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
31810 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
31820 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46  TS_BAD);..}...pF
31830 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61  unctionList = ma
31840 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75  lloc(sizeof(*pFu
31850 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09  nctionList));...
31860 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
31870 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
31880 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
31890 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
318a0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
318b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
318c0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28  rsion.minor = ((
318d0 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
318e0 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
318f0 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46   8) & 0xff;...pF
31900 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
31910 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e  nitialize = C_In
31920 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  itialize;..pFunc
31930 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61  tionList->C_Fina
31940 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a  lize = C_Finaliz
31950 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
31960 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43  t->C_GetInfo = C
31970 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  _GetInfo;..pFunc
31980 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
31990 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53  lotList = C_GetS
319a0 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  lotList;..pFunct
319b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
319c0 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c  otInfo = C_GetSl
319d0 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  otInfo;..pFuncti
319e0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b  onList->C_GetTok
319f0 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f  enInfo = C_GetTo
31a00 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  kenInfo;..pFunct
31a10 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46  ionList->C_WaitF
31a20 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f  orSlotEvent = C_
31a30 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
31a40 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31a50 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
31a60 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68  List = C_GetMech
31a70 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e  anismList;..pFun
31a80 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
31a90 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20  MechanismInfo = 
31aa0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
31ab0 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
31ac0 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20  st->C_InitToken 
31ad0 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09  = C_InitToken;..
31ae0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31af0 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69  _InitPIN = C_Ini
31b00 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tPIN;..pFunction
31b10 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d  List->C_SetPIN =
31b20 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e   C_SetPIN;..pFun
31b30 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65  ctionList->C_Ope
31b40 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65  nSession = C_Ope
31b50 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  nSession;..pFunc
31b60 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
31b70 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f  eSession = C_Clo
31b80 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  seSession;..pFun
31b90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
31ba0 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20  seAllSessions = 
31bb0 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
31bc0 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ns;..pFunctionLi
31bd0 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e  st->C_GetSession
31be0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73  Info = C_GetSess
31bf0 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ionInfo;..pFunct
31c00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70  ionList->C_GetOp
31c10 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43  erationState = C
31c20 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
31c30 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
31c40 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69  st->C_SetOperati
31c50 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f  onState = C_SetO
31c60 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09  perationState;..
31c70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31c80 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e  _Login = C_Login
31c90 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31ca0 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c  ->C_Logout = C_L
31cb0 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f  ogout;..pFunctio
31cc0 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f  nList->C_CreateO
31cd0 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65  bject = C_Create
31ce0 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
31cf0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62  onList->C_CopyOb
31d00 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a  ject = C_CopyObj
31d10 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
31d20 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62  ist->C_DestroyOb
31d30 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79  ject = C_Destroy
31d40 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
31d50 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a  onList->C_GetObj
31d60 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f  ectSize = C_GetO
31d70 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e  bjectSize;..pFun
31d80 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
31d90 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
31da0 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
31db0 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  alue;..pFunction
31dc0 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69  List->C_SetAttri
31dd0 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65  buteValue = C_Se
31de0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b  tAttributeValue;
31df0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31e00 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e  >C_FindObjectsIn
31e10 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  it = C_FindObjec
31e20 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  tsInit;..pFuncti
31e30 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
31e40 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62  jects = C_FindOb
31e50 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f  jects;..pFunctio
31e60 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
31e70 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69  ectsFinal = C_Fi
31e80 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a  ndObjectsFinal;.
31e90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31ea0 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20  C_EncryptInit = 
31eb0 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_EncryptInit;..
31ec0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31ed0 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63  _Encrypt = C_Enc
31ee0 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
31ef0 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55  List->C_EncryptU
31f00 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70  pdate = C_Encryp
31f10 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
31f20 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
31f30 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72  ptFinal = C_Encr
31f40 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
31f50 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
31f60 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72  yptInit = C_Decr
31f70 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  yptInit;..pFunct
31f80 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
31f90 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a  pt = C_Decrypt;.
31fa0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31fb0 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20  C_DecryptUpdate 
31fc0 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
31fd0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
31fe0 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61  t->C_DecryptFina
31ff0 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  l = C_DecryptFin
32000 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
32010 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74  st->C_DigestInit
32020 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b   = C_DigestInit;
32030 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
32040 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69  >C_Digest = C_Di
32050 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  gest;..pFunction
32060 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70  List->C_DigestUp
32070 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55  date = C_DigestU
32080 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
32090 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b  nList->C_DigestK
320a0 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79  ey = C_DigestKey
320b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
320c0 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20  ->C_DigestFinal 
320d0 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b  = C_DigestFinal;
320e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
320f0 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f  >C_SignInit = C_
32100 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63  SignInit;..pFunc
32110 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
32120 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e   = C_Sign;..pFun
32130 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
32140 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  nUpdate = C_Sign
32150 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
32160 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69  onList->C_SignFi
32170 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  nal = C_SignFina
32180 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
32190 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
321a0 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63  Init = C_SignRec
321b0 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63  overInit;..pFunc
321c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
321d0 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e  Recover = C_Sign
321e0 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
321f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
32200 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79  yInit = C_Verify
32210 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
32220 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d  List->C_Verify =
32230 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e   C_Verify;..pFun
32240 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
32250 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65  ifyUpdate = C_Ve
32260 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75  rifyUpdate;..pFu
32270 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
32280 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65  rifyFinal = C_Ve
32290 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  rifyFinal;..pFun
322a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
322b0 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d  ifyRecoverInit =
322c0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
322d0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
322e0 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65  List->C_VerifyRe
322f0 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79  cover = C_Verify
32300 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
32310 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
32320 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  tEncryptUpdate =
32330 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74   C_DigestEncrypt
32340 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
32350 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
32360 74 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  tDigestUpdate = 
32370 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
32380 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
32390 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63  nList->C_SignEnc
323a0 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53  ryptUpdate = C_S
323b0 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
323c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
323d0 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  ->C_DecryptVerif
323e0 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  yUpdate = C_Decr
323f0 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b  yptVerifyUpdate;
32400 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
32410 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d  >C_GenerateKey =
32420 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a   C_GenerateKey;.
32430 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
32440 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
32450 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  r = C_GenerateKe
32460 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f  yPair;..pFunctio
32470 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79  nList->C_WrapKey
32480 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70   = C_WrapKey;..p
32490 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
324a0 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e  UnwrapKey = C_Un
324b0 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74  wrapKey;..pFunct
324c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76  ionList->C_Deriv
324d0 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b  eKey = C_DeriveK
324e0 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
324f0 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d  st->C_SeedRandom
32500 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b   = C_SeedRandom;
32510 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
32520 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f  >C_GenerateRando
32530 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61  m = C_GenerateRa
32540 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ndom;..pFunction
32550 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
32560 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65  ionStatus = C_Ge
32570 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b  tFunctionStatus;
32580 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
32590 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f  >C_CancelFunctio
325a0 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63  n = C_CancelFunc
325b0 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tion;..pFunction
325c0 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
325d0 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46  ionList = C_GetF
325e0 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a  unctionList;...*
325f0 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
32600 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
32610 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32620 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32630 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
32640 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
32650 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a           (CKR_OK);.}..