Hex Artifact Content

Artifact 595ac3f06f8c8ac7ef3205cae65cf251be0ba35e:


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 50 43 53  .#ifdef HAVE_PCS
0040: 43 4c 49 54 45 5f 48 0a 23 20 20 69 6e 63 6c 75  CLITE_H.#  inclu
0050: 64 65 20 3c 70 63 73 63 6c 69 74 65 2e 68 3e 0a  de <pcsclite.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 57 49 4e 53 43 41 52 44 5f 48 0a 23 20  VE_WINSCARD_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73 63 61   include <winsca
0090: 72 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  rd.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4e 54 5f  def HAVE_STDINT_
00b0: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74  H.#  include <st
00c0: 64 69 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  dint.h>.#endif.#
00d0: 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 54 59  ifdef HAVE_INTTY
00e0: 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  PES_H.#  include
00f0: 20 3c 69 6e 74 74 79 70 65 73 2e 68 3e 0a 23 65   <inttypes.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 53 54 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63  _STDLIB_H.#  inc
0120: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0130: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0140: 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 20 20 69  VE_UNISTD_H.#  i
0150: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0160: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  >.#endif.#ifdef 
0170: 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20  HAVE_STRING_H.# 
0180: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67   include <string
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
01a0: 66 20 48 41 56 45 5f 50 54 48 52 45 41 44 5f 48  f HAVE_PTHREAD_H
01b0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 74 68  .#  include <pth
01c0: 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  read.h>.#endif.#
01d0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 4d 49 54  ifdef HAVE_LIMIT
01e0: 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  S_H.#  include <
01f0: 6c 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66  limits.h>.#endif
0200: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 54 44  .#ifdef HAVE_STD
0210: 49 4f 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20  IO_H.#  include 
0220: 3c 73 74 64 69 6f 2e 68 3e 0a 23 65 6e 64 69 66  <stdio.h>.#endif
0230: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49  .#ifdef HAVE_ZLI
0240: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56  B_H.#  ifdef HAV
0250: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c  E_LIBZ.#    incl
0260: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20  ude <zlib.h>.#  
0270: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69  endif.#else.#  i
0280: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23  fdef HAVE_LIBZ.#
0290: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c      undef HAVE_L
02a0: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  IBZ.#  endif.#en
02b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f  dif..#define CK_
02c0: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b  PTR *.#define CK
02d0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
02e0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d  (returnType, nam
02f0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61  e) returnType na
0300: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45  me.#define CK_DE
0310: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72  CLARE_FUNCTION(r
0320: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0330: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
0340: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
0350: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49  ARE_FUNCTION_POI
0360: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c  NTER(returnType,
0370: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0380: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69  e (* name).#defi
0390: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46  ne CK_CALLBACK_F
03a0: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79  UNCTION(returnTy
03b0: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e  pe, name) return
03c0: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69  Type (* name).#i
03d0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23  fndef NULL_PTR.#
03e0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54    define NULL_PT
03f0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  R 0.#endif..#inc
0400: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a  lude "pkcs11.h".
0410: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78  #include "asn1-x
0420: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20  509.h"..#ifndef 
0430: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0440: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20  VERSION_CODE.#  
0450: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52  define CACKEY_CR
0460: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
0470: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e  ODE 0x021e00.#en
0480: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41  dif..#ifndef CKA
0490: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
04a0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
04b0: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
04c0: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65  TH 0xce536358.#e
04d0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
04e0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04f0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
0500: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
0510: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65  TH 0xce536359.#e
0520: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0530: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
0540: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b  ING.#  define CK
0550: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
0560: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a  NING 0xce53635a.
0570: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43  #endif.#ifndef C
0580: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
0590: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66  ROTECTION.#  def
05a0: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ine CKA_TRUST_EM
05b0: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30  AIL_PROTECTION 0
05c0: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66  xce53635b.#endif
05d0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31  ../* GSC-IS v2.1
05e0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a   Definitions */.
05f0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a  /** Classes **/.
0600: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c  #define GSCIS_CL
0610: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20  ASS_ISO7816     
0620: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69        0x00.#defi
0630: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  ne GSCIS_CLASS_G
0640: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20  LOBAL_PLATFORM  
0650: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72   0x80../** Instr
0660: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66  uctions **/.#def
0670: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0680: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20  GET_RESPONSE    
0690: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47    0xC0.#define G
06a0: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
06b0: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42  BINARY       0xB
06c0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06d0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e  INSTR_UPDATE_BIN
06e0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65  ARY     0xD6.#de
06f0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0700: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
0710: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20     0xA4.#define 
0720: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45  GSCIS_INSTR_EXTE
0730: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78  RNAL_AUTH     0x
0740: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  82.#define GSCIS
0750: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c  _INSTR_GET_CHALL
0760: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64  ENGE     0x84.#d
0770: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0780: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_INTERNAL_AUTH 
0790: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65      0x88.#define
07a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
07b0: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30  IFY            0
07c0: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x20.#define GSCI
07d0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20  S_INSTR_SIGN    
07e0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23            0x2A.#
07f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0800: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20  TR_GET_PROP     
0810: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e       0x56.#defin
0820: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0830: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20  T_ACR           
0840: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43  0x4C.#define GSC
0850: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
0860: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a  FFER       0x52.
0870: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0880: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20  STR_SIGNDECRYPT 
0890: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66        0x42..#def
08a0: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  ine GSCIS_PARAM_
08b0: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20  SELECT_APPLET   
08c0: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73    0x04../** Tags
08d0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61   **/./*** CCC Ta
08e0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  gs ***/.#define 
08f0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0910: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F0.#define GSCIS
0920: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20  _TAG_CCC_VER    
0930: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64           0xF1.#d
0940: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0950: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCG_VER         
0960: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65      0xF2.#define
0970: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
0980: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  RL             0
0990: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF3.#define GSCI
09a0: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20  S_TAG_PKCS15    
09b0: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23            0xF4.#
09c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09d0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20  _REG_DATA_MODEL 
09e0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e       0xF5.#defin
09f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
0a00: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20  TABLE           
0a10: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF6.#define GSC
0a20: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
0a30: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a             0xF7.
0a40: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a50: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20  G_REDIRECTION   
0a60: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69        0xFA.#defi
0a70: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20  ne GSCIS_TAG_CT 
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53   0xFB.#define GS
0aa0: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20  CIS_TAG_ST      
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43              0xFC
0ac0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ad0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20  AG_NEXTCCC      
0ae0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a         0xFD../**
0af0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32  * General - EF 2
0b00: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  200 ***/.#define
0b10: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0b30: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x01.#define GSCI
0b40: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20  S_TAG_MNAME     
0b50: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23            0x02.#
0b60: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b70: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _LNAME          
0b80: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e       0x03.#defin
0b90: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  e GSCIS_TAG_SUFF
0ba0: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IX              
0bb0: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x04.#define GSC
0bc0: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
0bd0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a  CY         0x05.
0be0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bf0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20  G_BUREAU        
0c00: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69        0x06.#defi
0c10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c20: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EAU_CODE        
0c30: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53   0x07.#define GS
0c40: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
0c50: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38  E           0x08
0c60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c70: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20  AG_TITLE        
0c80: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66         0x09.#def
0c90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0ca0: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20  ILDING          
0cb0: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47    0x10.#define G
0cc0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0cd0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31  ADDR1        0x1
0ce0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0cf0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
0d00: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65          0x12.#de
0d10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d20: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20  FFICE_CITY      
0d30: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20     0x13.#define 
0d40: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d50: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78  _STATE        0x
0d60: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  14.#define GSCIS
0d70: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20  _TAG_OFFICE_ZIP 
0d80: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64           0x15.#d
0d90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0da0: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20  OFFICE_COUNTRY  
0db0: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65      0x16.#define
0dc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0dd0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30  E_PHONE        0
0de0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x17.#define GSCI
0df0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e00: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23  NE_EXT    0x18.#
0e10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e20: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20  _OFFICE_FAX     
0e30: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e       0x19.#defin
0e40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e50: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20  CE_EMAIL        
0e60: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x1A.#define GSC
0e70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
0e80: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a  OM         0x1B.
0e90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0ea0: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20  G_NONGOV_AGENCY 
0eb0: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69        0x1C.#defi
0ec0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ed0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20  _DESIGNATOR     
0ee0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20   0x1D../*** PII 
0ef0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23  - EF 2100 ***/.#
0f00: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0f10: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20  _SSN            
0f20: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0f30: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20  e GSCIS_TAG_DOB 
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x21.#define GSC
0f60: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20  IS_TAG_GENDER   
0f70: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a             0x22.
0f80: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f  ./*** Login Info
0f90: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30  rmation - EF 400
0fa0: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0fb0: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20  SCIS_TAG_USERID 
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34               0x4
0fd0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0fe0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20  TAG_DOMAIN      
0ff0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65          0x41.#de
1000: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50  fine GSCIS_TAG_P
1010: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20  ASSWORD         
1020: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61     0x42../*** Ca
1030: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  rd Information -
1040: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 5000 ***/.#d
1050: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1060: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20  ISSUERID        
1070: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65      0x50.#define
1080: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10a0: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x51.#define GSCI
10b0: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
10c0: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23            0x52.#
10d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10e0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20  _EXPIRE_DATE    
10f0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e       0x53.#defin
1100: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
1110: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  _TYPE           
1120: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x54.#define GSC
1130: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
1140: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a  CODE       0x57.
1150: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1160: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20  G_CARDID_AID    
1170: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a        0x58../***
1180: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e   PKI Information
1190: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a   - EF 7000 ***/.
11a0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
11b0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20  G_CERTIFICATE   
11c0: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69        0x70.#defi
11d0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
11e0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  T_ISSUE_DATE    
11f0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53   0x71.#define GS
1200: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
1210: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32  IRE_DATE    0x72
1220: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73  ../** Applet IDs
1230: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43   **/.#define GSC
1240: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20  IS_AID_CCC      
1250: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c             0xA0,
1260: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1270: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30  1, 0x16, 0xDB, 0
1280: 78 30 30 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x00../* Maximum 
1290: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
12a0: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
12b0: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
12c0: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
12d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
12e0: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
12f0: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 23 69           250..#i
1300: 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
1310: 47 0a 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  G..#  define CAC
1320: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1330: 28 78 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66  (x...) { fprintf
1340: 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25  (stderr, "%s():%
1350: 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  i: ", __func__, 
1360: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e  __LINE__); fprin
1370: 74 66 28 73 74 64 65 72 72 2c 20 78 29 3b 20 66  tf(stderr, x); f
1380: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1390: 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 73 74 64  \n"); fflush(std
13a0: 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e  err); }.#  defin
13b0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
13c0: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29  RINTBUF(f, x, y)
13d0: 20 7b 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72   { unsigned char
13e0: 20 2a 54 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e   *TMPBUF; unsign
13f0: 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50  ed long idx; TMP
1400: 42 55 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  BUF = (unsigned 
1410: 63 68 61 72 20 2a 29 20 28 78 29 3b 20 66 70 72  char *) (x); fpr
1420: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
1430: 28 29 3a 25 69 3a 20 25 73 20 20 28 25 73 2f 25  ():%i: %s  (%s/%
1440: 6c 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66  lu = {%02x", __f
1450: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c  unc__, __LINE__,
1460: 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65   f, #x, (unsigne
1470: 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50  d long) (y), TMP
1480: 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64  BUF[0]); for (id
1490: 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29  x = 1; idx < (y)
14a0: 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e  ; idx++) { fprin
14b0: 74 66 28 73 74 64 65 72 72 2c 20 22 2c 20 25 30  tf(stderr, ", %0
14c0: 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d  2x", TMPBUF[idx]
14d0: 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 73 74  ); }; fprintf(st
14e0: 64 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66  derr, "})\n"); f
14f0: 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d  flush(stderr); }
1500: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
1510: 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28 78  Y_DEBUG_PERROR(x
1520: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65  ) { fprintf(stde
1530: 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  rr, "%s():%i: ",
1540: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
1550: 45 5f 5f 29 3b 20 70 65 72 72 6f 72 28 78 29 3b  E__); perror(x);
1560: 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b   fflush(stderr);
1570: 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72 65   }.#  define fre
1580: 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44 45  e(x) { CACKEY_DE
1590: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45 45  BUG_PRINTF("FREE
15a0: 28 25 70 29 20 28 25 73 29 22 2c 20 78 2c 20 23  (%p) (%s)", x, #
15b0: 78 29 3b 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a  x); free(x); }..
15c0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43  static void *CAC
15d0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d  KEY_DEBUG_FUNC_M
15e0: 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a  ALLOC(size_t siz
15f0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  e, const char *f
1600: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
1610: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
1620: 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f  ..retval = mallo
1630: 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e  c(size);...fprin
1640: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
1650: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
1660: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  ne);..fprintf(st
1670: 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20  derr, "MALLOC() 
1680: 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a  = %p", retval);.
1690: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
16a0: 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28   "\n");..fflush(
16b0: 73 74 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72  stderr);...retur
16c0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
16d0: 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45  atic void *CACKE
16e0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
16f0: 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c 20  LLOC(void *ptr, 
1700: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e  size_t size, con
1710: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69  st char *func, i
1720: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64  nt line) {..void
1730: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
1740: 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72  al = realloc(ptr
1750: 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72  , size);...if (r
1760: 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a  etval != ptr) {.
1770: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
1780: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66  , "%s():%i: ", f
1790: 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09 66 70  unc, line);...fp
17a0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 52  rintf(stderr, "R
17b0: 45 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25 70 22  EALLOC(%p) = %p"
17c0: 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a  , ptr, retval);.
17d0: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
17e0: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 66 6c 75 73  , "\n");...fflus
17f0: 68 28 73 74 64 65 72 72 29 3b 0a 09 7d 0a 0a 09  h(stderr);..}...
1800: 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55  if (retval == NU
1810: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1820: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a  EBUG_PRINTF(" **
1830: 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c  * ERROR *** real
1840: 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55 4c  loc returned NUL
1850: 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22 2c  L (size = %lu)",
1860: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1870: 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 74   size);..}...ret
1880: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1890: 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41 43  static char *CAC
18a0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
18b0: 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61 72  TRDUP(const char
18c0: 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 61   *ptr, const cha
18d0: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e  r *func, int lin
18e0: 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 76  e) {..char *retv
18f0: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73  al;...retval = s
1900: 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66 70  trdup(ptr);...fp
1910: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
1920: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
1930: 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66   line);..fprintf
1940: 28 73 74 64 65 72 72 2c 20 22 53 54 52 44 55 50  (stderr, "STRDUP
1950: 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c  _MALLOC() = %p",
1960: 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e   retval);..fprin
1970: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
1980: 3b 0a 09 66 66 6c 75 73 68 28 73 74 64 65 72 72  ;..fflush(stderr
1990: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
19a0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  al);.}..static c
19b0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
19c0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
19d0: 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65 64  _TO_STR(unsigned
19e0: 20 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73 77   char tag) {..sw
19f0: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 63  itch (tag) {...c
1a00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
1a10: 52 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  RDID:....return(
1a20: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49  "GSCIS_TAG_CARDI
1a30: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
1a40: 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09  S_TAG_CCC_VER:..
1a50: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1a60: 54 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09  TAG_CCC_VER");..
1a70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1a80: 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCG_VER:....retu
1a90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
1aa0: 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  G_VER");...case 
1ab0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
1ac0: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  L:....return("GS
1ad0: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 22  CIS_TAG_CARDURL"
1ae0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1af0: 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72  TAG_PKCS15:....r
1b00: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1b10: 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61 73  _PKCS15");...cas
1b20: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
1b30: 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72  DATA_MODEL:....r
1b40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1b50: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22  _REG_DATA_MODEL"
1b60: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1b70: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
1b80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1b90: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b  TAG_ACR_TABLE");
1ba0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1bb0: 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09 09  G_CARD_APDU:....
1bc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1bd0: 47 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a 09  G_CARD_APDU");..
1be0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1bf0: 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09  REDIRECTION:....
1c00: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1c10: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29 3b  G_REDIRECTION");
1c20: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c30: 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  G_CT:....return(
1c40: 22 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29 3b  "GSCIS_TAG_CT");
1c50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c60: 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  G_ST:....return(
1c70: 22 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29 3b  "GSCIS_TAG_ST");
1c80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c90: 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72 65  G_NEXTCCC:....re
1ca0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1cb0: 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61 73  NEXTCCC");...cas
1cc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d  e GSCIS_TAG_FNAM
1cd0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1ce0: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b  CIS_TAG_FNAME");
1cf0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d00: 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_MNAME:....retu
1d10: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e  rn("GSCIS_TAG_MN
1d20: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
1d30: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09  CIS_TAG_LNAME:..
1d40: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1d50: 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_LNAME");...c
1d60: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55  ase GSCIS_TAG_SU
1d70: 46 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e 28  FFIX:....return(
1d80: 22 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49  "GSCIS_TAG_SUFFI
1d90: 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  X");...case GSCI
1da0: 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43  S_TAG_GOVT_AGENC
1db0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1dc0: 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45  CIS_TAG_GOVT_AGE
1dd0: 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  NCY");...case GS
1de0: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a  CIS_TAG_BUREAU:.
1df0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e00: 5f 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a 09  _TAG_BUREAU");..
1e10: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1e20: 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09  BUREAU_CODE:....
1e30: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1e40: 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29 3b  G_BUREAU_CODE");
1e50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e60: 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09  G_DEPT_CODE:....
1e70: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1e80: 47 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09  G_DEPT_CODE");..
1e90: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1ea0: 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TITLE:....return
1eb0: 28 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  ("GSCIS_TAG_TITL
1ec0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1ed0: 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a  S_TAG_BUILDING:.
1ee0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1ef0: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b  _TAG_BUILDING");
1f00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1f10: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a 0a  G_OFFICE_ADDR1:.
1f20: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1f30: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
1f40: 31 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  1");...case GSCI
1f50: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
1f60: 52 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  R2:....return("G
1f70: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1f80: 41 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65 20  ADDR2");...case 
1f90: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
1fa0: 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72 6e  _CITY:....return
1fb0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
1fc0: 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61 73  CE_CITY");...cas
1fd0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1fe0: 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65 74  CE_STATE:....ret
1ff0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2000: 46 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a 09  FFICE_STATE");..
2010: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2020: 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72  OFFICE_ZIP:....r
2030: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2040: 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09  _OFFICE_ZIP");..
2050: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2060: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a  OFFICE_COUNTRY:.
2070: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2080: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e  _TAG_OFFICE_COUN
2090: 54 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TRY");...case GS
20a0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
20b0: 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  HONE:....return(
20c0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
20d0: 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73  E_PHONE");...cas
20e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
20f0: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09  CE_PHONE_EXT:...
2100: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2110: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f  AG_OFFICE_PHONE_
2120: 45 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EXT");...case GS
2130: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
2140: 41 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  AX:....return("G
2150: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2160: 46 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53  FAX");...case GS
2170: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45  CIS_TAG_OFFICE_E
2180: 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  MAIL:....return(
2190: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
21a0: 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73  E_EMAIL");...cas
21b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
21c0: 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75  CE_ROOM:....retu
21d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
21e0: 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63  FICE_ROOM");...c
21f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f  ase GSCIS_TAG_NO
2200: 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09  NGOV_AGENCY:....
2210: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2220: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22  G_NONGOV_AGENCY"
2230: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2240: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
2250: 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OR:....return("G
2260: 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53  SCIS_TAG_SSN_DES
2270: 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61 73  IGNATOR");...cas
2280: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a  e GSCIS_TAG_SSN:
2290: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
22a0: 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63  S_TAG_SSN");...c
22b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f  ase GSCIS_TAG_DO
22c0: 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  B:....return("GS
22d0: 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a 09  CIS_TAG_DOB");..
22e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
22f0: 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75 72  GENDER:....retur
2300: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  n("GSCIS_TAG_GEN
2310: 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DER");...case GS
2320: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a  CIS_TAG_USERID:.
2330: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2340: 5f 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a 09  _TAG_USERID");..
2350: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2360: 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75 72  DOMAIN:....retur
2370: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d  n("GSCIS_TAG_DOM
2380: 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIN");...case GS
2390: 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44  CIS_TAG_PASSWORD
23a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
23b0: 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 22  IS_TAG_PASSWORD"
23c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
23d0: 54 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09 09  TAG_ISSUERID:...
23e0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
23f0: 41 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a 09  AG_ISSUERID");..
2400: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2410: 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e  SERNO:....return
2420: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  ("GSCIS_TAG_SERN
2430: 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  O");...case GSCI
2440: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
2450: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2460: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54  IS_TAG_ISSUE_DAT
2470: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2480: 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54  S_TAG_EXPIRE_DAT
2490: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
24a0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
24b0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
24c0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
24d0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
24e0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
24f0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2500: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
2510: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2520: 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49  GSCIS_TAG_SECURI
2530: 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  TY_CODE");...cas
2540: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
2550: 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75 72  ID_AID:....retur
2560: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
2570: 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61 73  DID_AID");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
2590: 49 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74 75  IFICATE:....retu
25a0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
25b0: 52 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09 63  RTIFICATE");...c
25c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
25d0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09  RT_ISSUE_DATE:..
25e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25f0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
2600: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
2610: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
2620: 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  IRE_DATE:....ret
2630: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2640: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 22  ERT_EXPIRE_DATE"
2650: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22  );..}...return("
2660: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
2670: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2680: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
2690: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
26a0: 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29  TR(LONG retcode)
26b0: 20 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74 63   {..switch (retc
26c0: 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53 43  ode) {...case SC
26d0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09  ARD_S_SUCCESS:..
26e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
26f0: 53 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09 63  S_SUCCESS");...c
2700: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 43  ase SCARD_E_CANC
2710: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
2720: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c  ("SCARD_E_CANCEL
2730: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
2740: 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f  ARD_E_CANT_DISPO
2750: 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  SE:....return("S
2760: 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50  CARD_E_CANT_DISP
2770: 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OSE");...case SC
2780: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
2790: 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72 65  NT_BUFFER:....re
27a0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
27b0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
27c0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
27d0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a  D_E_INVALID_ATR:
27e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
27f0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22  D_E_INVALID_ATR"
2800: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2810: 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  E_INVALID_HANDLE
2820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2830: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
2840: 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  DLE");...case SC
2850: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
2860: 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74 75  RAMETER:....retu
2870: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
2880: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29 3b  LID_PARAMETER");
2890: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
28a0: 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a  INVALID_TARGET:.
28b0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
28c0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
28d0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  T");...case SCAR
28e0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55  D_E_INVALID_VALU
28f0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2900: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41  ARD_E_INVALID_VA
2910: 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LUE");...case SC
2920: 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a  ARD_E_NO_MEMORY:
2930: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2940: 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b  D_E_NO_MEMORY");
2950: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2960: 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a  UNKNOWN_READER:.
2970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2980: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
2990: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
29a0: 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09  D_E_TIMEOUT:....
29b0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
29c0: 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61 73  TIMEOUT");...cas
29d0: 65 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  e SCARD_E_SHARIN
29e0: 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09  G_VIOLATION:....
29f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2a00: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
2a10: 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  N");...case SCAR
2a20: 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44  D_E_NO_SMARTCARD
2a30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2a40: 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52  RD_E_NO_SMARTCAR
2a50: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2a60: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44  D_E_UNKNOWN_CARD
2a70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2a80: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52  RD_E_UNKNOWN_CAR
2a90: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2aa0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
2ab0: 43 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  CH:....return("S
2ac0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
2ad0: 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65 20  MATCH");...case 
2ae0: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44  SCARD_E_NOT_READ
2af0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  Y:....return("SC
2b00: 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22  ARD_E_NOT_READY"
2b10: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2b20: 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c  E_SYSTEM_CANCELL
2b30: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2b40: 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41  CARD_E_SYSTEM_CA
2b50: 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73  NCELLED");...cas
2b60: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52  e SCARD_E_NOT_TR
2b70: 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65 74  ANSACTED:....ret
2b80: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54  urn("SCARD_E_NOT
2b90: 5f 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a 09  _TRANSACTED");..
2ba0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45  .case SCARD_E_RE
2bb0: 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45  ADER_UNAVAILABLE
2bc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2bd0: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56  RD_E_READER_UNAV
2be0: 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  AILABLE");...cas
2bf0: 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50  e SCARD_W_UNSUPP
2c00: 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ORTED_CARD:....r
2c10: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
2c20: 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 22  NSUPPORTED_CARD"
2c30: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2c40: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
2c50: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
2c60: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
2c70: 53 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09 63  SIVE_CARD");...c
2c80: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f  ase SCARD_W_UNPO
2c90: 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  WERED_CARD:....r
2ca0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
2cb0: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29 3b  NPOWERED_CARD");
2cc0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2cd0: 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09 72  RESET_CARD:....r
2ce0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52  eturn("SCARD_W_R
2cf0: 45 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09 63  ESET_CARD");...c
2d00: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f  ase SCARD_W_REMO
2d10: 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  VED_CARD:....ret
2d20: 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 4d  urn("SCARD_W_REM
2d30: 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  OVED_CARD");...c
2d40: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49 5f  ase SCARD_E_PCI_
2d50: 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65  TOO_SMALL:....re
2d60: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 43  turn("SCARD_E_PC
2d70: 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09  I_TOO_SMALL");..
2d80: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45  .case SCARD_E_RE
2d90: 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44  ADER_UNSUPPORTED
2da0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2db0: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55  RD_E_READER_UNSU
2dc0: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73  PPORTED");...cas
2dd0: 65 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43  e SCARD_E_DUPLIC
2de0: 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  ATE_READER:....r
2df0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 44  eturn("SCARD_E_D
2e00: 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 22  UPLICATE_READER"
2e10: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2e20: 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54  E_CARD_UNSUPPORT
2e30: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2e40: 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55  CARD_E_CARD_UNSU
2e50: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73  PPORTED");...cas
2e60: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52  e SCARD_E_NO_SER
2e70: 56 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  VICE:....return(
2e80: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56  "SCARD_E_NO_SERV
2e90: 49 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ICE");...case SC
2ea0: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
2eb0: 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  OPPED:....return
2ec0: 28 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43  ("SCARD_E_SERVIC
2ed0: 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09 63  E_STOPPED");...c
2ee0: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55  ase SCARD_E_UNSU
2ef0: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a  PPORTED_FEATURE:
2f00: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2f10: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
2f20: 46 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64 65  FEATURE");.#ifde
2f30: 66 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  f SCARD_W_INSERT
2f40: 45 44 5f 43 41 52 44 0a 09 09 63 61 73 65 20 53  ED_CARD...case S
2f50: 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f  CARD_W_INSERTED_
2f60: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2f70: 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45  "SCARD_W_INSERTE
2f80: 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e 64 69 66  D_CARD");.#endif
2f90: 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 45 5f  .#ifdef SCARD_E_
2fa0: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
2fb0: 41 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41 52  ABLE...case SCAR
2fc0: 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41  D_E_NO_READERS_A
2fd0: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74  VAILABLE:....ret
2fe0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
2ff0: 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c  READERS_AVAILABL
3000: 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a  E");.#endif..}..
3010: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e  .return("UNKNOWN
3020: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  ");.}..static co
3030: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59  nst char *CACKEY
3040: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
3050: 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f  D_TO_STR(uint16_
3060: 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69 74  t objid) {..swit
3070: 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63  ch (objid) {...c
3080: 61 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09 72  ase 0x2000:....r
3090: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
30a0: 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49  V_OBJID_GENERALI
30b0: 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78  NFO");...case 0x
30c0: 32 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  2100:....return(
30d0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
30e0: 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46  D_PROPERSONALINF
30f0: 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33 30  O");...case 0x30
3100: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3110: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3120: 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b  ACCESSCONTROL");
3130: 0a 09 09 63 61 73 65 20 30 78 34 30 30 30 3a 0a  ...case 0x4000:.
3140: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3150: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49  Y_TLV_OBJID_LOGI
3160: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35 30  N");...case 0x50
3170: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3180: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3190: 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61  CARDINFO");...ca
31a0: 73 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72 65  se 0x6000:....re
31b0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
31c0: 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43  _OBJID_BIOMETRIC
31d0: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37 30  S");...case 0x70
31e0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
31f0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3200: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 22 29  DIGITALSIGCERT")
3210: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 30 3a  ;...case 0x0200:
3220: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3230: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3240: 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73  _PERSON");...cas
3250: 65 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65 74  e 0x0202:....ret
3260: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3270: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49  OBJID_CAC_BENEFI
3280: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  TS");...case 0x0
3290: 32 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  203:....return("
32a0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
32b0: 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 49  _CAC_OTHERBENEFI
32c0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  TS");...case 0x0
32d0: 32 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  201:....return("
32e0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
32f0: 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29  _CAC_PERSONNEL")
3300: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 46 45 3a  ;...case 0x02FE:
3310: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3320: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3330: 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09  _PKICERT");..}..
3340: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
3350: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
3360: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3370: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50  Y_DEBUG_FUNC_APP
3380: 54 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74  TYPE_TO_STR(uint
3390: 38 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a 09  8_t apptype) {..
33a0: 73 77 69 74 63 68 20 28 61 70 70 74 79 70 65 29  switch (apptype)
33b0: 20 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a 0a   {...case 0x00:.
33c0: 09 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22  ...return("NONE"
33d0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a 0a  );...case 0x01:.
33e0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
33f0: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3400: 43 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  C");...case 0x02
3410: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3420: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22  KEY_TLV_APP_SKI"
3430: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a 0a  );...case 0x03:.
3440: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3450: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3460: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
3470: 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_SKI");...case
3480: 20 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72 6e   0x04:....return
3490: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
34a0: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
34b0: 78 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x05:....return("
34c0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
34d0: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
34e0: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
34f0: 09 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09 72  .case 0x06:....r
3500: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3510: 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b  V_APP_SKI | CACK
3520: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
3530: 3b 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a 09  ;...case 0x07:..
3540: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3550: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3560: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
3570: 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54  P_SKI | CACKEY_T
3580: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d  LV_APP_PKI");..}
3590: 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41 4c  ...return("INVAL
35a0: 49 44 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69  ID");.}..#  defi
35b0: 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43  ne malloc(x) CAC
35c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d  KEY_DEBUG_FUNC_M
35d0: 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f  ALLOC(x, __func_
35e0: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20  _, __LINE__).#  
35f0: 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78  define realloc(x
3600: 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42 55  , y) CACKEY_DEBU
3610: 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78  G_FUNC_REALLOC(x
3620: 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f  , y, __func__, _
3630: 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65  _LINE__).#  ifde
3640: 66 20 73 74 72 64 75 70 0a 23 20 20 20 20 75 6e  f strdup.#    un
3650: 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 65 6e  def strdup.#  en
3660: 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73 74  dif.#  define st
3670: 72 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f 44  rdup(x) CACKEY_D
3680: 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50  EBUG_FUNC_STRDUP
3690: 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f  (x, __func__, __
36a0: 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20  LINE__).#else.# 
36b0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
36c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e  EBUG_PRINTF(x...
36d0: 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65  ) /**/.#  define
36e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
36f0: 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20  INTBUF(f, x, y) 
3700: 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43  /**/.#  define C
3710: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52 52  ACKEY_DEBUG_PERR
3720: 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  OR(x) /**/.#  de
3730: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
3740: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
3750: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
3760: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
3770: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3780: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
3790: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
37a0: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
37b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
37c0: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78  C_OBJID_TO_STR(x
37d0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
37e0: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
37f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
3800: 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78 29  PPTYPE_TO_STR(x)
3810: 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44   "DEBUG_DISABLED
3820: 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74  ".#endif..struct
3830: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
3840: 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65  ntity {..unsigne
3850: 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d  d char applet[7]
3860: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65  ;..uint16_t file
3870: 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69  ;...size_t certi
3880: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73  ficate_len;..uns
3890: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
38a0: 69 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65  ificate;...ssize
38b0: 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b 0a 0a  _t keysize;.};..
38c0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
38d0: 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74  entity {..struct
38e0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
38f0: 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
3900: 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49  tity;...CK_ATTRI
3910: 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65 73  BUTE *attributes
3920: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72  ;..CK_ULONG attr
3930: 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b  ibutes_count;.};
3940: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
3950: 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61  session {..int a
3960: 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54  ctive;...CK_SLOT
3970: 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b  _ID slotID;...CK
3980: 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43  _STATE state;..C
3990: 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09  K_FLAGS flags;..
39a0: 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63  CK_ULONG ulDevic
39b0: 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44  eError;..CK_VOID
39c0: 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
39d0: 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f  n;..CK_NOTIFY No
39e0: 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63  tify;...struct c
39f0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
3a00: 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
3a10: 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
3a20: 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69  ities_count;...i
3a30: 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76 65  nt search_active
3a40: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ;..CK_ATTRIBUTE_
3a50: 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72 79  PTR search_query
3a60: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72  ;..CK_ULONG sear
3a70: 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a  ch_query_count;.
3a80: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
3a90: 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a  earch_curr_id;..
3aa0: 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65  .int sign_active
3ab0: 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  ;..CK_MECHANISM_
3ac0: 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e  TYPE sign_mechan
3ad0: 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54  ism;..CK_BYTE_PT
3ae0: 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73  R sign_buf;..uns
3af0: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f  igned long sign_
3b00: 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65  buflen;..unsigne
3b10: 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75  d long sign_bufu
3b20: 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63  sed;..struct cac
3b30: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69  key_identity *si
3b40: 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69  gn_identity;...i
3b50: 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 69 76  nt decrypt_activ
3b60: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  e;..CK_MECHANISM
3b70: 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65  _TYPE decrypt_me
3b80: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49  chanism;..CK_VOI
3b90: 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65  D_PTR decrypt_me
3ba0: 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f  ch_parm;..CK_ULO
3bb0: 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  NG decrypt_mech_
3bc0: 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74  parmlen;..struct
3bd0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
3be0: 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69   *decrypt_identi
3bf0: 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  ty;.};..struct c
3c00: 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e  ackey_slot {..in
3c10: 74 20 61 63 74 69 76 65 3b 0a 0a 09 63 68 61 72  t active;...char
3c20: 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a   *pcsc_reader;..
3c30: 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63  .int pcsc_card_c
3c40: 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44  onnected;..SCARD
3c50: 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64  HANDLE pcsc_card
3c60: 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74  ;...int transact
3c70: 69 6f 6e 5f 64 65 70 74 68 3b 0a 0a 09 69 6e 74  ion_depth;...int
3c80: 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43   slot_reset;...C
3c90: 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c  K_FLAGS token_fl
3ca0: 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20  ags;...unsigned 
3cb0: 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 7d 3b 0a  char *label;.};.
3cc0: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
3cd0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
3ce0: 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a  GENERIC = 0x01,.
3cf0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
3d00: 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a  SKI     = 0x02,.
3d10: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
3d20: 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d  PKI     = 0x04.}
3d30: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74   cackey_tlv_appt
3d40: 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ype;..typedef en
3d50: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
3d60: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e  _OBJID_GENERALIN
3d70: 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30  FO       = 0x200
3d80: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
3d90: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c  BJID_PROPERSONAL
3da0: 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c  INFO   = 0x2100,
3db0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3dc0: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c  ID_ACCESSCONTROL
3dd0: 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09       = 0x3000,..
3de0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3df0: 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20  _LOGIN          
3e00: 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41     = 0x4000,..CA
3e10: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
3e20: 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20  ARDINFO         
3e30: 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b   = 0x5000,..CACK
3e40: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
3e50: 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d  METRICS        =
3e60: 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x6000,..CACKEY
3e70: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54  _TLV_OBJID_DIGIT
3e80: 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30  ALSIGCERT    = 0
3e90: 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x7000,..CACKEY_T
3ea0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3eb0: 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30  SON        = 0x0
3ec0: 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  200,..CACKEY_TLV
3ed0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46  _OBJID_CAC_BENEF
3ee0: 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30  ITS      = 0x020
3ef0: 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  2,..CACKEY_TLV_O
3f00: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45  BJID_CAC_OTHERBE
3f10: 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c  NEFITS = 0x0203,
3f20: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3f30: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c  ID_CAC_PERSONNEL
3f40: 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09       = 0x0201,..
3f50: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3f60: 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20  _CAC_PKICERT    
3f70: 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61     = 0x02FE.} ca
3f80: 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69  ckey_tlv_objecti
3f90: 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  d;..typedef enum
3fa0: 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f   {..CACKEY_PCSC_
3fb0: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20  S_TOKENPRESENT  
3fc0: 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50    = 1,..CACKEY_P
3fd0: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
3fe0: 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b        = 0,..CACK
3ff0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
4000: 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a  C         = -1,.
4010: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  .CACKEY_PCSC_E_B
4020: 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d  ADPIN          =
4030: 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -2,..CACKEY_PCS
4040: 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  C_E_LOCKED      
4050: 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45      = -3,..CACKE
4060: 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
4070: 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09  IN       = -4,..
4080: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
4090: 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20  KENABSENT     = 
40a0: 2d 36 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b  -6.} cackey_ret;
40b0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
40c0: 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75  tlv_cardurl {..u
40d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20  nsigned char    
40e0: 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63      rid[5];..cac
40f0: 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20  key_tlv_apptype 
4100: 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b    apptype;..cack
4110: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20  ey_tlv_objectid 
4120: 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b   objectid;..cack
4130: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20  ey_tlv_objectid 
4140: 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65   appid;..unsigne
4150: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 70 69  d char        pi
4160: 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  nid;.};..struct 
4170: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
4180: 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  y;.struct cackey
4190: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75  _tlv_entity {..u
41a0: 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a  int8_t tag;..siz
41b0: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e  e_t length;...un
41c0: 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61  ion {...void *va
41d0: 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61  lue;...struct ca
41e0: 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c  ckey_tlv_cardurl
41f0: 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b   *value_cardurl;
4200: 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65  ...uint8_t value
4210: 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72  _byte;..};...str
4220: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
4230: 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b  ntity *_next;.};
4240: 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62  ../* CACKEY Glob
4250: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74  al Handles */.st
4260: 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65  atic void *cacke
4270: 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c  y_biglock = NULL
4280: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
4290: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63  cackey_session c
42a0: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31  ackey_sessions[1
42b0: 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75  28];.static stru
42c0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63  ct cackey_slot c
42d0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d  ackey_slots[128]
42e0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
42f0: 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
4300: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
4310: 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
4320: 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e  nit = 0;.CK_C_IN
4330: 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61  ITIALIZE_ARGS ca
4340: 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50  ckey_args;../* P
4350: 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c  CSC Global Handl
4360: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53  es */.static LPS
4370: 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b  CARDCONTEXT cack
4380: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
4390: 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75   NULL;..static u
43a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63  nsigned long cac
43b0: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76  key_getversion(v
43c0: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75  oid) {..static u
43d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74  nsigned long ret
43e0: 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69  val = 255;..unsi
43f0: 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20  gned long major 
4400: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  = 0;..unsigned l
4410: 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09  ong minor = 0;..
4420: 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20  char *major_str 
4430: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d  = NULL;..char *m
4440: 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  inor_str = NULL;
4450: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4460: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
4470: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
4480: 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b  != 255) {...CACK
4490: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
44a0: 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78  "Returning 0x%lx
44b0: 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74   (cached).", ret
44c0: 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  val);....return(
44d0: 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65  retval);..}...re
44e0: 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65  tval = 0;..#ifde
44f0: 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  f PACKAGE_VERSIO
4500: 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f  N.        major_
4510: 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45  str = PACKAGE_VE
4520: 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f  RSION;..if (majo
4530: 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20  r_str) {..      
4540: 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75    major = strtou
4550: 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69  l(major_str, &mi
4560: 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09  nor_str, 10);...
4570: 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20  .if (minor_str) 
4580: 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72  {....minor = str
4590: 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b  toul(minor_str +
45a0: 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09   1, NULL, 10);..
45b0: 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d  .}..}...retval =
45c0: 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c   (major << 16) |
45d0: 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23   (minor << 8);.#
45e0: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
45f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
4600: 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72  urning 0x%lx", r
4610: 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
4620: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20  (retval);.}../* 
4630: 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75  PC/SC Related Fu
4640: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a  nctions */./*. *
4650: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
4660: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
4670: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
4680: 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  l(void);. *. * A
4690: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
46a0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
46b0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
46c0: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
46d0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
46e0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
46f0: 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e   from all cards.
4700: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
4710: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
4720: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
4730: 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f  void) {..uint32_
4740: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
4750: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
4760: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28  lled.");...for (
4770: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
4780: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
4790: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
47a0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
47b0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
47c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
47d0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
47e0: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b  ected) {....CACK
47f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4800: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  "SCardDisconnect
4810: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28  (%lu) called", (
4820: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
4830: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  dx);.....SCardDi
4840: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f  sconnect(cackey_
4850: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
4860: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
4870: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09  E_CARD);...}....
4880: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
4890: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09  [idx].label) {..
48a0: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
48b0: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b  ots[idx].label);
48c0: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
48d0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e  s[idx].label = N
48e0: 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ULL;...}....cack
48f0: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
4900: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
4910: 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  d = 0;...cackey_
4920: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
4930: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
4940: 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  ;....if (cackey_
4950: 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76  slots[idx].activ
4960: 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  e) {....CACKEY_D
4970: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72  EBUG_PRINTF("Mar
4980: 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f 74  king active slot
4990: 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72 65   %lu as being re
49a0: 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  set", (unsigned 
49b0: 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a  long) idx);...}.
49c0: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
49d0: 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20  idx].slot_reset 
49e0: 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  = 1;..}...CACKEY
49f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
4a00: 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65  eturning");...re
4a10: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  turn;.}../*. * S
4a20: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
4a30: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
4a40: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f  _pcsc_connect(vo
4a50: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  id);. *. * ARGUM
4a60: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
4a70: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
4a80: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
4a90: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
4aa0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
4ab0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
4ac0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
4ad0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
4ae0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
4af0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74  function connect
4b00: 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43  s to the PC/SC C
4b10: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65  onnection Manage
4b20: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74 68  r and updates th
4b30: 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20  e. *     global 
4b40: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73  handle.. *. */.s
4b50: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
4b60: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
4b70: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f  nect(void) {..LO
4b80: 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  NG scard_est_con
4b90: 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 66  text_ret;.#ifdef
4ba0: 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c   HAVE_SCARDISVAL
4bb0: 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20  IDCONTEXT..LONG 
4bc0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
4bd0: 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  t;.#endif...CACK
4be0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4bf0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
4c00: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
4c10: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
4c20: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
4c30: 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  ndle = malloc(si
4c40: 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 73  zeof(*cackey_pcs
4c50: 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66  c_handle));...if
4c60: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
4c70: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
4c80: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4c90: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20  PRINTF("Call to 
4ca0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c  malloc() failed,
4cb0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
4cc0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 63  ilure");.....cac
4cd0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
4ce0: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09  nect_all();.....
4cf0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
4d00: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
4d10: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
4d20: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
4d30: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
4d40: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73  () called");...s
4d50: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
4d60: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61  _ret = SCardEsta
4d70: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41  blishContext(SCA
4d80: 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c  RD_SCOPE_SYSTEM,
4d90: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63   NULL, NULL, cac
4da0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
4db0: 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73  ;...if (scard_es
4dc0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d  t_context_ret !=
4dd0: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
4de0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
4df0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
4e00: 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69   to SCardEstabli
4e10: 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64  shContext failed
4e20: 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c   (returned %s/%l
4e30: 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  i), returning in
4e40: 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45   failure", CACKE
4e50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
4e60: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
4e70: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4e80: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
4e90: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4ea0: 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63  t);.....free(cac
4eb0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
4ec0: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
4ed0: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
4ee0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
4ef0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
4f00: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
4f10: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
4f20: 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69  RIC);...}..}..#i
4f30: 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49  fdef HAVE_SCARDI
4f40: 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43  SVALIDCONTEXT..C
4f50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4f60: 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 64  TF("SCardIsValid
4f70: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64  Context() called
4f80: 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c  ");..scard_isval
4f90: 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73  id_ret = SCardIs
4fa0: 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61  ValidContext(*ca
4fb0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4fc0: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73  );..if (scard_is
4fd0: 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41  valid_ret != SCA
4fe0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
4ff0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5000: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61  RINTF("Handle ha
5010: 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64  s become invalid
5020: 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f   (SCardIsValidCo
5030: 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c  ntext = %s/%li),
5040: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73   trying to re-es
5050: 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43  tablish...", CAC
5060: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
5070: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
5080: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
5090: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
50a0: 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09  isvalid_ret);...
50b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
50c0: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62  INTF("SCardEstab
50d0: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61  lishContext() ca
50e0: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f  lled");...scard_
50f0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
5100: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  = SCardEstablish
5110: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43  Context(SCARD_SC
5120: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c  OPE_SYSTEM, NULL
5130: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70  , NULL, cackey_p
5140: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69  csc_handle);...i
5150: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  f (scard_est_con
5160: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
5170: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
5180: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5190: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53  RINTF("Call to S
51a0: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
51b0: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74  text failed (ret
51c0: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72  urned %s/%li), r
51d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
51e0: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ure", CACKEY_DEB
51f0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
5200: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73  _TO_STR(scard_es
5210: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20  t_context_ret), 
5220: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74  (long) scard_est
5230: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
5240: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
5250: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09  csc_handle);....
5260: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5270: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  le = NULL;.....c
5280: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
5290: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
52a0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
52b0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
52c0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
52d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e  EBUG_PRINTF("Han
52e0: 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d  dle has been re-
52f0: 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09  established");..
5300: 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  }.#endif...CACKE
5310: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5320: 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e  Sucessfully conn
5330: 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20  ected to PC/SC, 
5340: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  returning in suc
5350: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e  cess");...return
5360: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
5370: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
5380: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
5390: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
53a0: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76  csc_disconnect(v
53b0: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
53c0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
53d0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
53e0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
53f0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
5400: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
5410: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
5420: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
5430: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
5440: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
5450: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e   function discon
5460: 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50  nects from the P
5470: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
5480: 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61  manager and upda
5490: 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67  tes. *     the g
54a0: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a  lobal handle.. *
54b0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
54c0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
54d0: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f  sc_disconnect(vo
54e0: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72  id) {..LONG scar
54f0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
5500: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
5510: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
5520: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
5530: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d  y_pcsc_handle ==
5540: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
5550: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
5560: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f  OK);..}...scard_
5570: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  rel_context_ret 
5580: 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f  = SCardReleaseCo
5590: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63  ntext(*cackey_pc
55a0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66  sc_handle);...if
55b0: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
55c0: 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63  ndle) {...free(c
55d0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
55e0: 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70  e);.....cackey_p
55f0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
5600: 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  L;..}...if (scar
5610: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
5620: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
5630: 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e  CESS) {...return
5640: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
5650: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65  ENERIC);..}...re
5660: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5670: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
5680: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5690: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
56a0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
56b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
56c0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
56d0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
56e0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
56f0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
5700: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
5710: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
5720: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
5730: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
5740: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
5750: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
5760: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5770: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
5780: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
5790: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
57a0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
57b0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
57c0: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
57d0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
57e0: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
57f0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
5800: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
5810: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
5820: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
5830: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
5840: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
5850: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
5860: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
5870: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
5880: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
5890: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
58a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
58b0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
58c0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
58d0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
58e0: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
58f0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
5900: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
5910: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
5920: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5930: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
5940: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
5950: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
5960: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
5970: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5980: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
5990: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
59a0: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
59b0: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
59c0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
59d0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
59e0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
59f0: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
5a00: 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  d", slot->pcsc_r
5a10: 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f  eader);...scard_
5a20: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
5a30: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
5a40: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
5a50: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
5a60: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
5a70: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
5a80: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
5a90: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
5aa0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
5ab0: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
5ac0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21  scard_conn_ret !
5ad0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
5ae0: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
5af0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
5b00: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20  nection to card 
5b10: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
5b20: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43  g in failure (SC
5b30: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25  ardConnect() = %
5b40: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
5b50: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
5b60: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
5b70: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e  _conn_ret), (lon
5b80: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  g) scard_conn_re
5b90: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
5ba0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5bb0: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c  ERIC);...}....sl
5bc0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
5bd0: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73  nnected = 1;...s
5be0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
5bf0: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a  _depth = 0;..}..
5c00: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5c10: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
5c20: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
5c30: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
5c40: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
5c50: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
5c60: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5c70: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
5c80: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
5c90: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
5ca0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
5cb0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
5cc0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
5cd0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
5ce0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
5cf0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
5d00: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
5d10: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
5d20: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
5d30: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72  ES. *     The tr
5d40: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  ansaction should
5d50: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75   be terminated u
5d60: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64  sing "cackey_end
5d70: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a  _transaction". *
5d80: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
5d90: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
5da0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
5db0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5dc0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
5dd0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
5de0: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73  onn_ret;..LONG s
5df0: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
5e00: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5e10: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
5e20: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ;...cackey_conn_
5e30: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
5e40: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
5e50: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e  ..if (cackey_con
5e60: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
5e70: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
5e80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5e90: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
5ea0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
5eb0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
5ec0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
5ed0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5ee0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
5ef0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
5f00: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth++;...if (slo
5f10: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
5f20: 65 70 74 68 20 3e 20 31 29 20 7b 0a 09 09 43 41  epth > 1) {...CA
5f30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5f40: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20  F("Already in a 
5f50: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72  transaction, per
5f60: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f  forming no actio
5f70: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25  n (new depth = %
5f80: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
5f90: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
5fa0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5fb0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
5fc0: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  .scard_trans_ret
5fd0: 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 61   = SCardBeginTra
5fe0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70  nsaction(slot->p
5ff0: 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28  csc_card);..if (
6000: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
6010: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6020: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
6030: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
6040: 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61  ble to begin tra
6050: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
6060: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
6070: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
6080: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
6090: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
60a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
60b0: 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72  ssfully began tr
60c0: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f  ansaction on slo
60d0: 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70  t (%s)", slot->p
60e0: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72  csc_reader);...r
60f0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6100: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
6110: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6120: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
6130: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
6140: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
6150: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
6160: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
6170: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
6180: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
6190: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
61a0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
61b0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
61c0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
61d0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
61e0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
61f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
6200: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
6210: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
6220: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
6230: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 61  ion requires "ca
6240: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
6250: 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61  action" to be ca
6260: 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a  lled first. *. *
6270: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
6280: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
6290: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
62a0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
62b0: 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  lot) {..LONG sca
62c0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
62d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
62e0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
62f0: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
6300: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6310: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
6320: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
6330: 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64  is not connected
6340: 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  , unable to end 
6350: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a  transaction");..
6360: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6370: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6380: 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
6390: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
63a0: 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  h == 0) {...CACK
63b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
63c0: 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74  "Terminating a t
63d0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
63e0: 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29  has not begun!")
63f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6400: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6410: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
6420: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
6430: 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  --;...if (slot->
6440: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
6450: 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45  h > 0) {...CACKE
6460: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6470: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
6480: 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  ll in progress, 
6490: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  not terminating 
64a0: 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74  on-card Transact
64b0: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
64c0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
64d0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
64e0: 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  th);....return(C
64f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6500: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  ERIC);..}...scar
6510: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
6520: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  ardEndTransactio
6530: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
6540: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
6550: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ARD);..if (scard
6560: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
6570: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
6580: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6590: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
65a0: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
65b0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
65c0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
65d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
65e0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
65f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6600: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
6610: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e   terminated tran
6620: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
6630: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
6640: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
6650: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6660: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44  S_OK);.}../* APD
6670: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  U Related Functi
6680: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
6690: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
66a0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
66b0: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
66c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
66d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
66e0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
66f0: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
6700: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
6710: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
6720: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
6730: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
6740: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
6750: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
6760: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
6770: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
6780: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
6790: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
67a0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
67b0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
67c0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
67d0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
67e0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
67f0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
6800: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20  ned char class. 
6810: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43  *         APDU C
6820: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53  lass (GSCIS_CLAS
6830: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43  S_ISO7816 or GSC
6840: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
6850: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20  PLATFORM. *     
6860: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43      usually), (C
6870: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  LA). *. *     un
6880: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
6890: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20  ruction. *      
68a0: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74     APDU Instruct
68b0: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20  ion (INS). *. * 
68c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
68d0: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20  r p1. *         
68e0: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31  APDU Parameter 1
68f0: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P1). *. *     
6900: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
6910: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
6920: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32   Parameter 2 (P2
6930: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
6940: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20  gned char lc. * 
6950: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
6960: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28  gth of Content (
6970: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Lc) -- this is t
6980: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61  he length of "da
6990: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70  ta". *         p
69a0: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64  arameter.  If "d
69b0: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65  ata" is specifie
69c0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
69d0: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20  parameter will. 
69e0: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e  *         be ign
69f0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
6a00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
6a10: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50  ata. *         P
6a20: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
6a30: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68   to send.  It sh
6a40: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74  ould be "Lc" byt
6a50: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20  es long.  If. * 
6a60: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
6a70: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20  d as NULL, "Lc" 
6a80: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74  will not be sent
6a90: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65  , and this buffe
6aa0: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20  r will be. *    
6ab0: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a       ignored.. *
6ac0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6ad0: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20   char le. *     
6ae0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
6af0: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28  of Expectation (
6b00: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Le) -- this is t
6b10: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6b20: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65  . *         expe
6b30: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20  cted reply.  If 
6b40: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
6b50: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77  d as 0 then it w
6b60: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20  ill not. *      
6b70: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20     be sent.. *. 
6b80: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a  *     uint16_t *
6b90: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20  respcode. *     
6ba0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
6bb0: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
6bc0: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f  APDU response co
6bd0: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  de.  If this is.
6be0: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
6bf0: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
6c00: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20  e response code 
6c10: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
6c20: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
6c30: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
6c40: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
6c50: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
6c60: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
6c70: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20   response data. 
6c80: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
6c90: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
6ca0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
6cb0: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c  sponse data will
6cc0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
6cd0: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  If. *         th
6ce0: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22  e "respdata_len"
6cf0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70   parameter is sp
6d00: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
6d10: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20   this buffer. * 
6d20: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74          will not
6d30: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a   be updated.. *.
6d40: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72   *     size_t *r
6d50: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20  espdata_len. *  
6d60: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d         [IN, OUT]
6d70: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c   Pointer initial
6d80: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
6d90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
6da0: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20  respdata". *    
6db0: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65       buffer.  Be
6dc0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
6dd0: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76  the pointed to v
6de0: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20  alue is updated 
6df0: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  to the. *       
6e00: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
6e10: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
6e20: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69   buffer.  If thi
6e30: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
6e40: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c  s. *         NUL
6e50: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  L, it will not b
6e60: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22  e updated, and "
6e70: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62  respdata" will b
6e80: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e  e ignored causin
6e90: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  g. *         the
6ea0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74   response data t
6eb0: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  o be discarded..
6ec0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
6ed0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
6ee0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
6ef0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
6f00: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6f10: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
6f20: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20    On error. *   
6f30: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6f40: 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20  TOKENABSENT  If 
6f50: 74 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c  the sending fail
6f60: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20 74  ed because the t
6f70: 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20  oken is. *      
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 20 20 20 20 20 20 20 20 20 20 61 62 73 65 6e 74            absent
6fa0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
6fb0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
6fc0: 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  n will connect t
6fd0: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  o the PC/SC Conn
6fe0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76  ection Manager v
6ff0: 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  ia. *     cackey
7000: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20  _pcsc_connect() 
7010: 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a  if needed.. *. *
7020: 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e       It will con
7030: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64  nect to the card
7040: 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 20 61   in the reader a
7050: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73  ttached to the s
7060: 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69  lot. *     speci
7070: 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72  fied.  It will r
7080: 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20  econnect to the 
7090: 63 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e  card if the conn
70a0: 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f  ection. *     go
70b0: 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a  es away.. *. */.
70c0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
70d0: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
70e0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
70f0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
7100: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
7110: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
7120: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
7130: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
7140: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
7150: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
7160: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
7170: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
7180: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
7190: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
71a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
71b0: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
71c0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
71d0: 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63  uint8_t major_rc
71e0: 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a  , minor_rc;..siz
71f0: 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  e_t bytes_to_cop
7200: 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  y, tmp_respdata_
7210: 6c 65 6e 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74  len;..DWORD prot
7220: 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69  ocol;..DWORD xmi
7230: 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b  t_len, recv_len;
7240: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69  ..LONG scard_xmi
7250: 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63  t_ret, scard_rec
7260: 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78  onn_ret;..BYTE x
7270: 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72  mit_buf[1024], r
7280: 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09  ecv_buf[1024];..
7290: 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  int pcsc_connect
72a0: 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65  _ret, pcsc_getre
72b0: 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78  sp_ret;..int idx
72c0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
72d0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
72e0: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29  ");...if (!slot)
72f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7300: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
7310: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64  d slot specified
7320: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
7330: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7340: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  ERIC);..}...pcsc
7350: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
7360: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
7370: 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70  rd(slot);..if (p
7380: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
7390: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
73a0: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
73b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
73c0: 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20  able to connect 
73d0: 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
73e0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
73f0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7400: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7410: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73  );..}.../* Trans
7420: 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e  mit */..xmit_len
7430: 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b   = 0;..xmit_buf[
7440: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c  xmit_len++] = cl
7450: 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ass;..xmit_buf[x
7460: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73  mit_len++] = ins
7470: 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f  truction;..xmit_
7480: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
7490: 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  = p1;..xmit_buf[
74a0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32  xmit_len++] = p2
74b0: 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09  ;..if (data) {..
74c0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
74d0: 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f  en++] = lc;...fo
74e0: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
74f0: 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  < lc; idx++) {..
7500: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
7510: 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64  len++] = data[id
7520: 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  x];...}..}...if 
7530: 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09  (le != 0x00) {..
7540: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
7550: 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a  en++] = le;..}..
7560: 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63  ./* Begin Smartc
7570: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7580: 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  */..cackey_begin
7590: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
75a0: 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20  t);...if (class 
75b0: 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  == GSCIS_CLASS_I
75c0: 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75  SO7816 && instru
75d0: 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49  ction == GSCIS_I
75e0: 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70  NSTR_VERIFY && p
75f0: 31 20 3d 3d 20 30 78 30 30 20 26 26 20 70 32 20  1 == 0x00 && p2 
7600: 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43  == 0x00) {...CAC
7610: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7620: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20  ("Sending APDU: 
7630: 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a  <<censored>>");.
7640: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
7650: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
7660: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a  F("Sending APDU:
7670: 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  ", xmit_buf, xmi
7680: 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63  t_len);..}...rec
7690: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72  v_len = sizeof(r
76a0: 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64  ecv_buf);..scard
76b0: 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72  _xmit_ret = SCar
76c0: 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e  dTransmit(slot->
76d0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
76e0: 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74 5f 62 75  _PCI_T0, xmit_bu
76f0: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c  f, xmit_len, NUL
7700: 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  L, recv_buf, &re
7710: 63 76 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 63  cv_len);..if (sc
7720: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20  ard_xmit_ret != 
7730: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
7740: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7750: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
7760: 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f   to send APDU to
7770: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
7780: 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29  smit() = %s/%lx)
7790: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
77a0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
77b0: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f  _STR(scard_xmit_
77c0: 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ret), (unsigned 
77d0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
77e0: 5f 72 65 74 29 3b 0a 09 09 43 41 43 4b 45 59 5f  _ret);...CACKEY_
77f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
7800: 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61  rking slot as ha
7810: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22  ving been reset"
7820: 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  );....slot->tran
7830: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
7840: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f  0;...slot->slot_
7850: 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 69 66  reset = 1;....if
7860: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
7870: 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45   == SCARD_W_RESE
7880: 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  T_CARD) {....CAC
7890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
78a0: 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64  ("Reset required
78b0: 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e  , please hold...
78c0: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65  ");.....scard_re
78d0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
78e0: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
78f0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
7900: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
7910: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
7920: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
7930: 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T1, SCARD_RESE
7940: 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f 63 6f  T_CARD, &protoco
7950: 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64  l);....if (scard
7960: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
7970: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
7980: 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61  {...../* Re-esta
7990: 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f  blish transactio
79a0: 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65  n, if it was pre
79b0: 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28  sent */.....if (
79c0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
79d0: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
79e0: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
79f0: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09  ction_depth--;..
7a00: 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
7a10: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
7a20: 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
7a30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7a40: 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
7a50: 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74  sful, retransmit
7a60: 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65 63  ting");......rec
7a70: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72  v_len = sizeof(r
7a80: 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73 63  ecv_buf);.....sc
7a90: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
7aa0: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
7ab0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7ac0: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74  ARD_PCI_T0, xmit
7ad0: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
7ae0: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20  NULL, recv_buf, 
7af0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
7b00: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
7b10: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
7b20: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
7b30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7b40: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
7b50: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
7b60: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
7b70: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
7b80: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
7b90: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
7ba0: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
7bb0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
7bc0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
7bd0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
7be0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
7bf0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
7c00: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7c10: 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45  card, SCARD_RESE
7c20: 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  T_CARD);......sl
7c30: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7c40: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
7c50: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7c60: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7c70: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  */......slot->tr
7c80: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
7c90: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
7ca0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
7cb0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65  (slot);.......re
7cc0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7cd0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
7ce0: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
7cf0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
7d00: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
7d10: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
7d20: 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63  ;......SCardDisc
7d30: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
7d40: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45  c_card, SCARD_RE
7d50: 53 45 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 73  SET_CARD);.....s
7d60: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
7d70: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
7d80: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7d90: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7da0: 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  */.....slot->tra
7db0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
7dc0: 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65   1;.....cackey_e
7dd0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
7de0: 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lot);......CACKE
7df0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7e00: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
7e10: 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75  lure");.....retu
7e20: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
7e30: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
7e40: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
7e50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7e60: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
7e70: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
7e80: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
7e90: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7ea0: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
7eb0: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63  RD);....slot->pc
7ec0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
7ed0: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e  d = 0;...../* En
7ee0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
7ef0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c  saction */....sl
7f00: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
7f10: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61  depth = 1;....ca
7f20: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
7f30: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
7f40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7f50: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
7f60: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
7f70: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7f80: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
7f90: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  );...}..}...CACK
7fa0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
7fb0: 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75  F("Returned Valu
7fc0: 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72  e:", recv_buf, r
7fd0: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  ecv_len);...if (
7fe0: 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a  recv_len < 2) {.
7ff0: 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73  ../* Minimal res
8000: 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20  ponse length is 
8010: 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69  2 bytes, returni
8020: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ng in failure */
8030: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8040: 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
8050: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
8060: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
8070: 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75   (recv_len = %lu
8080: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
8090: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  ng) recv_len);..
80a0: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
80b0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
80c0: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
80d0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
80e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
80f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8100: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  C);..}.../* Dete
8110: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64  rmine result cod
8120: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d  e */..major_rc =
8130: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
8140: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f  en - 2];..minor_
8150: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
8160: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66  cv_len - 1];..if
8170: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09   (respcode) {...
8180: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a  *respcode = (maj
8190: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69  or_rc << 8) | mi
81a0: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20  nor_rc;..}.../* 
81b0: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62  Adjust message b
81c0: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c  uffer */..recv_l
81d0: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64  en -= 2;.../* Ad
81e0: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72  d bytes to retur
81f0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f  n value */..tmp_
8200: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30  respdata_len = 0
8210: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20  ;..if (respdata 
8220: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  && respdata_len)
8230: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74   {...tmp_respdat
8240: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74  a_len = *respdat
8250: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f  a_len;....bytes_
8260: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64  to_copy = *respd
8270: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28  ata_len;....if (
8280: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73  recv_len < bytes
8290: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62  _to_copy) {....b
82a0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72  ytes_to_copy = r
82b0: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ecv_len;...}....
82c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
82d0: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75  NTF("Copying %lu
82e0: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75   bytes to the bu
82f0: 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75  ffer (recv'd %lu
8300: 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79   bytes, but only
8310: 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20   %lu bytes left 
8320: 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c  in our buffer)",
8330: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
8340: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20   bytes_to_copy, 
8350: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
8360: 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67  recv_len, (unsig
8370: 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64  ned long) *respd
8380: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d  ata_len);....mem
8390: 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65  cpy(respdata, re
83a0: 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f  cv_buf, bytes_to
83b0: 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61  _copy);...respda
83c0: 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63  ta += bytes_to_c
83d0: 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74  opy;....*respdat
83e0: 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f  a_len = bytes_to
83f0: 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73  _copy;...tmp_res
8400: 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74  pdata_len -= byt
8410: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65  es_to_copy;..} e
8420: 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76  lse {...if (recv
8430: 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
8440: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8450: 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77  NTF("Throwing aw
8460: 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f  ay %lu bytes, no
8470: 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65  where to put the
8480: 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  m!", (unsigned l
8490: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
84a0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a  ..}..}...if (maj
84b0: 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b  or_rc == 0x61) {
84c0: 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f  .../* We need to
84d0: 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45   READ */...CACKE
84e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
84f0: 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75  Buffer read requ
8500: 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d  ired");....if (m
8510: 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29  inor_rc == 0x00)
8520: 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d   {....minor_rc =
8530: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
8540: 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65  ;...}....pcsc_ge
8550: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b  tresp_ret = cack
8560: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
8570: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
8580: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
8590: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45  STR_GET_RESPONSE
85a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c  , 0x00, 0x00, 0,
85b0: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c   NULL, minor_rc,
85c0: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64   respcode, respd
85d0: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61  ata, &tmp_respda
85e0: 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70  ta_len);...if (p
85f0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
8600: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
8610: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
8620: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
8630: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65  uffer read faile
8640: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  d!  Returning in
8650: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
8660: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
8670: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
8680: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
8690: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
86a0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
86b0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
86c0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72  C);...}....if (r
86d0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
86e0: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
86f0: 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  += tmp_respdata_
8700: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45  len;...}..../* E
8710: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
8720: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
8730: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
8740: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43  tion(slot);....C
8750: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8760: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8770: 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72   success (buffer
8780: 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22   read complete)"
8790: 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
87a0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
87b0: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  }.../* End Smart
87c0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
87d0: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
87e0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
87f0: 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72  );...if (major_r
8800: 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f  c == 0x90) {.../
8810: 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43  * Success */...C
8820: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8830: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8840: 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f   success (major_
8850: 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09  rc = 0x90)");...
8860: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8870: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a  CSC_S_OK);..}...
8880: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8890: 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72  INTF("APDU Retur
88a0: 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65  ned an error, re
88b0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
88c0: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  re");...return(C
88d0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
88e0: 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ERIC);.}../*. * 
88f0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8900: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72  ssize_t cackey_r
8910: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63  ead_buffer(struc
8920: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8930: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
8940: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
8950: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e  _t count, unsign
8960: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20  ed char t_or_v, 
8970: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
8980: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  ffset);. *. * AR
8990: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
89a0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
89b0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
89c0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
89d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
89e0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
89f0: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20  har *buffer. *  
8a00: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66         [OUT] Buf
8a10: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  fer. *. *     si
8a20: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20  ze_t count. *   
8a30: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
8a40: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74  bytes to attempt
8a50: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20   to read. *. *  
8a60: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8a70: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20   t_or_v. *      
8a80: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d     Select the T-
8a90: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56  buffer (01) or V
8aa0: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20  -buffer (02) to 
8ab0: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a  read from.  . *.
8ac0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e   *     size_t in
8ad0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20  itial_offset. * 
8ae0: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20          Specify 
8af0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  the offset to be
8b00: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f  gin the read fro
8b10: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  m. *. *. * RETUR
8b20: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
8b30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
8b40: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
8b50: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
8b60: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
8b70: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
8b80: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
8b90: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
8ba0: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61  ize_t cackey_rea
8bb0: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20  d_buffer(struct 
8bc0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8bd0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
8be0: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
8bf0: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
8c00: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69   char t_or_v, si
8c10: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
8c20: 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f  set) {..size_t o
8c30: 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f  ffset = 0, max_o
8c40: 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74  ffset, max_count
8c50: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
8c60: 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36   cmd[2];..uint16
8c70: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e  _t respcode;..in
8c80: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
8c90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8ca0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
8cb0: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
8cc0: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
8cd0: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
8ce0: 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21  ;...if (t_or_v !
8cf0: 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d  = 1 && t_or_v !=
8d00: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
8d10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
8d20: 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61  alid T or V para
8d30: 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c  meter specified,
8d40: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
8d50: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
8d60: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64  rn(-1);..}...cmd
8d70: 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09  [0] = t_or_v;...
8d80: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66  while (1) {...if
8d90: 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f   (offset >= max_
8da0: 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43  offset) {....CAC
8db0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8dc0: 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61  ("Buffer too sma
8dd0: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68  ll, returning wh
8de0: 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a  at we got...");.
8df0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
8e00: 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66  ..count = max_of
8e10: 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09  fset - offset;..
8e20: 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78  .if (count > max
8e30: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75  _count) {....cou
8e40: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  nt = max_count;.
8e50: 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20  ..}....cmd[1] = 
8e60: 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72  count;....send_r
8e70: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
8e80: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
8e90: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
8ea0: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
8eb0: 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52  NSTR_READ_BUFFER
8ec0: 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  , ((initial_offs
8ed0: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20  et + offset) >> 
8ee0: 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74  8) & 0xff, (init
8ef0: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
8f00: 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a  set) & 0xff, siz
8f10: 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30  eof(cmd), cmd, 0
8f20: 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  x00, &respcode, 
8f30: 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c  buffer + offset,
8f40: 20 26 63 6f 75 6e 74 29 3b 0a 09 09 69 66 20 28   &count);...if (
8f50: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
8f60: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
8f70: 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
8f80: 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09  == 0x6A86) {....
8f90: 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d  .if (max_count =
8fa0: 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 1) {......brea
8fb0: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61  k;.....}......ma
8fc0: 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f  x_count = max_co
8fd0: 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f  unt / 2;......co
8fe0: 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
8ff0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9000: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e  INTF("cackey_sen
9010: 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c  d_apdu() failed,
9020: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
9030: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74  ilure");.....ret
9040: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
9050: 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b  offset += count;
9060: 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  ....if (count < 
9070: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
9080: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9090: 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20  NTF("Short read 
90a0: 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63  -- count = %i, c
90b0: 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e  md[1] = %i", (in
90c0: 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  t) count, (int) 
90d0: 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65  cmd[1]);.....bre
90e0: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  ak;...}..}..#ifd
90f0: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
9100: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
9110: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
9120: 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49   (offset > _POSI
9130: 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
9140: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9150: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63  INTF("Offset exc
9160: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
9170: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
9180: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
9190: 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25   %li, offset = %
91a0: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
91b0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
91c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
91d0: 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  ffset);....retur
91e0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
91f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  if.#endif...CACK
9200: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9210: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
9220: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
9230: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
9240: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
9250: 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74  ...return(offset
9260: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
9270: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
9280: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
9290: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
92a0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
92b0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
92c0: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
92d0: 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a   aid_len);. *. *
92e0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
92f0: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
9300: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
9310: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
9320: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
9330: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9340: 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20  d char *aid. *  
9350: 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f         Buffer co
9360: 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20  ntaining Applet 
9370: 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a  ID to select. *.
9380: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69   *     size_t ai
9390: 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  d_len. *        
93a0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
93b0: 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41   in the "aid" (A
93c0: 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65  pplet ID) parame
93d0: 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ter. *. * RETURN
93e0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
93f0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
9400: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
9410: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
9420: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
9430: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
9440: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
9450: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
9460: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
9470: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
9480: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
9490: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
94a0: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73  ned char *aid, s
94b0: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b  ize_t aid_len) {
94c0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
94d0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
94e0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
94f0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
9500: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63  _PRINTBUF("Selec
9510: 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61  ting applet:", a
9520: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09  id, aid_len);...
9530: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
9540: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
9550: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
9560: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
9570: 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53  TR_SELECT, GSCIS
9580: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
9590: 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f  PLET, 0x00, aid_
95a0: 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20  len, aid, 0x00, 
95b0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
95c0: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
95d0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
95e0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
95f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
9600: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70  ailed to open ap
9610: 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  plet, returning 
9620: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
9630: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9640: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
9650: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
9660: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
9670: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20  sfully selected 
9680: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  file");...return
9690: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
96a0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
96b0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
96c0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
96d0: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63  elect_file(struc
96e0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
96f0: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66  lot, uint16_t ef
9700: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
9710: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
9720: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9730: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
9740: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
9750: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
9760: 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20   uint16_t ef. * 
9770: 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61          Elementa
9780: 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74  l File to select
9790: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
97a0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
97b0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
97c0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
97d0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
97e0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
97f0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
9800: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
9810: 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65  selects an Eleme
9820: 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20  ntary File (EF) 
9830: 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e  under the curren
9840: 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20  tly selected. * 
9850: 20 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69      Dedicated Fi
9860: 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20  le (DF). *. *   
9870: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73    Typically this
9880: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
9890: 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63   selecting the c
98a0: 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75  orrect Applet (u
98b0: 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b  sing. *     cack
98c0: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
98d0: 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20  ) for VM cards. 
98e0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
98f0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
9900: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63  elect_file(struc
9910: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
9920: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66  lot, uint16_t ef
9930: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
9940: 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09  ar fid_buf[2];..
9950: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
9960: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9970: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
9980: 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c  ../* Open the el
9990: 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f  ementary file */
99a0: 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28  ..fid_buf[0] = (
99b0: 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  ef >> 8) & 0xff;
99c0: 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65  ..fid_buf[1] = e
99d0: 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  f & 0xff;...CACK
99e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
99f0: 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a  "Selecting file:
9a00: 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e   %04lx", (unsign
9a10: 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09  ed long) ef);...
9a20: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
9a30: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
9a40: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
9a50: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
9a60: 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c  TR_SELECT, 0x02,
9a70: 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69   0x0C, sizeof(fi
9a80: 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c  d_buf), fid_buf,
9a90: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
9aa0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
9ab0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
9ac0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
9ad0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9ae0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
9af0: 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72  open file, retur
9b00: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
9b10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9b20: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9b30: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
9b40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
9b50: 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65  uccessfully sele
9b60: 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72  cted file");...r
9b70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9b80: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
9b90: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
9ba0: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72    void cackey_fr
9bb0: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
9bc0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
9bd0: 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *root);. *. * AR
9be0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
9bf0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
9c00: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a  _entity *root. *
9c10: 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66           Root of
9c20: 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f   the TLV list to
9c30: 20 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20   start freeing. 
9c40: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
9c50: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
9c60: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
9c70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
9c80: 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e  rees the TLV lin
9c90: 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72  ked listed retur
9ca0: 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20  ned from. *     
9cb0: 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76  "cackey_read_tlv
9cc0: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ". *. */.static 
9cd0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
9ce0: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
9cf0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72  ey_tlv_entity *r
9d00: 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  oot) {..struct c
9d10: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
9d20: 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a   *curr, *next;..
9d30: 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c  .if (root == NUL
9d40: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
9d50: 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20  }...for (curr = 
9d60: 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72  root; curr; curr
9d70: 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78   = next) {...nex
9d80: 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b  t = curr->_next;
9d90: 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72  ....switch (curr
9da0: 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65  ->tag) {....case
9db0: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
9dc0: 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53  ABLE:....case GS
9dd0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
9de0: 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72  ATE:.....if (cur
9df0: 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09  r->value) {.....
9e00: 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75  .free(curr->valu
9e10: 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  e);.....}.....br
9e20: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
9e30: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a  IS_TAG_CARDURL:.
9e40: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
9e50: 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09  lue_cardurl) {..
9e60: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
9e70: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09  alue_cardurl);..
9e80: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
9e90: 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72  ..}....free(curr
9ea0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
9eb0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
9ec0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
9ed0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
9ee0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
9ef0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
9f00: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
9f10: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
9f20: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
9f30: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
9f40: 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
9f50: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
9f60: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
9f70: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
9f80: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72  tlv_entity *curr
9f90: 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d  _entity, *root =
9fa0: 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e   NULL, *last = N
9fb0: 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ULL;..unsigned c
9fc0: 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c  har tlen_buf[2],
9fd0: 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c   tval_buf[1024],
9fe0: 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65   *tval;..unsigne
9ff0: 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b  d char vlen_buf[
a000: 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39  2], vval_buf[819
a010: 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69  2], *vval;..unsi
a020: 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75  gned char *tmpbu
a030: 66 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e  f;..ssize_t tlen
a040: 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74  , vlen;..ssize_t
a050: 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65   read_ret;..size
a060: 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c  _t offset_t = 0,
a070: 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09   offset_v = 0;..
a080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
a090: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74  g;..size_t lengt
a0a0: 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c  h;.#ifdef HAVE_L
a0b0: 49 42 5a 0a 09 75 4c 6f 6e 67 66 20 74 6d 70 62  IBZ..uLongf tmpb
a0c0: 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 75 6e 63 6f  uflen;..int unco
a0d0: 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64  mpress_ret;.#end
a0e0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
a0f0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
a100: 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20  .");...read_ret 
a110: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  = cackey_read_bu
a120: 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f  ffer(slot, tlen_
a130: 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e  buf, sizeof(tlen
a140: 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74  _buf), 1, offset
a150: 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72  _t);..if (read_r
a160: 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65  et != sizeof(tle
a170: 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  n_buf)) {...CACK
a180: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a190: 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65  "Read failed, re
a1a0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
a1b0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
a1c0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e  NULL);..}...tlen
a1d0: 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20   = (tlen_buf[1] 
a1e0: 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66  << 8) | tlen_buf
a1f0: 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20  [0];...read_ret 
a200: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  = cackey_read_bu
a210: 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f  ffer(slot, vlen_
a220: 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e  buf, sizeof(vlen
a230: 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74  _buf), 2, offset
a240: 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72  _v);..if (read_r
a250: 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65  et != sizeof(vle
a260: 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  n_buf)) {...CACK
a270: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a280: 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65  "Read failed, re
a290: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
a2a0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
a2b0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e  NULL);..}...vlen
a2c0: 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20   = (vlen_buf[1] 
a2d0: 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66  << 8) | vlen_buf
a2e0: 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  [0];...CACKEY_DE
a2f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20  BUG_PRINTF("Tag 
a300: 4c 65 6e 67 74 68 20 3d 20 25 69 2c 20 56 61 6c  Length = %i, Val
a310: 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 69 22 2c  ue Length = %i",
a320: 20 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09   tlen, vlen);...
a330: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09  offset_t += 2;..
a340: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a  offset_v += 2;..
a350: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65  .if (tlen > size
a360: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(tval_buf)) {.
a370: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a380: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74  RINTF("Tag lengt
a390: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
a3a0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
a3b0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
a3c0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
a3d0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (vlen > sizeof(
a3e0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  vval_buf)) {...C
a3f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a400: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68  TF("Value length
a410: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
a420: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
a430: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
a440: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
a450: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
a460: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
a470: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c   tval_buf, tlen,
a480: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
a490: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
a4a0: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  tlen) {...CACKEY
a4b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
a4c0: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
a4d0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72  tire T-buffer, r
a4e0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
a4f0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
a500: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
a510: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
a520: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
a530: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c   vval_buf, vlen,
a540: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
a550: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
a560: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  vlen) {...CACKEY
a570: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
a580: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
a590: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72  tire V-buffer, r
a5a0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
a5b0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
a5c0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61  (NULL);..}...tva
a5d0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76  l = tval_buf;..v
a5e0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a  val = vval_buf;.
a5f0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30  .while (tlen > 0
a600: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a   && vlen > 0) {.
a610: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09  ..tag = *tval;..
a620: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d  .tval++;...tlen-
a630: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20  -;....if (*tval 
a640: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65  == 0xff) {....le
a650: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20  ngth = (tval[2] 
a660: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b  << 8) | tval[1];
a670: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09  ....tval += 3;..
a680: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d  ..tlen -= 3;...}
a690: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74   else {....lengt
a6a0: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76  h = *tval;....tv
a6b0: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b  al++;....tlen--;
a6c0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
a6d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
a6e0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41  : %s (%02x)", CA
a6f0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
a700: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c  TAG_TO_STR(tag),
a710: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
a720: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44  tag);...CACKEY_D
a730: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56  EBUG_PRINTBUF("V
a740: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65  alue:", vval, le
a750: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65  ngth);....curr_e
a760: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
a770: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09  switch (tag) {..
a780: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
a790: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75  _CARDURL:.....cu
a7a0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
a7b0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
a7c0: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75  entity));.....cu
a7d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
a7e0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f  _cardurl = mallo
a7f0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
a800: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
a810: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d  durl));......mem
a820: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d  cpy(curr_entity-
a830: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
a840: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09  rid, vval, 5);..
a850: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a860: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
a870: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d  pptype = vval[5]
a880: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
a890: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
a8a0: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76  ->objectid = (vv
a8b0: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[6] << 8) | vv
a8c0: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[7];.....curr_
a8d0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
a8e0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28  rdurl->appid = (
a8f0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20  vval[8] << 8) | 
a900: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75  vval[9];......cu
a910: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
a920: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
a930: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
a940: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
a950: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
a960: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
a970: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
a980: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
a990: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
a9a0: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
a9b0: 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  c(length);......
a9c0: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
a9d0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09  val, length);...
a9e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a9f0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
aa00: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
aa10: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  th = length;....
aa20: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
aa30: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
aa40: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
aa50: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
aa60: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
aa70: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
aa80: 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72  FICATE:.....curr
aa90: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
aaa0: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
aab0: 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 74 6d 70  tity));......tmp
aac0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20  buflen = length 
aad0: 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20  * 2;.....tmpbuf 
aae0: 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c  = malloc(tmpbufl
aaf0: 65 6e 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56  en);..#ifdef HAV
ab00: 45 5f 4c 49 42 5a 0a 09 09 09 09 75 6e 63 6f 6d  E_LIBZ.....uncom
ab10: 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f  press_ret = unco
ab20: 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26  mpress(tmpbuf, &
ab30: 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c  tmpbuflen, vval,
ab40: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66   length);.....if
ab50: 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
ab60: 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09   != Z_OK) {.....
ab70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ab80: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
ab90: 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f  decompress, unco
aba0: 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65  mpress() returne
abb0: 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e  d %i -- resortin
abc0: 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79  g to direct copy
abd0: 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ", uncompress_re
abe0: 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66  t);.......tmpbuf
abf0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
ac00: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
ac10: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
ac20: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
ac30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
ac40: 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20  F("Decompressed 
ac50: 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  to:", tmpbuf, tm
ac60: 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a  pbuflen);.#else.
ac70: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ac80: 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67  _PRINTF("Missing
ac90: 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74   ZLIB Support, t
aca0: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
acb0: 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73  is likely useles
acc0: 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70  s...");......tmp
acd0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
ace0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
acf0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
ad00: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63  );.#endif......c
ad10: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
ad20: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
ad30: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
ad40: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09   tmpbuflen;.....
ad50: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
ad60: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ue = tmpbuf;....
ad70: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
ad80: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
ad90: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
ada0: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
adb0: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
adc0: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
add0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
ade0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
adf0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
ae00: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
ae10: 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61  value_byte = vva
ae20: 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[0];.....curr_e
ae30: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
ae40: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
ae50: 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20  ...}....vval += 
ae60: 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d  length;...vlen -
ae70: 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20  = length;....if 
ae80: 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20  (curr_entity != 
ae90: 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72  NULL) {....if (r
aea0: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
aeb0: 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65  ...root = curr_e
aec0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
aed0: 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c  if (last != NULL
aee0: 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e  ) {.....last->_n
aef0: 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ext = curr_entit
af00: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74  y;....}.....last
af10: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
af20: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
af30: 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  root);.}../*. * 
af40: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
af50: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
af60: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
af70: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
af80: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
af90: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
afa0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
afb0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
afc0: 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  ee_certs(struct 
afd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
afe0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
aff0: 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66  e_t count, int f
b000: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69  ree_start) {..si
b010: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 66 6f 72 20  ze_t idx;...for 
b020: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
b030: 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  count; idx++) {.
b040: 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d  ..if (start[idx]
b050: 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a  .certificate) {.
b060: 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64  ...free(start[id
b070: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b  x].certificate);
b080: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72  ...}..}...if (fr
b090: 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72  ee_start) {...fr
b0a0: 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09  ee(start);..}...
b0b0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
b0c0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
b0d0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
b0e0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
b0f0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
b100: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
b110: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
b120: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
b130: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
b140: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
b150: 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
b160: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
b170: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75  slot *slot, stru
b180: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
b190: 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20  dentity *certs, 
b1a0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63  unsigned long *c
b1b0: 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
b1c0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
b1d0: 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09  tity *curr_id;..
b1e0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
b1f0: 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c  v_entity *ccc_tl
b200: 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61  v, *ccc_curr, *a
b210: 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72  pp_tlv, *app_cur
b220: 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  r;..unsigned cha
b230: 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47  r ccc_aid[] = {G
b240: 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09  SCIS_AID_CCC};..
b250: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 75  unsigned char cu
b260: 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69  rr_aid[7];..unsi
b270: 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78  gned long outidx
b280: 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65   = 0;..cackey_re
b290: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65  t transaction_re
b2a0: 74 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65  t;..int certs_re
b2b0: 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65  sizable;..int se
b2c0: 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72  nd_ret, select_r
b2d0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
b2e0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
b2f0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e  d.");...if (coun
b300: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
b310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b320: 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c  TF("count is NUL
b330: 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  L, returning in 
b340: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
b350: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
b360: 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55  .if (certs != NU
b370: 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75  LL) {...if (*cou
b380: 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41  nt == 0) {....CA
b390: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b3a0: 46 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20  F("Requested we 
b3b0: 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73  return 0 objects
b3c0: 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22  , short-circuit"
b3d0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65  );.....return(ce
b3e0: 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  rts);...}..}.../
b3f0: 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43  * Begin a SmartC
b400: 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ard transaction 
b410: 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f  */..transaction_
b420: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67  ret = cackey_beg
b430: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
b440: 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73  lot);..if (trans
b450: 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41  action_ret != CA
b460: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
b470: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
b480: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
b490: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
b4a0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
b4b0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
b4c0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
b4d0: 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55  .if (certs == NU
b4e0: 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20  LL) {...certs = 
b4f0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
b500: 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a 63  erts) * 5);...*c
b510: 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72 74  ount = 5;...cert
b520: 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31 3b  s_resizable = 1;
b530: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65 72  ..} else {...cer
b540: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 30  ts_resizable = 0
b550: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74  ;..}.../* Select
b560: 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74 20   the CCC Applet 
b570: 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
b580: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
b590: 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69  let(slot, ccc_ai
b5a0: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69  d, sizeof(ccc_ai
b5b0: 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  d));..if (send_r
b5c0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
b5d0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
b5e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b5f0: 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63  "Unable to selec
b600: 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65  t CCC Applet, re
b610: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
b620: 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72 6d  re");..../* Term
b630: 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20  inate SmartCard 
b640: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
b650: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
b660: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
b670: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
b680: 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c 6c  .}.../* Read all
b690: 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72 6f   the applets fro
b6a0: 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56 20  m the CCC's TLV 
b6b0: 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63 61  */..ccc_tlv = ca
b6c0: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c  ckey_read_tlv(sl
b6d0: 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66  ot);.../* Look f
b6e0: 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61 74  or CARDURLs that
b6f0: 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50   coorespond to P
b700: 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 66  KI applets */..f
b710: 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63  or (ccc_curr = c
b720: 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72  cc_tlv; ccc_curr
b730: 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63  ; ccc_curr = ccc
b740: 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a  _curr->_next) {.
b750: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b760: 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67  RINTF("Found tag
b770: 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b  : %s ... ", CACK
b780: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
b790: 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  G_TO_STR(ccc_cur
b7a0: 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66 20  r->tag));....if 
b7b0: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21  (ccc_curr->tag !
b7c0: 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  = GSCIS_TAG_CARD
b7d0: 55 52 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  URL) {....CACKEY
b7e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
b7f0: 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74   ... skipping it
b800: 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61   (we only care a
b810: 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22 29  bout CARDURLs)")
b820: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
b830: 09 09 7d 0a 0a 09 09 69 66 20 28 28 63 63 63 5f  ..}....if ((ccc_
b840: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
b850: 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43  url->apptype & C
b860: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
b870: 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56  I) != CACKEY_TLV
b880: 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 43  _APP_PKI) {....C
b890: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b8a0: 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69  TF("  ... skippi
b8b0: 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63  ng it (we only c
b8c0: 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70  are about PKI ap
b8d0: 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c  plets, this appl
b8e0: 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f  et supports: %s/
b8f0: 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  %02x)", CACKEY_D
b900: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
b910: 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  E_TO_STR(ccc_cur
b920: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
b930: 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73  ->apptype), (uns
b940: 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63  igned int) ccc_c
b950: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
b960: 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09  rl->apptype);...
b970: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
b980: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b990: 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c  PRINTBUF("RID:",
b9a0: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
b9b0: 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73  _cardurl->rid, s
b9c0: 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e  izeof(ccc_curr->
b9d0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
b9e0: 69 64 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44  id));...CACKEY_D
b9f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70  EBUG_PRINTF("App
ba00: 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20  ID = %s/%04lx", 
ba10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
ba20: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63  C_OBJID_TO_STR(c
ba30: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
ba40: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20  ardurl->appid), 
ba50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ba60: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
ba70: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b  cardurl->appid);
ba80: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ba90: 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44  PRINTF("ObjectID
baa0: 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41   = %s/%04lx", CA
bab0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
bac0: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63  OBJID_TO_STR(ccc
bad0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
bae0: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c  durl->objectid),
baf0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
bb00: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
bb10: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
bb20: 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 63  id);....memcpy(c
bb30: 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 72  urr_aid, ccc_cur
bb40: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
bb50: 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
bb60: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
bb70: 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
bb80: 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28  curr_aid[sizeof(
bb90: 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d  curr_aid) - 2] =
bba0: 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75   (ccc_curr->valu
bbb0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
bbc0: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09   >> 8) & 0xff;..
bbd0: 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
bbe0: 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20  (curr_aid) - 1] 
bbf0: 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
bc00: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
bc10: 20 26 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20 53   & 0xff;..../* S
bc20: 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c  elect found appl
bc30: 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65  et ... */...sele
bc40: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
bc50: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
bc60: 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  ot, curr_aid, si
bc70: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b  zeof(curr_aid));
bc80: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
bc90: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
bca0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
bcb0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bcc0: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
bcd0: 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69  t applet, skippi
bce0: 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  ng processing of
bcf0: 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a   this object");.
bd00: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
bd10: 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20  }..../* ... and 
bd20: 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f  object (file) */
bd30: 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20  ...select_ret = 
bd40: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
bd50: 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72  le(slot, ccc_cur
bd60: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
bd70: 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 69  ->objectid);...i
bd80: 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
bd90: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
bda0: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
bdb0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
bdc0: 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69  led to select fi
bdd0: 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  le, skipping pro
bde0: 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
bdf0: 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f  object");.....co
be00: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f  ntinue;...}..../
be10: 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20 66  * Process this f
be20: 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e  ile's TLV lookin
be30: 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61 74  g for certificat
be40: 65 73 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76 20  es */...app_tlv 
be50: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
be60: 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72 20  v(slot);....for 
be70: 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f  (app_curr = app_
be80: 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61  tlv; app_curr; a
be90: 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75  pp_curr = app_cu
bea0: 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  rr->_next) {....
beb0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bec0: 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20  NTF("Found tag: 
bed0: 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
bee0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
bef0: 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29  R(app_curr->tag)
bf00: 29 3b 0a 09 09 09 69 66 20 28 61 70 70 5f 63 75  );....if (app_cu
bf10: 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
bf20: 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45  _TAG_CERTIFICATE
bf30: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
bf40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
bf50: 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
bf60: 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
bf70: 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29  ut CERTIFICATEs)
bf80: 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
bf90: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72  e;....}.....curr
bfa0: 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74  _id = &certs[out
bfb0: 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b  idx];....outidx+
bfc0: 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  +;.....memcpy(cu
bfd0: 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 63  rr_id->applet, c
bfe0: 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  urr_aid, sizeof(
bff0: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29  curr_id->applet)
c000: 29 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 66  );....curr_id->f
c010: 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e  ile = ccc_curr->
c020: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
c030: 62 6a 65 63 74 69 64 3b 0a 09 09 09 63 75 72 72  bjectid;....curr
c040: 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d  _id->keysize = -
c050: 31 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  1;.....CACKEY_DE
c060: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c  BUG_PRINTF("Fill
c070: 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70 70  ing curr_id->app
c080: 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25 6c  let (%p) with %l
c090: 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f  u bytes:", curr_
c0a0: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e 73  id->applet, (uns
c0b0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
c0c0: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  of(curr_id->appl
c0d0: 65 74 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  et));....CACKEY_
c0e0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
c0f0: 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e  VAL:", curr_id->
c100: 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63  applet, sizeof(c
c110: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29  urr_id->applet))
c120: 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ;.....curr_id->c
c130: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
c140: 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74   app_curr->lengt
c150: 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  h;.....curr_id->
c160: 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61  certificate = ma
c170: 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65  lloc(curr_id->ce
c180: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
c190: 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
c1a0: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  d->certificate, 
c1b0: 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c  app_curr->value,
c1c0: 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
c1d0: 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
c1e0: 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
c1f0: 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69 66 20 28  ount) {.....if (
c200: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
c210: 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a   {......*count *
c220: 3d 20 32 3b 0a 09 09 09 09 09 63 65 72 74 73 20  = 2;......certs 
c230: 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c  = realloc(certs,
c240: 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20   sizeof(*certs) 
c250: 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09  * (*count));....
c260: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 62  .} else {......b
c270: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  reak;.....}....}
c280: 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
c290: 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29  ree_tlv(app_tlv)
c2a0: 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69 64 78 20  ;....if (outidx 
c2b0: 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09  >= *count) {....
c2c0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  break;...}..}...
c2d0: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
c2e0: 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f 75  ccc_tlv);...*cou
c2f0: 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69  nt = outidx;...i
c300: 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62  f (certs_resizab
c310: 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20  le) {...certs = 
c320: 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73  realloc(certs, s
c330: 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
c340: 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09  (*count));..}...
c350: 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61  /* Terminate Sma
c360: 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtCard Transacti
c370: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
c380: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
c390: 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65  ot);...return(ce
c3a0: 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  rts);.}../*. * S
c3b0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
c3c0: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
c3d0: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
c3e0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
c3f0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
c400: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
c410: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
c420: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
c430: 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75  signdecrypt(stru
c440: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
c450: 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
c460: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
c470: 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
c480: 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65   char *buf, size
c490: 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67  _t buflen, unsig
c4a0: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66  ned char *outbuf
c4b0: 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c  , size_t outbufl
c4c0: 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74  en, int padInput
c4d0: 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75  , int unpadOutpu
c4e0: 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  t) {..unsigned c
c4f0: 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d  har *tmpbuf, *tm
c500: 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f  pbuf_s, *outbuf_
c510: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
c520: 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  r bytes_to_send,
c530: 20 70 31 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63   p1;..unsigned c
c540: 68 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09  har blocktype;..
c550: 63 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f  cackey_ret send_
c560: 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  ret;..uint16_t r
c570: 65 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f  espcode;..ssize_
c580: 74 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e  t retval = 0, un
c590: 70 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65  padoffset;..size
c5a0: 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61  _t tmpbuflen, pa
c5b0: 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c  dlen, tmpoutbufl
c5c0: 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d  en;..int free_tm
c5d0: 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c  pbuf = 0;..int l
c5e0: 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  e;...CACKEY_DEBU
c5f0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
c600: 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20  .");...if (slot 
c610: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c620: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c630: 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69  ("Error.  slot i
c640: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
c650: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
c660: 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (buf == NULL) {
c670: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c680: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
c690: 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  buf is NULL");..
c6a0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c6b0: 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d  ...if (outbuf ==
c6c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
c6d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c6e0: 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69  Error.  outbuf i
c6f0: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
c700: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
c710: 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55   (identity == NU
c720: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
c730: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
c740: 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73  or.  identity is
c750: 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
c760: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
c770: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
c780: 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
c790: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c7a0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
c7b0: 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
c7c0: 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55  c_identity is NU
c7d0: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
c7e0: 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  -1);..}.../* Det
c7f0: 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20  ermine identity 
c800: 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20  Key size */..if 
c810: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
c820: 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
c830: 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74  e < 0) {...ident
c840: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
c850: 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35  ty->keysize = x5
c860: 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64  09_to_keysize(id
c870: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
c880: 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
c890: 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  te, identity->pc
c8a0: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
c8b0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
c8c0: 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61  }.../* Pad messa
c8d0: 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a  ge to key size *
c8e0: 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74 29  /..if (padInput)
c8f0: 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74   {...if (identit
c900: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
c910: 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b  ->keysize > 0) {
c920: 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21  ....if (buflen !
c930: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  = identity->pcsc
c940: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
c950: 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75  ze) {.....if (bu
c960: 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79  flen > (identity
c970: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
c980: 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b  >keysize + 3)) {
c990: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
c9a0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
c9b0: 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f  .  Message is to
c9c0: 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f  o large to sign/
c9d0: 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09  decrypt");......
c9e0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
c9f0: 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65  .}......tmpbufle
ca00: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  n = identity->pc
ca10: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
ca20: 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66  size;.....tmpbuf
ca30: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
ca40: 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74  len);.....free_t
ca50: 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09  mpbuf = 1;......
ca60: 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c  padlen = tmpbufl
ca70: 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b  en - buflen - 3;
ca80: 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43  ....../* RSA PKC
ca90: 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76  S#1 EMSA-PKCS1-v
caa0: 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09  1_5 Padding */..
cab0: 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30  ...tmpbuf[0] = 0
cac0: 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b  x00;.....tmpbuf[
cad0: 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d  1] = 0x01;.....m
cae0: 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d  emset(&tmpbuf[2]
caf0: 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b  , 0xFF, padlen);
cb00: 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c  .....tmpbuf[padl
cb10: 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09  en + 2]= 0x00;..
cb20: 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75  ...memcpy(&tmpbu
cb30: 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62  f[padlen + 3], b
cb40: 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09  uf, buflen);....
cb50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cb60: 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65  RINTBUF("Unpadde
cb70: 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e  d:", buf, buflen
cb80: 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
cb90: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61  BUG_PRINTBUF("Pa
cba0: 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20  dded:", tmpbuf, 
cbb0: 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d  tmpbuflen);....}
cbc0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62   else {.....tmpb
cbd0: 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d  uf = buf;.....tm
cbe0: 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
cbf0: 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75  ;.....free_tmpbu
cc00: 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65  f = 0;.....padle
cc10: 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20  n = 0;....}...} 
cc20: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
cc30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
cc40: 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  nable to determi
cc50: 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70  ne key size, hop
cc60: 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 20  ing the message 
cc70: 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64  is properly padd
cc80: 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75  ed!");.....tmpbu
cc90: 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62  f = buf;....tmpb
cca0: 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
ccb0: 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
ccc0: 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20   0;....padlen = 
ccd0: 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  0;...}..} else {
cce0: 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
ccf0: 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
cd00: 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d  uflen;...free_tm
cd10: 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c  pbuf = 0;...padl
cd20: 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20  en = 0;..}.../* 
cd30: 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  Begin transactio
cd40: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
cd50: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
cd60: 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63  lot);.../* Selec
cd70: 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74  t correct applet
cd80: 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55   */..CACKEY_DEBU
cd90: 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74  G_PRINTF("Select
cda0: 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64  ing applet found
cdb0: 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65   at %p ...", ide
cdc0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
cdd0: 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 3b 0a 09  tity->applet);..
cde0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
cdf0: 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74  plet(slot, ident
ce00: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
ce10: 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65  ty->applet, size
ce20: 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  of(identity->pcs
ce30: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c  c_identity->appl
ce40: 65 74 29 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63  et));.../* Selec
ce50: 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a  t correct file *
ce60: 2f 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  /..cackey_select
ce70: 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e  _file(slot, iden
ce80: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
ce90: 69 74 79 2d 3e 66 69 6c 65 29 3b 0a 0a 09 74 6d  ity->file);...tm
cea0: 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b  pbuf_s = tmpbuf;
ceb0: 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74  ..outbuf_s = out
cec0: 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70  buf;..while (tmp
ced0: 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20 28  buflen) {...if (
cee0: 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34 35 29  tmpbuflen > 245)
cef0: 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73   {....bytes_to_s
cf00: 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09 70 31  end = 245;....p1
cf10: 20 3d 20 30 78 38 30 3b 0a 09 09 09 6c 65 20 3d   = 0x80;....le =
cf20: 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20   0x00;...} else 
cf30: 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65  {....bytes_to_se
cf40: 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  nd = tmpbuflen;.
cf50: 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09  ...p1 = 0x00;...
cf60: 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 0a  .le = 0x00;...}.
cf70: 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20  ...tmpoutbuflen 
cf80: 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09  = outbuflen;....
cf90: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
cfa0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
cfb0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  , GSCIS_CLASS_GL
cfc0: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47  OBAL_PLATFORM, G
cfd0: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
cfe0: 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30  ECRYPT, p1, 0x00
cff0: 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  , bytes_to_send,
d000: 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65   tmpbuf, le, &re
d010: 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20  spcode, outbuf, 
d020: 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  &tmpoutbuflen);.
d030: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
d040: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
d050: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
d060: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
d070: 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65  PU Sending Faile
d080: 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69  d -- returning i
d090: 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09  n error.");.....
d0a0: 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29  if (free_tmpbuf)
d0b0: 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75   {.....if (tmpbu
d0c0: 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65  f_s) {......free
d0d0: 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09  (tmpbuf_s);.....
d0e0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e  }....}...../* En
d0f0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d transaction */
d100: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
d110: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
d120: 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f  ;.....if (respco
d130: 64 65 20 3d 3d 20 30 78 36 39 38 32 29 20 7b 0a  de == 0x6982) {.
d140: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d150: 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 69 74  _PRINTF("Securit
d160: 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74  y status not sat
d170: 69 73 69 66 69 65 64 2e 20 20 52 65 74 75 72 6e  isified.  Return
d180: 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 29 3b  ing NEEDLOGIN");
d190: 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74  ......slot->slot
d1a0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09  _reset = 1;.....
d1b0: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67  slot->token_flag
d1c0: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
d1d0: 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74  QUIRED;......ret
d1e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
d1f0: 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09  E_NEEDLOGIN);...
d200: 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f  .}.....if (send_
d210: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
d220: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
d230: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
d240: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b  EBUG_PRINTF("Tok
d250: 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75  en absent.  Retu
d260: 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e  rning TOKENABSEN
d270: 54 22 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e  T");......slot->
d280: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
d290: 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  ....slot->token_
d2a0: 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
d2b0: 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09  N_REQUIRED;.....
d2c0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
d2d0: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
d2e0: 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  T);....}.....ret
d2f0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
d300: 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f  tmpbuf += bytes_
d310: 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75  to_send;...tmpbu
d320: 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f  flen -= bytes_to
d330: 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66  _send;....outbuf
d340: 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
d350: 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d  ;...outbuflen -=
d360: 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
d370: 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75  .retval += tmpou
d380: 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66  tbuflen;..}...if
d390: 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b   (free_tmpbuf) {
d3a0: 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29  ...if (tmpbuf_s)
d3b0: 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75   {....free(tmpbu
d3c0: 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f  f_s);...}..}...o
d3d0: 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73  utbuf = outbuf_s
d3e0: 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ;.../* End trans
d3f0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
d400: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
d410: 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66  n(slot);..#ifdef
d420: 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
d430: 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
d440: 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
d450: 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53  outbuflen > _POS
d460: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
d470: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d480: 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e  RINTF("Outbuflen
d490: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
d4a0: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
d4b0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
d4c0: 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66  ax = %li, outbuf
d4d0: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  len = %lu)", (lo
d4e0: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
d4f0: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
d500: 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29  long) outbuflen)
d510: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
d520: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
d530: 64 69 66 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72  dif.../* Unpad r
d540: 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70  eply */..if (unp
d550: 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66  adOutput) {...if
d560: 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a   (retval < 3) {.
d570: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d580: 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73  PRINTF("Reply is
d590: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61   too small, we a
d5a0: 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75  re not able to u
d5b0: 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20  npad -- passing 
d5c0: 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
d5d0: 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
d5e0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
d5f0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
d600: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
d610: 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
d620: 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
d630: 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
d640: 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
d650: 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21  .if (outbuf[0] !
d660: 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43  = 0x00) {....CAC
d670: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d680: 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70  ("Unrecognized p
d690: 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d  adding scheme --
d6a0: 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e   passing back an
d6b0: 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
d6c0: 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41   best!");.....CA
d6d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d6e0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
d6f0: 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
d700: 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
d710: 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
d720: 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
d730: 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74  );...}....blockt
d740: 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b  ype = outbuf[1];
d750: 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  ...unpadoffset =
d760: 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62   0;....switch (b
d770: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63  locktype) {....c
d780: 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a  ase 0x00:...../*
d790: 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20   Padding Scheme 
d7a0: 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  1, the first non
d7b0: 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68  -zero byte is th
d7c0: 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20  e start of data 
d7d0: 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
d7e0: 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
d7f0: 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
d800: 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
d810: 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
d820: 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
d830: 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   != 0x00) {.....
d840: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
d850: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
d860: 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09  ....case 0x01:..
d870: 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
d880: 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65  heme 2, pad byte
d890: 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f  s are 0xFF follo
d8a0: 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09  wed by 0x00 */..
d8b0: 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
d8c0: 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
d8d0: 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
d8e0: 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
d8f0: 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
d900: 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20  unpadoffset] != 
d910: 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66  0xFF) {.......if
d920: 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
d930: 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b  fset] == 0x00) {
d940: 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66  ........unpadoff
d950: 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62  set++;.........b
d960: 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c  reak;.......} el
d970: 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b  se {........CACK
d980: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d990: 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
d9a0: 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
d9b0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d9c0: 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
d9d0: 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30  een 0x00 found 0
d9e0: 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
d9f0: 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
da00: 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
da10: 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
da20: 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20  .......}......} 
da30: 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43  else {.......CAC
da40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
da50: 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
da60: 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
da70: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
da80: 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
da90: 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20  been 0xFF found 
daa0: 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
dab0: 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
dac0: 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
dad0: 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
dae0: 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
daf0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
db00: 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61   0x02:...../* Pa
db10: 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20  dding Scheme 3, 
db20: 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f  pad bytes are no
db30: 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72  n-zero first zer
db40: 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20  o byte found is 
db50: 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79  the seperator by
db60: 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  te */.....for (u
db70: 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
db80: 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
db90: 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
dba0: 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
dbb0: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
dbc0: 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09  et] == 0x00) {..
dbd0: 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
dbe0: 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
dbf0: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
dc00: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
dc10: 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74  .if (unpadoffset
dc20: 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09   > retval) {....
dc30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dc40: 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61  NTF("Offset grea
dc50: 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73  ter than reply s
dc60: 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20  ize, aborting.  
dc70: 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25  (unpadoffset = %
dc80: 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75  lu, retval = %lu
dc90: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
dca0: 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  ng) unpadoffset,
dcb0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
dcc0: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65   retval);.....re
dcd0: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
dce0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dcf0: 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22  INTBUF("Padded:"
dd00: 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c  , outbuf, retval
dd10: 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20  );....retval -= 
dd20: 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d  unpadoffset;...m
dd30: 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f  emmove(outbuf, o
dd40: 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66  utbuf + unpadoff
dd50: 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  set, retval);...
dd60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dd70: 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64  INTBUF("Unpadded
dd80: 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
dd90: 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  al);..}....CACKE
dda0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ddb0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
ddc0: 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
ddd0: 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
dde0: 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  ng) retval);...r
ddf0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
de00: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
de10: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
de20: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
de30: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
de40: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
de50: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
de60: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
de70: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
de80: 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69  _ret cackey_logi
de90: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
dea0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
deb0: 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20  gned char *pin, 
dec0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69  unsigned long pi
ded0: 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65  n_len, int *trie
dee0: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
def0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
df00: 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78  cac_pin[8] = {0x
df10: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
df20: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
df30: 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09  , 0xFF, 0xFF};..
df40: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73  uint16_t respons
df50: 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69  e_code;..int tri
df60: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
df70: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f  nt send_ret;.../
df80: 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
df90: 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61  we do not know a
dfa0: 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72  bout how many tr
dfb0: 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e  ies are remainin
dfc0: 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f  g */..if (tries_
dfd0: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
dfe0: 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
dff0: 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f  g_p = -1;..}.../
e000: 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41  * Apparently, CA
e010: 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43  C PINs are *EXAC
e020: 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e  TLY* 8 bytes lon
e030: 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78  g -- pad with 0x
e040: 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20  FF if too short 
e050: 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
e060: 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
e070: 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38  (cac_pin, pin, 8
e080: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
e090: 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
e0a0: 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d  in, pin_len);..}
e0b0: 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20  .../* Issue PIN 
e0c0: 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f  Verify */..send_
e0d0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
e0e0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
e0f0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
e100: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45  , GSCIS_INSTR_VE
e110: 52 49 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30  RIFY, 0x00, 0x00
e120: 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e  , sizeof(cac_pin
e130: 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30  ), cac_pin, 0x00
e140: 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  , &response_code
e150: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
e160: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
e170: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
e180: 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f  ) {...if ((respo
e190: 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43  nse_code & 0x63C
e1a0: 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a  0) == 0x63C0) {.
e1b0: 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ...tries_remaini
e1c0: 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63  ng = (response_c
e1d0: 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09  ode & 0xF);.....
e1e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e1f0: 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63  NTF("PIN Verific
e200: 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69  ation failed, %i
e210: 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67   tries remaining
e220: 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ", tries_remaini
e230: 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69  ng);.....if (tri
e240: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
e250: 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d  {.....*tries_rem
e260: 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73  aining_p = tries
e270: 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d  _remaining;....}
e280: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
e290: 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
e2a0: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
e2b0: 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30  sponse_code == 0
e2c0: 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b  x6983) {....CACK
e2d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e2e0: 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f  "PIN Verificatio
e2f0: 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65  n failed, device
e300: 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09   is locked");...
e310: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
e320: 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a  PCSC_E_LOCKED);.
e330: 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ..}....return(CA
e340: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
e350: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
e360: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e370: 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
e380: 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09   succeeded");...
e390: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
e3a0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
e3b0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
e3c0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
e3d0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
e3e0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
e3f0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
e400: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
e410: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
e420: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
e430: 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
e440: 73 65 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b  sent(struct cack
e450: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
e460: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
e470: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
e480: 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e  DWORD reader_len
e490: 2c 20 73 74 61 74 65 2c 20 70 72 6f 74 6f 63 6f  , state, protoco
e4a0: 6c 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54  l, atr_len;..BYT
e4b0: 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49  E atr[MAX_ATR_SI
e4c0: 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75  ZE];..LONG statu
e4d0: 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63  s_ret, scard_rec
e4e0: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
e4f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e500: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 70 63 73  Called.");...pcs
e510: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
e520: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
e530: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
e540: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
e550: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
e560: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
e570: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
e580: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
e590: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
e5a0: 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
e5b0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
e5c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
e5d0: 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61  NABSENT);..}...a
e5e0: 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
e5f0: 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65  atr);..status_re
e600: 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
e610: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
e620: 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
e630: 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
e640: 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
e650: 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 74 61 74  _len);..if (stat
e660: 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  us_ret != SCARD_
e670: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 73  S_SUCCESS) {...s
e680: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20  lot->slot_reset 
e690: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b  = 1;...slot->tok
e6a0: 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
e6b0: 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a  OGIN_REQUIRED;..
e6c0: 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
e6d0: 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45   == SCARD_W_RESE
e6e0: 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  T_CARD) {....CAC
e6f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e700: 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64  ("Reset required
e710: 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e  , please hold...
e720: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65  ");.....scard_re
e730: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
e740: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
e750: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
e760: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
e770: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
e780: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
e790: 52 44 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  RD, &protocol);.
e7a0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
e7b0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
e7c0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
e7d0: 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73  ../* Re-establis
e7e0: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  h transaction, i
e7f0: 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74  f it was present
e800: 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74   */.....if (slot
e810: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
e820: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  pth > 0) {......
e830: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
e840: 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09  n_depth--;......
e850: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
e860: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
e870: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
e880: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e890: 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c  Reset successful
e8a0: 2c 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a  , requerying");.
e8b0: 09 09 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d  ....status_ret =
e8c0: 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f   SCardStatus(slo
e8d0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55  t->pcsc_card, NU
e8e0: 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c  LL, &reader_len,
e8f0: 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63   &state, &protoc
e900: 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65  ol, atr, &atr_le
e910: 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74  n);.....if (stat
e920: 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  us_ret != SCARD_
e930: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
e940: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e950: 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61  RINTF("Still una
e960: 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72  ble to query car
e970: 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e  d status, return
e980: 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
e990: 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29  .  SCardStatus()
e9a0: 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
e9b0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
e9c0: 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73  RR_TO_STR(status
e9d0: 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65  _ret));.......re
e9e0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e9f0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
ea00: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
ea10: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
ea20: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
ea30: 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20  le to reconnect 
ea40: 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
ea50: 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e  ng token absent.
ea60: 20 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74    SCardReconnect
ea70: 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59  () = %s", CACKEY
ea80: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
ea90: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
eaa0: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a  d_reconn_ret));.
eab0: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
eac0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
ead0: 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d  BSENT);....}...}
eae0: 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
eaf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
eb00: 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20  Unable to query 
eb10: 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74  card status, ret
eb20: 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
eb30: 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75  ent.  SCardStatu
eb40: 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  s() = %s", CACKE
eb50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
eb60: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61  RDERR_TO_STR(sta
eb70: 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72  tus_ret));.....r
eb80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
eb90: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
eba0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28  ;...}..}...if ((
ebb0: 73 74 61 74 65 20 26 20 53 43 41 52 44 5f 41 42  state & SCARD_AB
ebc0: 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41  SENT) == SCARD_A
ebd0: 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  BSENT) {...CACKE
ebe0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ebf0: 43 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20  Card is absent, 
ec00: 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
ec10: 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74  absent");....ret
ec20: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
ec30: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
ec40: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
ec50: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
ec60: 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e  ing token presen
ec70: 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  t.");...return(C
ec80: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
ec90: 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f  ENPRESENT);.}../
eca0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
ecb0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
ecc0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
ecd0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
ece0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
ecf0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
ed00: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
ed10: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
ed20: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
ed30: 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72  ity_to_label(str
ed40: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
ed50: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
ed60: 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ty, unsigned cha
ed70: 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e  r *label_buf, un
ed80: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65  signed long labe
ed90: 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e  l_buf_len) {..un
eda0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74  signed long cert
edb0: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63 68  ificate_len;..ch
edc0: 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a  ar *label_asn1;.
edd0: 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61  .void *certifica
ede0: 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65  te;..int x509_re
edf0: 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66  ad_ret;...certif
ee00: 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
ee10: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
ee20: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
ee30: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
ee40: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
ee50: 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
ee60: 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  en < 0) {...retu
ee70: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
ee80: 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
ee90: 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72  9_to_subject(cer
eea0: 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
eeb0: 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64  icate_len, (void
eec0: 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31   **) &label_asn1
eed0: 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  );..if (x509_rea
eee0: 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72  d_ret < 0) {...r
eef0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
ef00: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
ef10: 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e  x509_dn_to_strin
ef20: 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35  g(label_asn1, x5
ef30: 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68  09_read_ret, (ch
ef40: 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c  ar *) label_buf,
ef50: 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20   label_buf_len, 
ef60: 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39  "CN");..if (x509
ef70: 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  _read_ret <= 0) 
ef80: 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  {...x509_read_re
ef90: 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
efa0: 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
efb0: 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
efc0: 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
efd0: 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
efe0: 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66  en, NULL);....if
eff0: 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
f000: 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72  <= 0) {....retur
f010: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  n(-1);...}..}..#
f020: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
f030: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
f040: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
f050: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
f060: 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  et > _POSIX_SSIZ
f070: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
f080: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f090: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78  x509_read_ret ex
f0a0: 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
f0b0: 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
f0c0: 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
f0d0: 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64  = %li, x509_read
f0e0: 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  _ret = %lu)", (l
f0f0: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
f100: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
f110: 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64   long) x509_read
f120: 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
f130: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
f140: 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  f.#endif...retur
f150: 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29  n(x509_read_ret)
f160: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
f170: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
f180: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
f190: 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76  y_mutex_create(v
f1a0: 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09  oid **mutex) {..
f1b0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
f1c0: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a  *pthread_mutex;.
f1d0: 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
f1e0: 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74  val;..CK_RV cust
f1f0: 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  om_retval;...CAC
f200: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f210: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
f220: 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  f ((cackey_args.
f230: 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c  flags & CKF_OS_L
f240: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b  OCKING_OK) == CK
f250: 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
f260: 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
f270: 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ex = malloc(size
f280: 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  of(*pthread_mute
f290: 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72  x));...if (!pthr
f2a0: 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ead_mutex) {....
f2b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f2c0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61  NTF("Failed to a
f2d0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22  llocate memory."
f2e0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
f2f0: 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61  );...}....pthrea
f300: 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
f310: 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74  ad_mutex_init(pt
f320: 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c  hread_mutex, NUL
f330: 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  L);...if (pthrea
f340: 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
f350: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f360: 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
f370: 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65  _mutex_init() re
f380: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
f390: 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
f3a0: 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
f3b0: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75  (-1);...}....*mu
f3c0: 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  tex = pthread_mu
f3d0: 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  tex;..} else {..
f3e0: 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
f3f0: 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a  .CreateMutex) {.
f400: 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
f410: 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43   = cackey_args.C
f420: 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78  reateMutex(mutex
f430: 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
f440: 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
f450: 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
f460: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
f470: 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
f480: 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  eMutex() returne
f490: 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
f4a0: 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
f4b0: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
f4c0: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
f4d0: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
f4e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
f4f0: 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
f500: 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
f510: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
f520: 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
f530: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
f540: 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
f550: 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a  (void *mutex) {.
f560: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
f570: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
f580: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
f590: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
f5a0: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
f5b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f5c0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
f5d0: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
f5e0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
f5f0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
f600: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
f610: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
f620: 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09  tex = mutex;....
f630: 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
f640: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
f650: 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
f660: 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
f670: 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
f680: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f690: 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
f6a0: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65  _mutex_lock() re
f6b0: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
f6c0: 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
f6d0: 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
f6e0: 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  (-1);...}..} els
f6f0: 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
f700: 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29  _args.LockMutex)
f710: 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
f720: 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
f730: 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65  s.LockMutex(mute
f740: 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
f750: 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
f760: 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
f770: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f780: 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
f790: 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
f7a0: 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
f7b0: 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
f7c0: 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
f7d0: 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
f7e0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
f7f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
f800: 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
f810: 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
f820: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  (0);.}../* Retur
f830: 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
f840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
f850: 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
f860: 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
f870: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
f880: 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
f890: 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
f8a0: 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
f8b0: 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
f8c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f8d0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
f8e0: 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
f8f0: 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
f900: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
f910: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
f920: 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
f930: 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
f940: 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
f950: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
f960: 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  unlock(pthread_m
f970: 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
f980: 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
f990: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
f9a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
f9b0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
f9c0: 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
f9d0: 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
f9e0: 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
f9f0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
fa00: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
fa10: 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
fa20: 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73  kMutex) {....cus
fa30: 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tom_retval = cac
fa40: 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
fa50: 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
fa60: 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
fa70: 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
fa80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fa90: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
faa0: 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
fab0: 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
fac0: 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
fad0: 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
fae0: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
faf0: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
fb00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
fb10: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
fb20: 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
fb30: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
fb40: 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54  }..static CK_ATT
fb50: 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65  RIBUTE_PTR cacke
fb60: 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
fb70: 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53  (CK_OBJECT_CLASS
fb80: 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74   objectclass, st
fb90: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
fba0: 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
fbb0: 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ity, unsigned lo
fbc0: 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c  ng identity_num,
fbd0: 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
fbe0: 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69  lCount) {..stati
fbf0: 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72  c CK_BBOOL ck_tr
fc00: 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20  ue = 1;..static 
fc10: 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73  CK_BBOOL ck_fals
fc20: 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  e = 0;..CK_ULONG
fc30: 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72   numattrs = 0, r
fc40: 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b  etval_count;..CK
fc50: 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20  _ATTRIBUTE_TYPE 
fc60: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a  curr_attr_type;.
fc70: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75  .CK_ATTRIBUTE cu
fc80: 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c  rr_attr, *retval
fc90: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
fca0: 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  Value;..CK_ULONG
fcb0: 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b   ulValueLen;..CK
fcc0: 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b  _OBJECT_CLASS ck
fcd0: 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09  _object_class;..
fce0: 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
fcf0: 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61  YPE ck_certifica
fd00: 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59  te_type;..CK_KEY
fd10: 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70  _TYPE ck_key_typ
fd20: 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20  e;..CK_UTF8CHAR 
fd30: 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a  ucTmpBuf[1024];.
fd40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
fd50: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73  certificate;..ss
fd60: 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74  ize_t certificat
fd70: 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39  e_len = -1, x509
fd80: 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20  _read_ret;..int 
fd90: 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43  pValue_free;...C
fda0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fdb0: 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65  TF("Called (obje
fdc0: 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69  ctClass = %lu, i
fdd0: 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c  dentity_num = %l
fde0: 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
fdf0: 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73  long) objectclas
fe00: 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29  s, identity_num)
fe10: 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ;...if (objectcl
fe20: 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
fe30: 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74  FICATE && object
fe40: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42  class != CKO_PUB
fe50: 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63  LIC_KEY && objec
fe60: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52  tclass != CKO_PR
fe70: 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43  IVATE_KEY) {...C
fe80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fe90: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
fea0: 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
feb0: 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63  invalid object c
fec0: 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72  lass");....retur
fed0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
fee0: 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66   Get Cert */..if
fef0: 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55   (identity == NU
ff00: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
ff10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
ff20: 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
ff30: 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
ff40: 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65   identiy provide
ff50: 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
ff60: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69  ULL);..}...certi
ff70: 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
ff80: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
ff90: 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
ffa0: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
ffb0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
ffc0: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
ffd0: 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72  len == -1 || cer
ffe0: 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c  tificate == NULL
fff0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
10000 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
10010 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
10020 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e  NULL), this iden
10030 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  tity does not ha
10040 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74  ve an X.509 cert
10050 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
10060 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77  ed with it and w
10070 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a  ill not work");.
10080 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
10090 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
100a0 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65  that certificate
100b0 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65   is ASN.1 encode
100c0 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  d X.509 certific
100d0 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39  ate */..if (x509
100e0 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
100f0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
10100 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c  ate_len, NULL) <
10110 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
10120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
10130 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
10140 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35   (NULL), the X.5
10150 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61  09 certificate a
10160 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10170 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20  his identity is 
10180 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09  not valid");....
10190 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
101a0 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
101b0 3d 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20  = 16;..retval = 
101c0 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f  malloc(retval_co
101d0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
101e0 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63  tval));...for (c
101f0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
10200 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  0; curr_attr_typ
10210 65 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b 20  e < 0xce53635f; 
10220 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b  curr_attr_type++
10230 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61  ) {...if (curr_a
10240 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30  ttr_type == 0x80
10250 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74  0) {....curr_att
10260 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36  r_type = 0xce536
10270 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c  300;...}....pVal
10280 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70  ue_free = 0;...p
10290 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
102a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
102b0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77  _LONG) -1;....sw
102c0 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f  itch (curr_attr_
102d0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
102e0 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43  CKA_CLASS:.....C
102f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10300 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
10310 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41  ttribute CKA_CLA
10320 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SS (0x%08lx) ...
10330 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
10340 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
10350 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65  e);......ck_obje
10360 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63  ct_class = objec
10370 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61  tclass;......pVa
10380 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74  lue = &ck_object
10390 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61  _class;.....ulVa
103a0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
103b0 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29  ck_object_class)
103c0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
103d0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
103e0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
103f0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
10400 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
10410 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20  OBJECT_CLASS *) 
10420 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
10430 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10440 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
10450 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
10460 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09  e CKA_TOKEN:....
10470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10480 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
10490 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
104a0 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  OKEN (0x%08lx) .
104b0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
104c0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
104d0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
104e0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
104f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
10500 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
10510 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10520 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
10530 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
10540 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
10550 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
10560 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
10570 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
10580 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
10590 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
105a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ....case CKA_MOD
105b0 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43  IFIABLE:.....CAC
105c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
105d0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
105e0 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46  ribute CKA_MODIF
105f0 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20  IABLE (0x%08lx) 
10600 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
10610 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
10620 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
10630 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
10640 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
10650 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
10660 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
10670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
10680 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
10690 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
106a0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
106b0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
106c0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
106d0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
106e0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
106f0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
10700 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45  LABEL:.....CACKE
10710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10720 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10730 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28  bute CKA_LABEL (
10740 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
10750 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
10760 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
10770 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74  ...../* XXX: Det
10780 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09  ermine name */..
10790 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
107a0 73 6e 70 72 69 6e 74 66 28 75 63 54 6d 70 42 75  snprintf(ucTmpBu
107b0 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42  f, sizeof(ucTmpB
107c0 75 66 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23  uf), "Identity #
107d0 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
107e0 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e  long) identity_n
107f0 75 6d 29 3b 0a 09 09 09 09 70 56 61 6c 75 65 20  um);.....pValue 
10800 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09  = ucTmpBuf;.....
10810 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20  .if (ulValueLen 
10820 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42  >= sizeof(ucTmpB
10830 75 66 29 29 20 7b 0a 09 09 09 09 09 75 6c 56 61  uf)) {......ulVa
10840 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09  lueLen = 0;.....
10850 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
10860 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
10870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10880 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
10890 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
108a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
108b0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
108c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
108d0 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09  se CKA_VALUE:...
108e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
108f0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
10900 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
10910 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20  VALUE (0x%08lx) 
10920 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
10930 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
10940 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74  type);......swit
10950 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29  ch (objectclass)
10960 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f   {......case CKO
10970 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09  _PRIVATE_KEY:...
10980 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10990 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
109a0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
109b0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
109c0 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29  a private key.")
109d0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
109e0 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55  .....case CKO_PU
109f0 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09  BLIC_KEY:.......
10a00 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a  /* XXX: TODO */.
10a10 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
10a20 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54  ...case CKO_CERT
10a30 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70  IFICATE:.......p
10a40 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63  Value = certific
10a50 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c  ate;.......ulVal
10a60 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63  ueLen = certific
10a70 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09  ate_len;........
10a80 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
10a90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10aa0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
10ab0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
10ac0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
10ad0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
10ae0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
10af0 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55  ...case CKA_ISSU
10b00 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
10b10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
10b20 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
10b30 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78  e CKA_ISSUER (0x
10b40 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
10b50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
10b60 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
10b70 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
10b80 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
10b90 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
10ba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10bb0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
10bc0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
10bd0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
10be0 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a  certificate.");.
10bf0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10c00 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
10c10 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
10c20 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
10c30 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
10c40 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63  _issuer(certific
10c50 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
10c60 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
10c70 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
10c80 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
10c90 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
10ca0 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
10cb0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
10cc0 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
10cd0 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
10ce0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10cf0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
10d00 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
10d10 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
10d20 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
10d30 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
10d40 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
10d50 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09  ERIAL_NUMBER:...
10d60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10d70 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
10d80 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
10d90 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30  SERIAL_NUMBER (0
10da0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
10db0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
10dc0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
10dd0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
10de0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
10df0 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
10e00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10e10 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
10e20 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
10e30 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
10e40 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
10e50 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
10e60 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
10e70 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
10e80 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
10e90 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
10ea0 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
10eb0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
10ec0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
10ed0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
10ee0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
10ef0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
10f00 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
10f10 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
10f20 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
10f30 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
10f40 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10f50 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
10f60 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
10f70 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
10f80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
10f90 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
10fa0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
10fb0 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43  A_SUBJECT:.....C
10fc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10fd0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
10fe0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42  ttribute CKA_SUB
10ff0 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e  JECT (0x%08lx) .
11000 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
11010 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
11020 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
11030 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
11040 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
11050 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11060 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
11070 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
11080 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
11090 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
110a0 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
110b0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
110c0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
110d0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
110e0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
110f0 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
11100 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
11110 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
11120 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
11130 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
11140 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
11150 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
11160 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
11170 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
11180 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
11190 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
111a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
111b0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
111c0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
111d0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
111e0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
111f0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
11200 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09  ase CKA_ID:.....
11210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11220 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
11230 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44  attribute CKA_ID
11240 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
11250 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11260 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
11270 3b 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  ;......ucTmpBuf[
11280 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f  0] = ((identity_
11290 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26  num + 1) >> 8) &
112a0 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70   0xff;.....ucTmp
112b0 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74  Buf[1] =  (ident
112c0 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30  ity_num + 1) & 0
112d0 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  xff;......pValue
112e0 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09   = &ucTmpBuf;...
112f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32  ..ulValueLen = 2
11300 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
11310 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
11320 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
11330 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
11340 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
11350 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
11360 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
11370 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
11380 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
11390 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
113a0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
113b0 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45   CKA_CERTIFICATE
113c0 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
113d0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
113e0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
113f0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
11400 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
11410 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
11420 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
11430 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
11440 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
11450 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
11460 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
11470 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
11480 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
11490 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  ./* We only supp
114a0 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63  ort one certific
114b0 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09  ate type */.....
114c0 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
114d0 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b  ype = CKC_X_509;
114e0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
114f0 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
11500 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
11510 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
11520 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
11530 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
11540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
11550 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f  . returning CKC_
11560 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f  X_509 (%lu) (%p/
11570 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
11580 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
11590 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
115a0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
115b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
115c0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
115d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
115e0 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a  se CKA_KEY_TYPE:
115f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11600 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
11610 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
11620 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25  KA_KEY_TYPE (0x%
11630 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
11640 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
11650 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
11660 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
11670 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
11680 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
11690 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass != CKO_PUBLI
116a0 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41  C_KEY) {......CA
116b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
116c0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
116d0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
116e0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
116f0 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  key.");.......br
11700 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
11710 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
11720 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20  rt one key type 
11730 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79  */.....ck_key_ty
11740 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09  pe = CKK_RSA;...
11750 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
11760 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  key_type;.....ul
11770 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
11780 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a  f(ck_key_type);.
11790 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
117a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
117b0 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41  eturning CKK_RSA
117c0 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
117d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
117e0 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
117f0 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
11800 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
11810 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
11820 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
11830 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
11840 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b  A_SIGN:.....CACK
11850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11860 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
11870 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28  ibute CKA_SIGN (
11880 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
11890 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
118a0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
118b0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
118c0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
118d0 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
118e0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
118f0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
11900 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
11910 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
11920 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
11930 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
11940 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
11950 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
11960 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
11970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11980 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
11990 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
119a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
119b0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
119c0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
119d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
119e0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
119f0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
11a00 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a  KA_SIGN_RECOVER:
11a10 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11a20 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
11a30 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
11a40 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20  KA_SIGN_RECOVER 
11a50 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
11a60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11a70 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
11a80 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72  ....../* We curr
11a90 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  ently only suppo
11aa0 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70  rt "Sign with Ap
11ab0 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70  pendix" */.....p
11ac0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
11ad0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
11ae0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
11af0 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
11b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11b10 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
11b20 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
11b30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
11b40 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
11b50 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
11b60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
11b70 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
11b80 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
11b90 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09  KA_DECRYPT:.....
11ba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11bb0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
11bc0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45  attribute CKA_DE
11bd0 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20  CRYPT (0x%08lx) 
11be0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
11bf0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
11c00 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
11c10 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
11c20 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c  KO_PRIVATE_KEY |
11c30 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d  | objectclass ==
11c40 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
11c50 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
11c60 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
11c70 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
11c80 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
11c90 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
11ca0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
11cb0 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
11cc0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
11cd0 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
11ce0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11cf0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
11d00 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
11d10 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
11d20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
11d30 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
11d40 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
11d50 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
11d60 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
11d70 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49  ..case CKA_SENSI
11d80 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TIVE:.....CACKEY
11d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
11da0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
11db0 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56  ute CKA_SENSITIV
11dc0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
11dd0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11de0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
11df0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
11e00 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
11e10 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
11e20 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
11e30 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
11e40 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
11e50 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
11e60 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
11e70 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
11e80 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
11e90 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
11ea0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
11eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11ec0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
11ed0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
11ee0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11ef0 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
11f00 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
11f10 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11f20 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
11f30 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
11f40 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
11f50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
11f60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
11f70 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
11f80 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
11f90 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
11fa0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11fb0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
11fc0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
11fd0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
11fe0 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
11ff0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
12000 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
12010 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
12020 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
12030 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
12040 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
12050 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
12060 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
12070 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
12080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12090 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
120a0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
120b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
120c0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
120d0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
120e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
120f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
12100 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
12110 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09   CKA_MODULUS:...
12120 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12130 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
12140 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
12150 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78  MODULUS (0x%08lx
12160 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
12170 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
12180 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
12190 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
121a0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
121b0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
121c0 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63  509_to_modulus(c
121d0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
121e0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
121f0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
12200 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
12210 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
12220 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
12230 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
12240 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
12250 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
12260 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
12270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12280 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
12290 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
122a0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
122b0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
122c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
122d0 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ase CKA_PUBLIC_E
122e0 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43  XPONENT:.....CAC
122f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12300 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
12310 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c 49  ribute CKA_PUBLI
12320 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 30  C_EXPONENT (0x%0
12330 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
12340 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
12350 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
12360 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
12370 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
12380 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
12390 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65  = x509_to_expone
123a0 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  nt(certificate, 
123b0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
123c0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
123d0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
123e0 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
123f0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
12400 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
12410 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
12420 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
12430 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
12440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12450 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
12460 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
12470 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
12480 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
12490 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
124a0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
124b0 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09  T_SERVER_AUTH:..
124c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
124d0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
124e0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
124f0 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
12500 54 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  TH (0x%08lx) ...
12510 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
12520 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
12530 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
12540 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
12550 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
12560 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
12570 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12580 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
12590 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
125a0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
125b0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
125c0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
125d0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
125e0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
125f0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
12600 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
12610 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09  _CLIENT_AUTH:...
12620 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12630 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
12640 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
12650 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54  TRUST_CLIENT_AUT
12660 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
12670 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12680 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
12690 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
126a0 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
126b0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
126c0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
126d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
126e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
126f0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
12700 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
12710 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
12720 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
12730 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
12740 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
12750 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
12760 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
12770 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09  CODE_SIGNING:...
12780 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12790 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
127a0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
127b0 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49  TRUST_CODE_SIGNI
127c0 4e 47 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  NG (0x%08lx) ...
127d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
127e0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
127f0 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
12800 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
12810 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
12820 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
12830 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12840 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
12850 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
12860 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
12870 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
12880 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
12890 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
128a0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
128b0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
128c0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
128d0 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f  _EMAIL_PROTECTIO
128e0 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
128f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
12900 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
12910 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c   CKA_TRUST_EMAIL
12920 5f 50 52 4f 54 45 43 54 49 4f 4e 20 28 30 78 25  _PROTECTION (0x%
12930 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
12940 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
12950 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
12960 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
12970 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
12980 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
12990 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
129a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
129b0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
129c0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
129d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
129e0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
129f0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
12a00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
12a10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
12a20 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75  .break;....defau
12a30 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  lt:.....pValue =
12a40 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c   NULL;.....ulVal
12a50 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
12a60 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b  ) -1;.....break;
12a70 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b  ...}....if (((CK
12a80 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65  _LONG) ulValueLe
12a90 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29  n) != ((CK_LONG)
12aa0 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75   -1)) {..../* Pu
12ab0 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74  sh curr_attr ont
12ac0 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09  o the stack */..
12ad0 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65  ..curr_attr.type
12ae0 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70   = curr_attr_typ
12af0 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  e;....curr_attr.
12b00 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
12b10 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72  alueLen;.....cur
12b20 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20  r_attr.pValue = 
12b30 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72  malloc(curr_attr
12b40 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
12b50 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
12b60 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65  r.pValue, pValue
12b70 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  , curr_attr.ulVa
12b80 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  lueLen);.....if 
12b90 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20  (pValue_free && 
12ba0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72  pValue) {.....fr
12bb0 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d  ee(pValue);....}
12bc0 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72  .....if (numattr
12bd0 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e  s >= retval_coun
12be0 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f  t) {.....retval_
12bf0 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09  count *= 2;.....
12c00 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
12c10 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f  (retval, retval_
12c20 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
12c30 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a  retval));....}..
12c40 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61  ...memcpy(&retva
12c50 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75  l[numattrs], &cu
12c60 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28  rr_attr, sizeof(
12c70 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09  curr_attr));....
12c80 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a  numattrs++;...}.
12c90 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72  .}...if (numattr
12ca0 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76  s != 0) {...retv
12cb0 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  al_count = numat
12cc0 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20  trs;...retval = 
12cd0 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20  realloc(retval, 
12ce0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
12cf0 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
12d00 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65  ..} else {...fre
12d10 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  e(retval);....re
12d20 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  tval = NULL;..}.
12d30 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75  ..*pulCount = nu
12d40 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59  mattrs;...CACKEY
12d50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12d60 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a  eturning %lu obj
12d70 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d  ects (%p).", num
12d80 61 74 74 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a  attrs, retval);.
12d90 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
12da0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
12db0 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65   cackey_free_ide
12dc0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
12dd0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
12de0 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69  identities, unsi
12df0 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
12e00 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43  ties_count) {..C
12e10 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
12e20 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65  r_attr;..unsigne
12e30 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61  d long id_idx, a
12e40 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69  ttr_idx;...if (i
12e50 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
12e60 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f  L || identities_
12e70 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
12e80 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
12e90 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64   (id_idx = 0; id
12ea0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65  _idx < identitie
12eb0 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b  s_count; id_idx+
12ec0 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74  +) {...if (ident
12ed0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
12ee0 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66  tributes) {....f
12ef0 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
12f00 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65  ; attr_idx < ide
12f10 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
12f20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
12f30 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
12f40 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
12f50 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
12f60 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61  dx].attributes[a
12f70 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69  ttr_idx];......i
12f80 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  f (curr_attr->pV
12f90 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65  alue) {......fre
12fa0 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  e(curr_attr->pVa
12fb0 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  lue);.....}....}
12fc0 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  .....if (identit
12fd0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
12fe0 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72  ibutes) {.....fr
12ff0 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ee(identities[id
13000 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
13010 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
13020 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64  ey_free_certs(id
13030 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
13040 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20  .pcsc_identity, 
13050 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  1, 1);...}..}...
13060 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 29  free(identities)
13070 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75  ;.}..static stru
13080 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
13090 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
130a0 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
130b0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
130c0 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  lot, unsigned lo
130d0 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b  ng *ids_found) {
130e0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
130f0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
13100 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
13110 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
13120 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
13130 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
13140 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f  ong num_ids, id_
13150 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70  idx, curr_id_typ
13160 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e;..unsigned lon
13170 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 63 65 72  g num_certs, cer
13180 74 5f 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_idx;...CACKEY_
13190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
131a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69  lled.");...if (i
131b0 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c  ds_found == NULL
131c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
131d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
131e0 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20  .  ids_found is 
131f0 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
13200 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 63  n(NULL);..}...pc
13210 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
13220 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
13230 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e  s(slot, NULL, &n
13240 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28  um_certs);..if (
13250 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
13260 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20  != NULL) {.../* 
13270 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f  Convert number o
13280 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65  f Certs to numbe
13290 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  r of objects */.
132a0 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f  ..num_ids = (CKO
132b0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43  _PRIVATE_KEY - C
132c0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b  KO_CERTIFICATE +
132d0 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b   1) * num_certs;
132e0 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d  ....identities =
132f0 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20   malloc(num_ids 
13300 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  * sizeof(*identi
13310 74 69 65 73 29 29 3b 0a 0a 09 09 69 64 5f 69 64  ties));....id_id
13320 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65  x = 0;...for (ce
13330 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74  rt_idx = 0; cert
13340 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73  _idx < num_certs
13350 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
13360 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ...for (curr_id_
13370 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49  type = CKO_CERTI
13380 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f  FICATE; curr_id_
13390 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56  type <= CKO_PRIV
133a0 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64  ATE_KEY; curr_id
133b0 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69  _type++) {.....i
133c0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
133d0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
133e0 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
133f0 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70  utes(curr_id_typ
13400 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74  e, &pcsc_identit
13410 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63  ies[cert_idx], c
13420 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
13430 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
13440 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
13450 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  .....if (identit
13460 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
13470 69 62 75 74 65 73 20 3d 3d 20 4e 55 4c 4c 29 20  ibutes == NULL) 
13480 7b 0a 09 09 09 09 09 69 64 65 6e 74 69 74 69 65  {......identitie
13490 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
134a0 75 74 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  utes_count = 0;.
134b0 09 09 09 09 7d 0a 0a 09 09 09 09 69 64 65 6e 74  ....}......ident
134c0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
134d0 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61  sc_identity = ma
134e0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65  lloc(sizeof(*ide
134f0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
13500 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b  pcsc_identity));
13510 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e  .....memcpy(iden
13520 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
13530 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70  csc_identity, &p
13540 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
13550 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66  ert_idx], sizeof
13560 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  (*identities[id_
13570 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
13580 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74  ty));......ident
13590 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
135a0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
135b0 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
135c0 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  c(pcsc_identitie
135d0 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
135e0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
135f0 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
13600 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
13610 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
13620 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
13630 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
13640 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70  ].certificate, p
13650 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
13660 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
13670 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
13680 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09  id_idx++;....}..
13690 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65  .}....cackey_fre
136a0 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65  e_certs(pcsc_ide
136b0 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72  ntities, num_cer
136c0 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f  ts, 1);....*ids_
136d0 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b  found = num_ids;
136e0 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69  ...return(identi
136f0 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73  ties);..}...*ids
13700 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74  _found = 0;..ret
13710 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b  urn(NULL);.}..CK
13720 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
13730 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61  (CK_RV, C_Initia
13740 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
13750 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09  R pInitArgs) {..
13760 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f  CK_C_INITIALIZE_
13770 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73  ARGS CK_PTR args
13780 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  ;..uint32_t idx;
13790 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74  ..int mutex_init
137a0 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
137b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
137c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
137d0 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29  nitArgs != NULL)
137e0 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69   {...args = pIni
137f0 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28  tArgs;...memcpy(
13800 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72  &cackey_args, ar
13810 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  gs, sizeof(cacke
13820 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20  y_args));....if 
13830 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74  (args->CreateMut
13840 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
13850 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78  gs->DestroyMutex
13860 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
13870 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e  ->LockMutex == N
13880 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c  ULL || args->Unl
13890 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
138a0 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d  ) {....if (args-
138b0 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20  >CreateMutex != 
138c0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
138d0 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55  stroyMutex != NU
138e0 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
138f0 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
13900 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
13910 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex != NULL) {...
13920 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13930 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f  RINTF("Error. So
13940 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20  me, but not All 
13950 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74  threading primit
13960 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29  ives provided.")
13970 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
13980 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
13990 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
139a0 20 28 61 72 67 73 2d 3e 70 52 65 73 65 72 76 65   (args->pReserve
139b0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  d != NULL) {....
139c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
139d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
139e0 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
139f0 4c 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  L.");.....return
13a00 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
13a10 41 44 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  AD);...}..} else
13a20 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73   {...cackey_args
13a30 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e  .CreateMutex = N
13a40 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
13a50 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  gs.DestroyMutex 
13a60 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
13a70 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20  _args.LockMutex 
13a80 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
13a90 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
13aa0 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
13ab0 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20  ey_args.flags = 
13ac0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  0;..}...if (cack
13ad0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
13ae0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13af0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
13b00 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c   Already initial
13b10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
13b20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
13b30 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49  ALREADY_INITIALI
13b40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  ZED);..}...for (
13b50 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
13b60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
13b70 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
13b80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
13b90 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
13ba0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
13bb0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
13bc0 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  0;..}...for (idx
13bd0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
13be0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
13bf0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
13c00 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
13c10 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  x++) {...cackey_
13c20 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76  slots[idx].activ
13c30 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  e = 0;...cackey_
13c40 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
13c50 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
13c60 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
13c70 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
13c80 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b  epth = 0;...cack
13c90 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c  ey_slots[idx].sl
13ca0 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09  ot_reset = 0;...
13cb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
13cc0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ].token_flags = 
13cd0 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
13ce0 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e  s[idx].label = N
13cf0 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
13d00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31  _initialized = 1
13d10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
13d20 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a  biglock_init) {.
13d30 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74  ..mutex_init_ret
13d40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
13d50 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62  create(&cackey_b
13d60 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28  iglock);....if (
13d70 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21  mutex_init_ret !
13d80 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
13d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13da0 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69  rror.  Mutex ini
13db0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c  tialization fail
13dc0 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
13dd0 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29  n(CKR_CANT_LOCK)
13de0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
13df0 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31  biglock_init = 1
13e00 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
13e10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
13e20 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
13e30 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
13e40 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
13e50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
13e60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
13e70 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f  nalize)(CK_VOID_
13e80 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b  PTR pReserved) {
13e90 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a  ..uint32_t idx;.
13ea0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13eb0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
13ec0 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65  ;...if (pReserve
13ed0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d != NULL) {...C
13ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13ef0 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65  TF("Error. pRese
13f00 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rved is not NULL
13f10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
13f20 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
13f30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
13f40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
13f50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13f60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13f70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
13f80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
13f90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
13fa0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
13fb0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
13fc0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
13fd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
13fe0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
13ff0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
14000 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
14010 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
14020 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
14030 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28  .C_CloseSession(
14040 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63  idx);...}..}...c
14050 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
14060 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
14070 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
14080 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
14090 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
140a0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
140b0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
140c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
140d0 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
140e0 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  er) {....free(ca
140f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
14100 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09  pcsc_reader);...
14110 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63  }..}...cackey_pc
14120 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b  sc_disconnect();
14130 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  ...cackey_initia
14140 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43  lized = 0;...CAC
14150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14160 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
14170 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
14180 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
14190 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
141a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
141b0 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f  , C_GetInfo)(CK_
141c0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
141d0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
141e0 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72  8CHAR manufactur
141f0 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47  erID[] = "U.S. G
14200 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61  overnment";..sta
14210 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
14220 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
14230 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b  on[] = "CACKey";
14240 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14250 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
14260 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
14270 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
14280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14290 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
142a0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
142b0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
142c0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
142d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
142e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
142f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
14300 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
14310 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
14320 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
14330 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
14340 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
14350 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e  cryptokiVersion.
14360 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  major = ((CACKEY
14370 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
14380 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26  N_CODE) >> 16) &
14390 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63   0xff;..pInfo->c
143a0 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d  ryptokiVersion.m
143b0 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  inor = ((CACKEY_
143c0 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
143d0 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30  _CODE) >> 8) & 0
143e0 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  xff;...memset(pI
143f0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
14400 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
14410 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
14420 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
14430 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
14440 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
14450 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
14460 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
14470 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  - 1);...pInfo->f
14480 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d  lags = 0x00;...m
14490 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62  emset(pInfo->lib
144a0 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c  raryDescription,
144b0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
144c0 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72  fo->libraryDescr
144d0 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70  iption));..memcp
144e0 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  y(pInfo->library
144f0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62  Description, lib
14500 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c  raryDescription,
14510 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44   sizeof(libraryD
14520 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29  escription) - 1)
14530 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  ;...pInfo->libra
14540 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  ryVersion.major 
14550 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
14560 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
14570 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69  0xff;..pInfo->li
14580 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e  braryVersion.min
14590 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
145a0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
145b0 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59  & 0xff;...CACKEY
145c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
145d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
145e0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
145f0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
14600 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65  ;.}../*. * Proce
14610 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65  ss list of reade
14620 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d  rs, and create m
14630 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72  apping between r
14640 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73  eader name and s
14650 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45  lot ID. */.CK_DE
14660 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
14670 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69  _RV, C_GetSlotLi
14680 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b  st)(CK_BBOOL tok
14690 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c  enPresent, CK_SL
146a0 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c  OT_ID_PTR pSlotL
146b0 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ist, CK_ULONG_PT
146c0 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69  R pulCount) {..i
146d0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
146e0 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65  ..int pcsc_conne
146f0 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e  ct_ret;..CK_ULON
14700 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  G count, slot_co
14710 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f  unt = 0, currslo
14720 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72  t;..char *pcsc_r
14730 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65  eaders, *pcsc_re
14740 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72  aders_s, *pcsc_r
14750 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44  eaders_e;..DWORD
14760 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
14770 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c  n;..LONG scard_l
14780 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a  istreaders_ret;.
14790 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61  .size_t curr_rea
147a0 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45  der_len;...CACKE
147b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
147c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
147d0 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  (pulCount == NUL
147e0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
147f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14800 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  r. pulCount is N
14810 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
14820 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
14830 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
14840 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
14850 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
14860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14870 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
14880 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
14890 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
148a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
148b0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
148c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
148d0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
148e0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
148f0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
14900 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14910 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14920 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
14930 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14940 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
14950 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72  );..}.../* Clear
14960 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a   list of slots *
14970 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  /..if (pSlotList
14980 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14990 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69  UG_PRINTF("Purgi
149a0 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f  ng all slot info
149b0 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f  rmation.");..../
149c0 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
149d0 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
149e0 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
149f0 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20  ly being supply 
14a00 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61  the slot informa
14a10 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
14a20 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
14a30 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20  t_all();....for 
14a40 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63  (currslot = 0; c
14a50 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f  urrslot < (sizeo
14a60 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
14a70 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
14a80 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72  slots[0])); curr
14a90 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20  slot++) {....if 
14aa0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
14ab0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
14ac0 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28  der) {.....free(
14ad0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
14ae0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
14af0 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  er);......cackey
14b00 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
14b10 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
14b20 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ULL;....}.....if
14b30 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
14b40 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20  urrslot].label) 
14b50 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65  {.....free(cacke
14b60 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
14b70 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63  ].label);......c
14b80 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
14b90 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  slot].label = NU
14ba0 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  LL;....}.....cac
14bb0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
14bc0 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  ot].active = 0;.
14bd0 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  ..}..}.../* Dete
14be0 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65  rmine list of re
14bf0 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63  aders */..pcsc_c
14c00 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
14c10 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
14c20 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  ();..if (pcsc_co
14c30 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
14c40 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
14c50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14c60 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
14c70 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c  on to PC/SC fail
14c80 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  ed, assuming no 
14c90 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74  slots");....slot
14ca0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65  _count = 0;..} e
14cb0 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61  lse {...pcsc_rea
14cc0 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09  ders_len = 0;...
14cd0 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  .scard_listreade
14ce0 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69  rs_ret = SCardLi
14cf0 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65  stReaders(*cacke
14d00 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e  y_pcsc_handle, N
14d10 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63  ULL, NULL, &pcsc
14d20 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
14d30 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
14d40 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
14d50 41 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26  ARD_S_SUCCESS &&
14d60 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
14d70 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73  n != 0) {....pcs
14d80 63 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c  c_readers = mall
14d90 6f 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f  oc(pcsc_readers_
14da0 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65  len);....pcsc_re
14db0 61 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72  aders_s = pcsc_r
14dc0 65 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72  eaders;.....scar
14dd0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
14de0 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
14df0 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
14e00 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
14e10 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70  pcsc_readers, &p
14e20 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
14e30 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c  ;....if (scard_l
14e40 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
14e50 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
14e60 53 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65  S) {.....pcsc_re
14e70 61 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72  aders_e = pcsc_r
14e80 65 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65  eaders + pcsc_re
14e90 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09  aders_len;......
14ea0 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c  /* Start with Sl
14eb0 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69  ot ID 1, to avoi
14ec0 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f  d a bug in GDM o
14ed0 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a  n RHEL */...../*
14ee0 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74   Bug 594911: htt
14ef0 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65  ps://bugzilla.re
14f00 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75  dhat.com/show_bu
14f10 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20  g.cgi?id=594911 
14f20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20  */.....currslot 
14f30 3d 20 31 3b 0a 09 09 09 09 77 68 69 6c 65 20 28  = 1;.....while (
14f40 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70  pcsc_readers < p
14f50 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
14f60 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65  ......curr_reade
14f70 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  r_len = strlen(p
14f80 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
14f90 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65  ....if ((pcsc_re
14fa0 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61  aders + curr_rea
14fb0 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f  der_len) > pcsc_
14fc0 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
14fd0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
14fe0 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  .......if (curr_
14ff0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29  reader_len == 0)
15000 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
15010 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
15020 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69  (currslot >= (si
15030 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
15040 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
15050 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
15060 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
15070 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
15080 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74  d more readers t
15090 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76  han slots are av
150a0 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09  ailable!");.....
150b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
150c0 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
150d0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
150e0 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70  d reader: %s", p
150f0 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
15100 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61  ..../* Only upda
15110 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  te the list of s
15120 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61  lots if we are a
15130 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73  ctually being as
15140 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73  ked supply the s
15150 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
15160 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f  */......if (pSlo
15170 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 63  tList) {.......c
15180 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
15190 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31  slot].active = 1
151a0 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
151b0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
151c0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72  csc_reader = str
151d0 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72 73  dup(pcsc_readers
151e0 29 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  );.......cackey_
151f0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
15200 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
15210 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 63  ted = 0;.......c
15220 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
15230 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f  slot].transactio
15240 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09  n_depth = 0;....
15250 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
15260 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72  currslot].slot_r
15270 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 09 09  eset = 1;.......
15280 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
15290 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  rslot].token_fla
152a0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
152b0 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 63  EQUIRED;.......c
152c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
152d0 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  slot].label = NU
152e0 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09  LL;......}......
152f0 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09  currslot++;.....
15300 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
15310 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
15320 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09  n + 1;.....}....
15330 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20  ../* Start with 
15340 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76  Slot ID 1, to av
15350 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d  oid a bug in GDM
15360 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09   on RHEL */.....
15370 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68  /* Bug 594911: h
15380 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
15390 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f  redhat.com/show_
153a0 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31  bug.cgi?id=59491
153b0 31 20 2a 2f 0a 09 09 09 09 69 66 20 28 63 75 72  1 */.....if (cur
153c0 72 73 6c 6f 74 20 3e 20 31 29 20 7b 0a 09 09 09  rslot > 1) {....
153d0 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20  ../* Start with 
153e0 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76  Slot ID 1, to av
153f0 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d  oid a bug in GDM
15400 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09   on RHEL */.....
15410 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
15420 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
15430 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
15440 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
15450 31 31 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 5f  11 */......slot_
15460 63 6f 75 6e 74 20 3d 20 63 75 72 72 73 6c 6f 74  count = currslot
15470 20 2d 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09 7d   - 1;.....}....}
15480 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
15490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
154a0 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20  "Second call to 
154b0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
154c0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
154d0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
154e0 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
154f0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
15500 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
15510 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
15520 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
15530 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28  ;....}.....free(
15540 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b  pcsc_readers_s);
15550 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
15560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15570 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74  TF("First call t
15580 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
15590 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
155a0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
155b0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
155c0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
155d0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
155e0 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
155f0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
15600 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  t);...}..}...mut
15610 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
15620 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
15630 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
15640 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
15650 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
15660 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15670 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
15680 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
15690 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
156a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
156b0 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20  ..if (pSlotList 
156c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
156d0 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
156e0 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  unt;....CACKEY_D
156f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15700 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
15710 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
15720 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
15730 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70  ..}...count = *p
15740 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f  ulCount;..if (co
15750 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt < slot_count
15760 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15770 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15780 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
15790 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
157a0 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e  t we have %lu en
157b0 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20  tries.", count, 
157c0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  slot_count);....
157d0 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
157e0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09  R_TOO_SMALL);...
157f0 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  }...for (currslo
15800 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20  t = 0; currslot 
15810 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75  < slot_count; cu
15820 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 2f 2a  rrslot++) {.../*
15830 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74   Start with Slot
15840 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20   ID 1, to avoid 
15850 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20  a bug in GDM on 
15860 52 48 45 4c 20 2a 2f 0a 09 09 2f 2a 20 42 75 67  RHEL */.../* Bug
15870 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f   594911: https:/
15880 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74  /bugzilla.redhat
15890 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67  .com/show_bug.cg
158a0 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09  i?id=594911 */..
158b0 09 70 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73  .pSlotList[currs
158c0 6c 6f 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74 20  lot] = currslot 
158d0 2b 20 31 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f  + 1;..}...*pulCo
158e0 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt = slot_count
158f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
15900 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
15910 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
15920 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
15930 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75  rs.", CKR_OK, (u
15940 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c  nsigned long) sl
15950 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ot_count);...ret
15960 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74  urn(CKR_OK);...t
15970 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f  okenPresent = to
15980 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53  kenPresent; /* S
15990 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
159a0 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
159b0 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  /.}..CK_DEFINE_F
159c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
159d0 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b  _GetSlotInfo)(CK
159e0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
159f0 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54   CK_SLOT_INFO_PT
15a00 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
15a10 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 73  ic CK_UTF8CHAR s
15a20 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d  lotDescription[]
15a30 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 22   = "CACKey Slot"
15a40 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
15a50 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f  val;..int bytes_
15a60 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45  to_copy;...CACKE
15a70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15a80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
15a90 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
15aa0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15ab0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15ac0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
15ad0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
15ae0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
15af0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
15b00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
15b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15b20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
15b30 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
15b40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15b50 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
15b60 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
15b70 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
15b80 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
15b90 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
15ba0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
15bb0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
15bc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15bd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
15be0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
15bf0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
15c00 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
15c10 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
15c20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
15c30 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
15c40 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
15c50 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
15c60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15c70 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
15c80 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
15c90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15ca0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
15cb0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
15cc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
15cd0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
15ce0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
15cf0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
15d00 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
15d10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15d20 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
15d30 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
15d40 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
15d50 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
15d60 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
15d70 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
15d80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15d90 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
15da0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
15db0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  LID);..}...pInfo
15dc0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45  ->flags = CKF_RE
15dd0 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 20 7c  MOVABLE_DEVICE |
15de0 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09   CKF_HW_SLOT;...
15df0 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
15e00 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
15e10 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
15e20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  == CACKEY_PCSC_S
15e30 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
15e40 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
15e50 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45  |= CKF_TOKEN_PRE
15e60 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73  SENT;..}...bytes
15e70 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65  _to_copy = strle
15e80 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  n(cackey_slots[s
15e90 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
15ea0 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66  er);..if (sizeof
15eb0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
15ec0 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f  urerID) < bytes_
15ed0 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74  to_copy) {...byt
15ee0 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a  es_to_copy = siz
15ef0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
15f00 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09  acturerID);..}..
15f10 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
15f20 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61  nufacturerID, ca
15f30 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
15f40 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  D].pcsc_reader, 
15f50 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a  bytes_to_copy);.
15f60 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
15f70 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
15f80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15f90 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
15fa0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
15fb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15fc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
15fd0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
15fe0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
15ff0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
16000 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
16010 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
16020 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f  tion, ' ', sizeo
16030 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  f(pInfo->slotDes
16040 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
16050 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  cpy(pInfo->slotD
16060 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74  escription, slot
16070 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
16080 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74  eof(slotDescript
16090 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  ion) - 1);...mem
160a0 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
160b0 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
160c0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
160d0 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
160e0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
160f0 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
16100 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
16110 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
16120 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
16130 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
16140 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
16150 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
16160 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
16170 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
16180 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
16190 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
161a0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
161b0 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  x00;...CACKEY_DE
161c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
161d0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
161e0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
161f0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
16200 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
16210 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
16220 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53  tTokenInfo)(CK_S
16230 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
16240 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52  K_TOKEN_INFO_PTR
16250 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
16260 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
16270 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
16280 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
16290 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
162a0 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c  TF8CHAR defaultL
162b0 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77  abel[] = "Unknow
162c0 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69  n Token";..stati
162d0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f  c CK_UTF8CHAR mo
162e0 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b  del[] = "CAC Tok
162f0 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63  en";..struct cac
16300 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
16310 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
16320 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  es;..unsigned lo
16330 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73  ng num_certs;..s
16340 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74  size_t label_ret
16350 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
16360 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65  val;..int use_de
16370 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43  fault_label;...C
16380 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16390 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
163a0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
163b0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
163c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
163d0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
163e0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
163f0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
16400 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
16410 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
16420 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16430 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
16440 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
16450 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
16460 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
16470 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
16480 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
16490 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
164a0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
164b0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
164c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
164d0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
164e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
164f0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
16500 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
16510 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
16520 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
16530 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
16540 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
16550 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
16560 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
16570 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
16580 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
16590 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
165a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
165b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
165c0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
165d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
165e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
165f0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
16600 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
16610 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
16620 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16630 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
16640 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
16650 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
16660 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
16670 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
16680 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
16690 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
166a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
166b0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
166c0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
166d0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
166e0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
166f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
16700 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
16710 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
16720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16730 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20  RINTF("No token 
16740 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c  is present in sl
16750 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f  otID = %lu", slo
16760 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
16770 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
16780 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
16790 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
167a0 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a  N_NOT_PRESENT);.
167b0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
167c0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
167d0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
167e0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
167f0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
16800 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16810 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16820 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
16830 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
16840 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
16850 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  OR);..}.../* Det
16860 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62  ermine token lab
16870 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63  el from certific
16880 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28  ates */..memset(
16890 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20  pInfo->label, ' 
168a0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
168b0 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64  >label));..use_d
168c0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31  efault_label = 1
168d0 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ;...if (cackey_s
168e0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
168f0 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el == NULL) {...
16900 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
16910 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
16920 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  rts(&cackey_slot
16930 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c  s[slotID], NULL,
16940 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09   &num_certs);...
16950 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
16960 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
16970 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
16980 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c  > 0) {.....label
16990 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
169a0 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
169b0 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69  abel(pcsc_identi
169c0 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62  ties, pInfo->lab
169d0 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
169e0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69  ->label));.....i
169f0 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30  f (label_ret > 0
16a00 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66  ) {......use_def
16a10 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
16a20 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
16a30 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
16a40 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
16a50 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
16a60 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61  .......memcpy(ca
16a70 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
16a80 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d  D].label, pInfo-
16a90 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
16aa0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
16ab0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
16ac0 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
16ad0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
16ae0 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a   num_certs, 1);.
16af0 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
16b00 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
16b10 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  bel, cackey_slot
16b20 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
16b30 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
16b40 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64  abel));....use_d
16b50 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
16b60 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64  ;..}...if (use_d
16b70 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a  efault_label) {.
16b80 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
16b90 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61  label, defaultLa
16ba0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61  bel, sizeof(defa
16bb0 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a  ultLabel) - 1);.
16bc0 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
16bd0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
16be0 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
16bf0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
16c00 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
16c10 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
16c20 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
16c30 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
16c40 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
16c50 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
16c60 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20  fo->model, ' ', 
16c70 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f  sizeof(pInfo->mo
16c80 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  del));..memcpy(p
16c90 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64  Info->model, mod
16ca0 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c  el, sizeof(model
16cb0 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
16cc0 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
16cd0 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f  mber, ' ', sizeo
16ce0 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  f(pInfo->serialN
16cf0 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65  umber));...memse
16d00 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  t(pInfo->utcTime
16d10 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
16d20 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a  nfo->utcTime));.
16d30 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
16d40 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
16d50 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
16d60 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
16d70 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
16d80 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
16d90 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
16da0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
16db0 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
16dc0 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
16dd0 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
16de0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
16df0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
16e00 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c  x00;...pInfo->fl
16e10 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f  ags = CKF_WRITE_
16e20 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f  PROTECTED | CKF_
16e30 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c  USER_PIN_INITIAL
16e40 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e  IZED | CKF_TOKEN
16e50 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63  _INITIALIZED | c
16e60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
16e70 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  ID].token_flags;
16e80 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53  ...pInfo->ulMaxS
16e90 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73  essionCount = (s
16ea0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
16eb0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
16ec0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
16ed0 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f  0])) - 1;..pInfo
16ee0 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ->ulSessionCount
16ef0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
16f00 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
16f10 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65  pInfo->ulMaxRwSe
16f20 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a  ssionCount = 0;.
16f30 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73  .pInfo->ulRwSess
16f40 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
16f50 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
16f60 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
16f70 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38  lMaxPinLen = 128
16f80 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50  ;..pInfo->ulMinP
16f90 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66  inLen = 0;..pInf
16fa0 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63  o->ulTotalPublic
16fb0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
16fc0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
16fd0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
16fe0 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  reePublicMemory 
16ff0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
17000 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
17010 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69  Info->ulTotalPri
17020 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
17030 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
17040 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
17050 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65  >ulFreePrivateMe
17060 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
17070 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
17080 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  N;...CACKEY_DEBU
17090 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
170a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
170b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
170c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
170d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
170e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74  ON(CK_RV, C_Wait
170f0 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b  ForSlotEvent)(CK
17100 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
17110 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
17120 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  otID, CK_VOID_PT
17130 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
17140 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17150 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
17160 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
17170 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
17180 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17190 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
171a0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
171b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
171c0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
171d0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
171e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
171f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17200 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17210 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
17220 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17230 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
17240 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
17250 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17260 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
17270 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
17280 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
17290 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
172a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
172b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
172c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
172d0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
172e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
172f0 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
17300 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49  mList)(CK_SLOT_I
17310 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
17320 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20  HANISM_TYPE_PTR 
17330 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20  pMechanismList, 
17340 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
17350 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59  Count) {..CACKEY
17360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
17370 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
17380 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
17390 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
173a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
173b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
173c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
173d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
173e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
173f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43  );..}...if (pulC
17400 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
17410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17420 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
17430 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ulCount is NULL.
17440 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17450 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
17460 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
17470 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c  anismList == NUL
17480 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74  L) {...*pulCount
17490 20 3d 20 33 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   = 3;....CACKEY_
174a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
174b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
174c0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
174d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
174e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43  ;..}...if (*pulC
174f0 6f 75 6e 74 20 3c 20 33 29 20 7b 0a 09 09 43 41  ount < 3) {...CA
17500 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17510 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65  F("Error.  Buffe
17520 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a  r too small.");.
17530 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55  ...return(CKR_BU
17540 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b  FFER_TOO_SMALL);
17550 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d  ..}...pMechanism
17560 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53  List[0] = CKM_RS
17570 41 5f 50 4b 43 53 3b 0a 09 70 4d 65 63 68 61 6e  A_PKCS;..pMechan
17580 69 73 6d 4c 69 73 74 5b 31 5d 20 3d 20 43 4b 4d  ismList[1] = CKM
17590 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3b 0a  _SHA1_RSA_PKCS;.
175a0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 32 3b 0a  .*pulCount = 2;.
175b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
175c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
175d0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
175e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
175f0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
17600 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
17610 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
17620 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c  anismInfo)(CK_SL
17630 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
17640 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20  _MECHANISM_TYPE 
17650 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  type, CK_MECHANI
17660 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  SM_INFO_PTR pInf
17670 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  o) {..int mutex_
17680 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
17690 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
176a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
176b0 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
176c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
176d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
176e0 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
176f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
17700 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
17710 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
17720 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
17730 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17740 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
17750 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
17760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17770 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
17780 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
17790 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
177a0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
177b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
177c0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
177d0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
177e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
177f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
17800 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
17810 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
17820 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
17830 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
17840 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
17850 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
17860 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
17870 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
17880 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
17890 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
178a0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
178b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
178c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
178d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
178e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
178f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
17900 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
17910 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
17920 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
17930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17940 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
17950 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
17960 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
17970 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
17980 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
17990 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
179a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
179b0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
179c0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
179d0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
179e0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
179f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
17a00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
17a10 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
17a20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
17a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17a40 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
17a50 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
17a60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
17a70 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f  L_ERROR);..}.../
17a80 2a 20 58 58 58 3a 20 54 68 69 73 20 69 73 20 75  * XXX: This is u
17a90 6e 74 65 73 74 65 64 2c 20 61 6e 64 20 66 75 72  ntested, and fur
17aa0 74 68 65 72 20 49 27 6d 20 6e 6f 74 20 72 65 61  ther I'm not rea
17ab0 6c 6c 79 20 73 75 72 65 20 69 66 20 74 68 69 73  lly sure if this
17ac0 20 69 73 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a   is correct. */.
17ad0 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20 7b  .switch (type) {
17ae0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
17af0 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e  PKCS:....pInfo->
17b00 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35  ulMinKeySize = 5
17b10 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  12;....pInfo->ul
17b20 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39  MaxKeySize = 819
17b30 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  2;....pInfo->fla
17b40 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b  gs = CKF_HW | CK
17b50 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f  F_ENCRYPT | CKF_
17b60 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49  DECRYPT | CKF_SI
17b70 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b  GN | CKF_VERIFY;
17b80 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
17b90 65 20 43 4b 4d 5f 52 53 41 5f 58 5f 35 30 39 3a  e CKM_RSA_X_509:
17ba0 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e  ....pInfo->ulMin
17bb0 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09  KeySize = 512;..
17bc0 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65  ..pInfo->ulMaxKe
17bd0 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09  ySize = 8192;...
17be0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
17bf0 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43  CKF_HW | CKF_ENC
17c00 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59  RYPT | CKF_DECRY
17c10 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20  PT | CKF_SIGN | 
17c20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62  CKF_VERIFY;....b
17c30 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d  reak;...case CKM
17c40 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a  _SHA1_RSA_PKCS:.
17c50 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b  ...pInfo->ulMinK
17c60 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09  eySize = 512;...
17c70 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79  .pInfo->ulMaxKey
17c80 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09  Size = 8192;....
17c90 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
17ca0 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 53 49 47 4e  KF_HW | CKF_SIGN
17cb0 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09   | CKF_VERIFY;..
17cc0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41  ..break;..}...CA
17cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17ce0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
17cf0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
17d00 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
17d10 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  _OK);.}../* We d
17d20 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
17d30 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
17d40 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
17d50 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b  CK_RV, C_InitTok
17d60 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  en)(CK_SLOT_ID s
17d70 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48  lotID, CK_UTF8CH
17d80 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
17d90 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20  ULONG ulPinLen, 
17da0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
17db0 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45  pLabel) {..CACKE
17dc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17dd0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
17de0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
17df0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
17e00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17e10 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
17e20 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
17e30 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
17e40 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
17e50 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
17e60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17e70 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45  turning CKR_TOKE
17e80 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
17e90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b  D (%i)", CKR_TOK
17ea0 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
17eb0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
17ec0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
17ed0 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  OTECTED);.}../* 
17ee0 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
17ef0 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
17f00 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
17f10 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
17f20 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tPIN)(CK_SESSION
17f30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
17f40 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
17f50 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
17f60 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41   ulPinLen) {..CA
17f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17f80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
17f90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
17fa0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
17fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17fc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
17fd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
17fe0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
17ff0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
18000 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
18010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18020 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
18030 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
18040 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
18050 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
18060 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
18070 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
18080 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
18090 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
180a0 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
180b0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
180c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
180d0 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49  SetPIN)(CK_SESSI
180e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
180f0 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  on, CK_UTF8CHAR_
18100 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f  PTR pOldPin, CK_
18110 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65  ULONG ulOldPinLe
18120 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
18130 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55  TR pNewPin, CK_U
18140 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e  LONG ulNewPinLen
18150 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
18160 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
18170 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
18180 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
18190 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
181a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
181b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
181c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
181d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
181e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
181f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18200 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
18210 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
18220 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
18230 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
18240 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
18250 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
18260 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
18270 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
18280 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
18290 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f  RV, C_OpenSessio
182a0 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  n)(CK_SLOT_ID sl
182b0 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66  otID, CK_FLAGS f
182c0 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  lags, CK_VOID_PT
182d0 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20  R pApplication, 
182e0 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79  CK_NOTIFY notify
182f0 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  , CK_SESSION_HAN
18300 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f  DLE_PTR phSessio
18310 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
18320 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ong idx;..int mu
18330 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
18340 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d   found_session =
18350 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
18360 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
18370 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61  d.");...if ((fla
18380 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f  gs & CKF_SERIAL_
18390 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f  SESSION) != CKF_
183a0 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20  SERIAL_SESSION) 
183b0 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  {...return(CKR_S
183c0 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f  ESSION_PARALLEL_
183d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
183e0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
183f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
18400 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18410 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
18420 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
18430 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18440 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
18450 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
18460 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
18470 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
18480 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
18490 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
184a0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
184b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
184c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
184d0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
184e0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
184f0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
18500 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
18510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
18520 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
18530 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
18540 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
18550 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
18560 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
18570 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
18580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18590 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
185a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
185b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
185c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
185d0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
185e0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
185f0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
18600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18610 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
18620 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
18630 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
18640 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
18650 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
18660 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
18670 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
18680 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
18690 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
186a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65  LID);..}.../* Ve
186b0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61  rify that the ca
186c0 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69  rd is actually i
186d0 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09  n the slot. */..
186e0 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f  /* XXX: Check to
186f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
18700 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31  is in the PKCS#1
18710 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  1 specification 
18720 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  */..if (cackey_t
18730 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
18740 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
18750 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  D]) != CACKEY_PC
18760 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
18770 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
18780 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18790 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65  r.  Card not pre
187a0 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  sent.  Returning
187b0 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
187c0 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  VED");....cackey
187d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
187e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
187f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56  ..return(CKR_DEV
18800 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d  ICE_REMOVED);..}
18810 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b  ...for (idx = 1;
18820 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
18830 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
18840 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
18850 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
18860 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  dx++) {...if (!c
18870 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
18880 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
18890 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d  .found_session =
188a0 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69   1;.....*phSessi
188b0 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61  on = idx;.....ca
188c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
188d0 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  x].active = 1;..
188e0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
188f0 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20  s[idx].slotID = 
18900 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65  slotID;....cacke
18910 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
18920 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
18930 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09  UBLIC_SESSION;..
18940 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18950 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66  s[idx].flags = f
18960 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f  lags;....cackey_
18970 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c  sessions[idx].ul
18980 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b  DeviceError = 0;
18990 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
189a0 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63  ons[idx].pApplic
189b0 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61  ation = pApplica
189c0 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f  tion;....cackey_
189d0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f  sessions[idx].No
189e0 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a  tify = notify;..
189f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
18a00 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
18a10 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
18a20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
18a30 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
18a40 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  unt = 0;.....cac
18a50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
18a60 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
18a70 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
18a80 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69  sessions[idx].si
18a90 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  gn_active = 0;..
18aa0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
18ab0 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f  ns[idx].decrypt_
18ac0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
18ad0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18ae0 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
18af0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64  = cackey_read_id
18b00 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79  entities(&cackey
18b10 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
18b20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
18b30 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
18b40 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72  _count);......br
18b50 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  eak;...}..}...mu
18b60 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
18b70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
18b80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
18b90 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
18ba0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
18bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18bc0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
18bd0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
18be0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
18bf0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
18c00 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65  ...if (!found_se
18c10 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45  ssion) {...CACKE
18c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18c30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45  Returning CKR_SE
18c40 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29  SSION_COUNT (%i)
18c50 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ", CKR_SESSION_C
18c60 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e  OUNT);....return
18c70 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55  (CKR_SESSION_COU
18c80 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
18c90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18ca0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
18cb0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
18cc0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
18cd0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
18ce0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
18cf0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43  _CloseSession)(C
18d00 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
18d10 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e   hSession) {..in
18d20 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
18d30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18d40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
18d50 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
18d60 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
18d70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18d80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
18d90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
18da0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18db0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
18dc0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
18dd0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
18de0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
18df0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
18e00 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
18e10 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
18e20 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
18e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18e40 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
18e50 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
18e60 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
18e70 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
18e80 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
18e90 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
18ea0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
18eb0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18ec0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
18ed0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
18ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18ef0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
18f00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
18f10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
18f20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
18f30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
18f40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
18f50 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
18f60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
18f70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
18f80 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
18f90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18fa0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
18fb0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
18fc0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
18fd0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
18fe0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
18ff0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
19000 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61  .active = 0;..ca
19010 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
19020 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73  ties(cackey_sess
19030 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
19040 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65  dentities, cacke
19050 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19060 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
19070 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f  count);...mutex_
19080 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
19090 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
190a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
190b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
190c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
190d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
190e0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
190f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
19100 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
19110 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
19120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19130 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
19140 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
19150 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
19160 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
19170 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
19180 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  RV, C_CloseAllSe
19190 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f  ssions)(CK_SLOT_
191a0 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69  ID slotID) {..ui
191b0 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74  nt32_t idx;..int
191c0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
191d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
191e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
191f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
19200 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
19210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
19230 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
19240 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
19250 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
19260 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
19270 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
19280 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
19290 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
192a0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
192b0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
192c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
192d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
192e0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
192f0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
19300 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
19310 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
19320 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
19330 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
19340 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
19350 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
19360 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
19370 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
19380 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
19390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
193a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
193b0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
193c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
193d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
193e0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
193f0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
19400 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
19410 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19420 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
19430 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
19440 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
19450 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
19460 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
19470 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
19480 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
19490 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
194a0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
194b0 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
194c0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
194d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
194e0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
194f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
19500 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
19510 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
19520 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
19530 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
19540 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
19550 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29  lotID != slotID)
19560 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
19570 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
19580 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
19590 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
195a0 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
195b0 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79  (idx);....cackey
195c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
195d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d  ey_biglock);...}
195e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
195f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
19600 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
19610 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
19620 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
19630 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19640 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19650 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
19660 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
19670 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
19680 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
19690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
196a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
196b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
196c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
196d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
196e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
196f0 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
19700 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
19710 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
19720 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54  _SESSION_INFO_PT
19730 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
19740 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
19750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19760 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
19770 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
19780 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
19790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
197a0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
197b0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
197c0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
197d0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
197e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
197f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
19800 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19810 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
19820 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
19830 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
19840 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
19850 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
19860 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
19870 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
19880 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
19890 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
198a0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
198b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
198c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
198d0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
198e0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
198f0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
19900 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
19910 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
19920 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
19930 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
19940 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
19950 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
19960 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19970 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19980 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
19990 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
199a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
199b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
199c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
199d0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
199e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
199f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
19a00 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
19a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19a20 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
19a30 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
19a40 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
19a50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
19a60 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
19a70 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63  fo->slotID = cac
19a80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19a90 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09  ssion].slotID;..
19aa0 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63  pInfo->state = c
19ab0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19ac0 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a  Session].state;.
19ad0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
19ae0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19af0 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b  hSession].flags;
19b00 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63  ..pInfo->ulDevic
19b10 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f  eError = cackey_
19b20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
19b30 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  n].ulDeviceError
19b40 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
19b50 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
19b60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
19b70 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
19b80 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
19b90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19ba0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19bb0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
19bc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19bd0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
19be0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
19bf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19c00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
19c10 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
19c20 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
19c30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
19c40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
19c50 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
19c60 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
19c70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
19c80 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
19c90 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
19ca0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72  LONG_PTR pulOper
19cb0 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b  ationStateLen) {
19cc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19cd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
19ce0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
19cf0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
19d00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19d10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
19d20 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
19d30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19d40 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
19d50 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
19d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19d70 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
19d80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
19d90 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
19da0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
19db0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
19dc0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
19dd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
19de0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
19df0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
19e00 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_SetOperationS
19e10 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
19e20 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
19e30 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
19e40 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
19e50 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74  K_ULONG ulOperat
19e60 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f  ionStateLen, CK_
19e70 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45  OBJECT_HANDLE hE
19e80 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b  ncryptionKey, CK
19e90 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
19ea0 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65  AuthenticationKe
19eb0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
19ec0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
19ed0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
19ee0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
19ef0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19f00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19f10 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
19f20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19f30 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
19f40 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
19f50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
19f60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19f70 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
19f80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
19f90 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
19fa0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
19fb0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
19fc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
19fd0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
19fe0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
19ff0 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b  _RV, C_Login)(CK
1a000 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1a010 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45  hSession, CK_USE
1a020 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c  R_TYPE userType,
1a030 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
1a040 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
1a050 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f  ulPinLen) {..CK_
1a060 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
1a070 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1a080 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65  l;..int tries_re
1a090 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f  maining;..int lo
1a0a0 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  gin_ret;...CACKE
1a0b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a0c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1a0d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1a0e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1a0f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a100 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1a110 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a120 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a130 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1a140 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1a150 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1a160 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1a170 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1a180 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1a190 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1a1a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a1b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a1c0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1a1d0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1a1e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1a1f0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1a200 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73  ID);..}...if (us
1a210 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53  erType != CKU_US
1a220 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ER) {...CACKEY_D
1a230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a240 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70  or.  We only sup
1a250 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20  port USER mode, 
1a260 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f  asked for %lu mo
1a270 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  de.", (unsigned 
1a280 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a  long) userType).
1a290 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53  ...return(CKR_US
1a2a0 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  ER_TYPE_INVALID)
1a2b0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1a2c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1a2d0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1a2e0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1a2f0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1a300 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a310 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a320 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1a330 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a340 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1a350 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1a360 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1a370 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
1a380 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1a390 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1a3a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1a3b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a3c0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1a3d0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1a3e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1a3f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1a400 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  VALID);..}...slo
1a410 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
1a420 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a430 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
1a440 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
1a450 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
1a460 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1a470 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1a480 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1a490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a4a0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1a4b0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1a4c0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
1a4d0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
1a4e0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
1a4f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1a500 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
1a510 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1a520 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
1a530 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a540 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a550 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1a560 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
1a570 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
1a580 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
1a590 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1a5a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1a5b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1a5c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1a5d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c  L_ERROR);..}...l
1a5e0 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  ogin_ret = cacke
1a5f0 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f  y_login(&cackey_
1a600 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70  slots[slotID], p
1a610 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26  Pin, ulPinLen, &
1a620 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29  tries_remaining)
1a630 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ;..if (login_ret
1a640 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1a650 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79  S_OK) {...cackey
1a660 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1a670 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1a680 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  ..if (login_ret 
1a690 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
1a6a0 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41  _LOCKED) {....CA
1a6b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a6c0 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e  F("Error.  Token
1a6d0 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a   is locked.");..
1a6e0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1a6f0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1a700 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
1a710 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09  PIN_LOCKED;.....
1a720 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c  return(CKR_PIN_L
1a730 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65  OCKED);...} else
1a740 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d   if (login_ret =
1a750 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
1a760 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43  BADPIN) {....CAC
1a770 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a780 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69  ("Error.  Invali
1a790 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61  d PIN.");.....ca
1a7a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1a7b0 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
1a7c0 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  = CKF_USER_PIN_C
1a7d0 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66  OUNT_LOW;.....if
1a7e0 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e   (tries_remainin
1a7f0 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61  g == 1) {.....ca
1a800 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1a810 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
1a820 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46  = CKF_USER_PIN_F
1a830 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a  INAL_TRY;....}..
1a840 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
1a850 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
1a860 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
1a870 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a880 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20    Unknown error 
1a890 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61  returned from ca
1a8a0 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69  ckey_login() (%i
1a8b0 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a  )", login_ret);.
1a8c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1a8d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1a8e0 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1a8f0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1a900 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45  ags &= ~(CKF_USE
1a910 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43  R_PIN_LOCKED | C
1a920 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
1a930 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49  T_LOW | CKF_LOGI
1a940 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46  N_REQUIRED | CKF
1a950 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
1a960 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  TRY);...cackey_s
1a970 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1a980 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
1a990 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b  _USER_FUNCTIONS;
1a9a0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1a9b0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1a9c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1a9d0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1a9e0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1a9f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1aa00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1aa10 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1aa20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1aa30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1aa40 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1aa50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1aa60 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1aa70 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1aa80 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1aa90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1aaa0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
1aab0 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f  ogout)(CK_SESSIO
1aac0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1aad0 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  n) {..CK_SLOT_ID
1aae0 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
1aaf0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
1ab00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ab10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1ab20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1ab30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1ab40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ab50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1ab60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1ab70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1ab80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1ab90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1aba0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1abb0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1abc0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1abd0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1abe0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1abf0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1ac00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ac10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1ac20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1ac30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ac40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1ac50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1ac60 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1ac70 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1ac80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1ac90 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1aca0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1acb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1acc0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1acd0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1ace0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1acf0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1ad00 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1ad10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1ad20 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1ad30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ad40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1ad50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ad60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1ad70 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1ad80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1ad90 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1ada0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1adb0 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
1adc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1add0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
1ade0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
1adf0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
1ae00 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ae10 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1ae20 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
1ae30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ae40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1ae50 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1ae60 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
1ae70 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
1ae80 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
1ae90 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1aea0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1aeb0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1aec0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
1aed0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1aee0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1aef0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1af00 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1af10 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
1af20 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
1af30 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1af40 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1af50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1af60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1af70 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1af80 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
1af90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1afa0 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55  tate = CKS_RO_PU
1afb0 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63  BLIC_SESSION;..c
1afc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1afd0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
1afe0 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
1aff0 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  IRED;...mutex_re
1b000 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1b010 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1b020 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1b030 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1b040 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1b050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b060 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1b070 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1b080 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1b090 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1b0a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b0b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1b0c0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1b0d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1b0e0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1b0f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1b100 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  , C_CreateObject
1b110 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1b120 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1b130 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
1b140 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
1b150 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
1b160 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
1b170 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41   phObject) {..CA
1b180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b190 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1b1a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1b1b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1b1c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b1d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1b1e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1b1f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1b200 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1b210 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1b220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b230 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1b240 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1b250 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1b260 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1b270 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1b280 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1b290 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1b2a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1b2b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
1b2c0 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  opyObject)(CK_SE
1b2d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1b2e0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
1b2f0 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
1b300 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
1b310 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
1b320 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
1b330 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
1b340 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29  PTR phNewObject)
1b350 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1b360 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1b370 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1b380 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1b390 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b3a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1b3b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1b3c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b3d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1b3e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1b3f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b400 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1b410 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1b420 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1b430 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1b440 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1b450 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1b460 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1b470 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1b480 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1b490 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  V, C_DestroyObje
1b4a0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
1b4b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1b4c0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1b4d0 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43   hObject) {..CAC
1b4e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b4f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1b500 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1b510 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1b520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b530 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1b540 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1b550 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1b560 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1b570 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1b580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b590 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1b5a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1b5b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1b5c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b5d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1b5e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1b5f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1b600 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1b610 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1b620 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f  tObjectSize)(CK_
1b630 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1b640 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1b650 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1b660 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1b670 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b  pulSize) {..CACK
1b680 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b690 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1b6a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1b6b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1b6c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b6d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1b6e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1b6f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1b700 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1b710 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1b720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b730 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1b740 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1b750 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1b760 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1b770 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1b780 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1b790 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1b7a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1b7b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1b7c0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28  AttributeValue)(
1b7d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1b7e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1b7f0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1b800 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
1b810 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
1b820 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
1b830 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42  nt) {..CK_ATTRIB
1b840 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
1b850 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
1b860 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
1b870 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y;..unsigned lon
1b880 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  g identity_idx, 
1b890 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
1b8a0 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73  ttr_idx, num_ids
1b8b0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1b8c0 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  val;..CK_RV retv
1b8d0 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b  al = CKR_OK;..CK
1b8e0 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65  _VOID_PTR pValue
1b8f0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61  ;..CK_ULONG ulVa
1b900 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59  lueLen;...CACKEY
1b910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1b920 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1b930 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1b940 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1b950 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b960 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1b970 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1b980 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1b990 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1b9a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1b9b0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1b9c0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1b9d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1b9e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1b9f0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1ba00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ba10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ba20 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1ba30 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1ba40 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1ba50 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1ba60 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62  D);..}...if (hOb
1ba70 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43  ject == 0) {...C
1ba80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ba90 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
1baa0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
1bab0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1bac0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
1bad0 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
1bae0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f  );..}...if (ulCo
1baf0 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
1bb00 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
1bb10 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
1bb20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
1bb30 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
1bb40 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
1bb50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bb60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1bb70 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
1bb80 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
1bb90 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
1bba0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1bbb0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d  if (pTemplate ==
1bbc0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1bbd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bbe0 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74  Error.  pTemplat
1bbf0 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  e is NULL.");...
1bc00 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1bc10 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1bc20 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20  .identity_idx = 
1bc30 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d  hObject - 1;...m
1bc40 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1bc50 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1bc60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1bc70 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1bc80 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1bc90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bca0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1bcb0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1bcc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1bcd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1bce0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1bcf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1bd00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1bd10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1bd20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1bd30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bd40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1bd50 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1bd60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1bd70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1bd80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1bd90 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63  .}...num_ids = c
1bda0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1bdb0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1bdc0 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20  ies_count;...if 
1bdd0 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d  (identity_idx >=
1bde0 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61   num_ids) {...ca
1bdf0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1be00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1be10 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1be20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1be30 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65  .  Object handle
1be40 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
1be50 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25  identity_idx = %
1be60 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c  lu, num_ids = %l
1be70 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u.", (unsigned l
1be80 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64  ong) identity_id
1be90 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
1bea0 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09  g) num_ids);....
1beb0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
1bec0 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
1bed0 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79  );..}...identity
1bee0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
1bef0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1bf00 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74  entities[identit
1bf10 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61  y_idx];...for (a
1bf20 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
1bf30 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b  r_idx < ulCount;
1bf40 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09   attr_idx++) {..
1bf50 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54  .curr_attr = &pT
1bf60 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78  emplate[attr_idx
1bf70 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e  ];....pValue = N
1bf80 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
1bf90 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
1bfa0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1bfb0 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e  G_PRINTF("Lookin
1bfc0 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
1bfd0 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74  0x%08lx (identit
1bfe0 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e  y:%lu) ...", (un
1bff0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1c000 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75  r_attr->type, (u
1c010 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
1c020 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09  entity_idx);....
1c030 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69  for (sess_attr_i
1c040 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74  dx = 0; sess_att
1c050 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79  r_idx < identity
1c060 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
1c070 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
1c080 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64  x++) {....if (id
1c090 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
1c0a0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1c0b0 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
1c0c0 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
1c0d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c0e0 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64  INTF(" ... found
1c0f0 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70   it, pValue = %p
1c100 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25  , ulValueLen = %
1c110 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61  lu", identity->a
1c120 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1c130 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ttr_idx].pValue,
1c140 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
1c150 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1c160 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
1c170 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75  ;..........pValu
1c180 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  e = identity->at
1c190 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1c1a0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a  tr_idx].pValue;.
1c1b0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1c1c0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
1c1d0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1c1e0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b  idx].ulValueLen;
1c1f0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
1c200 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
1c210 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a  ue && pValue) {.
1c220 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
1c230 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20  ->ulValueLen >= 
1c240 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
1c250 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
1c260 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c  tr->pValue, pVal
1c270 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ue, ulValueLen);
1c280 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1c290 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
1c2a0 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09  K_LONG) -1;.....
1c2b0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
1c2c0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
1c2d0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72  ...}...}....curr
1c2e0 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
1c2f0 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  n = ulValueLen;.
1c300 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1c310 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1c320 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1c330 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1c340 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1c350 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c360 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c370 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1c380 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c390 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1c3a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  OR);..}...if (re
1c3b0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52  tval == CKR_ATTR
1c3c0 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
1c3d0 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ID) {...CACKEY_D
1c3e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c3f0 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49  urning CKR_ATTRI
1c400 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
1c410 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  D (%i)", (int) r
1c420 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
1c430 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
1c440 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
1c450 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1c460 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c470 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
1c480 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29  R_TOO_SMALL (%i)
1c490 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
1c4a0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
1c4b0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  tval == CKR_OK) 
1c4c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c4d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1c4e0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1c4f0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
1c500 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
1c510 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c520 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
1c530 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
1c540 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
1c550 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
1c560 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1c570 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
1c580 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
1c590 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1c5a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1c5b0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
1c5c0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
1c5d0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
1c5e0 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43   ulCount) {..CAC
1c5f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c600 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1c610 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1c620 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1c630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c640 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1c650 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1c660 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1c670 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1c680 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1c690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c6a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1c6b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1c6c0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1c6d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1c6e0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1c6f0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1c700 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1c710 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1c720 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
1c730 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43  ndObjectsInit)(C
1c740 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1c750 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
1c760 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
1c770 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
1c780 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53  ulCount) {..CK_S
1c790 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
1c7a0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1c7b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1c7c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1c7d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1c7e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1c7f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c800 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c810 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1c820 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c830 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1c840 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1c850 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1c860 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1c870 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1c880 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1c890 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1c8a0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1c8b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c8c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1c8d0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1c8e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1c8f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1c900 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1c910 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1c920 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1c930 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1c940 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1c950 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1c960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c970 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1c980 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1c990 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1c9a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1c9b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1c9c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c9d0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
1c9e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1c9f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1ca00 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1ca10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ca20 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
1ca30 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1ca40 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1ca50 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1ca60 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
1ca70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1ca80 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
1ca90 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1caa0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1cab0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1cac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cad0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1cae0 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63  earch already ac
1caf0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1cb00 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
1cb10 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
1cb20 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
1cb30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1cb40 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
1cb50 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1cb60 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1cb70 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1cb80 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1cb90 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1cba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cbb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1cbc0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1cbd0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1cbe0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1cbf0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1cc00 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1cc10 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1cc20 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1cc30 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
1cc40 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1cc50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1cc60 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1cc70 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1cc80 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
1cc90 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
1cca0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
1ccb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1ccc0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1ccd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1cce0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1ccf0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1cd00 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74  ots[slotID].slot
1cd10 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b  _reset) {...CACK
1cd20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cd30 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65  "The slot has be
1cd40 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77  en reset since w
1cd50 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f  e last looked fo
1cd60 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20  r identities -- 
1cd70 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09  rescanning");...
1cd80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
1cd90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1cda0 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
1cdb0 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66  L) {....cackey_f
1cdc0 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63  ree_identities(c
1cdd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1cde0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1cdf0 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ies, cackey_sess
1ce00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1ce10 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1ce20 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1ce30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ce40 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
1ce50 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  L;....cackey_ses
1ce60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ce70 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
1ce80 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20   = 0;...}....if 
1ce90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1cea0 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e  otID].label != N
1ceb0 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63  ULL) {....free(c
1cec0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1ced0 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63  ID].label);....c
1cee0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1cef0 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ID].label = NULL
1cf00 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
1cf10 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
1cf20 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09  ot_reset = 0;...
1cf30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1cf40 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1cf50 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
1cf60 55 49 52 45 44 3b 0a 09 7d 0a 0a 09 69 66 20 28  UIRED;..}...if (
1cf70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1cf80 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1cf90 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
1cfa0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1cfb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1cfc0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
1cfd0 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
1cfe0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
1cff0 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73  otID], &cackey_s
1d000 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d010 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1d020 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54  nt);..}...if (pT
1d030 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29  emplate != NULL)
1d040 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
1d050 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
1d060 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d070 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1d080 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75  ry_count = ulCou
1d090 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  nt;....cackey_se
1d0a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1d0b0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
1d0c0 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a  malloc(ulCount *
1d0d0 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
1d0e0 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79  te));.....memcpy
1d0f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d100 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1d110 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61  h_query, pTempla
1d120 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69  te, ulCount * si
1d130 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
1d140 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
1d150 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1d160 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1d170 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
1d180 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  0;....cackey_ses
1d190 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1d1a0 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
1d1b0 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  ULL;...}..} else
1d1c0 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
1d1d0 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
1d1e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1d1f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1d200 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d210 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d220 20 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73    Search query s
1d230 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
1d240 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20  , but number of 
1d250 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20  query terms not 
1d260 73 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22  specified as 0."
1d270 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
1d280 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1d290 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
1d2a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d2b0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
1d2c0 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63  count = 0;...cac
1d2d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1d2e0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1d2f0 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  ery = NULL;..}..
1d300 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1d310 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1d320 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63  h_active = 1;..c
1d330 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1d340 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1d350 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d  curr_id = 0;...m
1d360 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1d370 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1d380 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d390 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1d3a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1d3b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d3c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1d3d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1d3e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1d3f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1d400 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1d410 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1d420 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1d430 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1d440 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1d450 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1d460 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
1d470 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49  bjects)(CK_SESSI
1d480 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1d490 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
1d4a0 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63  NDLE_PTR phObjec
1d4b0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61  t, CK_ULONG ulMa
1d4c0 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b  xObjectCount, CK
1d4d0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62  _ULONG_PTR pulOb
1d4e0 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74  jectCount) {..st
1d4f0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
1d500 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09  tity *curr_id;..
1d510 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
1d520 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f  rr_attr;..CK_ULO
1d530 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20  NG curr_id_idx, 
1d540 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c  curr_out_id_idx,
1d550 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20   curr_attr_idx, 
1d560 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09  sess_attr_idx;..
1d570 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64  CK_ULONG matched
1d580 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74  _count, prev_mat
1d590 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74  ched_count;..int
1d5a0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1d5b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d5c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1d5d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1d5e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1d5f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d600 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1d610 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1d620 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1d630 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1d640 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1d650 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  f (pulObjectCoun
1d660 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
1d670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d680 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f  TF("Error.  pulO
1d690 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55  bjectCount is NU
1d6a0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1d6b0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1d6c0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  AD);..}...if (ph
1d6d0 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26  Object == NULL &
1d6e0 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
1d6f0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
1d700 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
1d710 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
1d720 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
1d730 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
1d740 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
1d750 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  .*pulObjectCount
1d760 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   = 0;....CACKEY_
1d770 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1d780 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1d790 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
1d7a0 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
1d7b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1d7c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a  ;..}...if (phObj
1d7d0 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ect == NULL) {..
1d7e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d7f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68  INTF("Error.  ph
1d800 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22  Object is NULL."
1d810 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d820 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1d830 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f  ..}...if (ulMaxO
1d840 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29  bjectCount == 0)
1d850 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d860 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d870 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72    Maximum number
1d880 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63   of objects spec
1d890 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29  ified as zero.")
1d8a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d8b0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1d8c0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1d8d0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1d8e0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1d8f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1d900 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1d910 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1d920 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d930 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1d940 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1d950 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1d960 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1d970 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1d980 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1d990 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1d9a0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1d9b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1d9c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1d9d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d9e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d9f0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1da00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1da10 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1da20 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1da30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1da40 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1da50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1da60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1da70 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1da80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1da90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1daa0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1dab0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1dac0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1dad0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1dae0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1daf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1db00 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
1db10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1db20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1db30 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1db40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1db50 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63  .  Search not ac
1db60 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1db70 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
1db80 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
1db90 45 44 29 3b 0a 09 7d 0a 0a 09 63 75 72 72 5f 6f  ED);..}...curr_o
1dba0 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09  ut_id_idx = 0;..
1dbb0 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78  for (curr_id_idx
1dbc0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1dbd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1dbe0 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72  rch_curr_id; cur
1dbf0 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65  r_id_idx < cacke
1dc00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1dc10 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
1dc20 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62  count && ulMaxOb
1dc30 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f  jectCount; curr_
1dc40 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75  id_idx++) {...cu
1dc50 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f  rr_id = &cackey_
1dc60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1dc70 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75  n].identities[cu
1dc80 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43  rr_id_idx];....C
1dc90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dca0 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69  TF("Processing i
1dcb0 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75  dentity:%lu", (u
1dcc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1dcd0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d  rr_id_idx);....m
1dce0 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30  atched_count = 0
1dcf0 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61  ;....for (curr_a
1dd00 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72  ttr_idx = 0; cur
1dd10 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63  r_attr_idx < cac
1dd20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1dd30 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1dd40 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f  ery_count; curr_
1dd50 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
1dd60 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f  .prev_matched_co
1dd70 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f  unt = matched_co
1dd80 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74  unt;.....curr_at
1dd90 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  tr = &cackey_ses
1dda0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ddb0 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72  search_query[cur
1ddc0 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09  r_attr_idx];....
1ddd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dde0 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67  INTF("  Checking
1ddf0 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30   for attribute 0
1de00 78 25 30 38 6c 78 20 69 6e 20 69 64 65 6e 74 69  x%08lx in identi
1de10 74 79 3a 25 69 2e 2e 2e 22 2c 20 28 75 6e 73 69  ty:%i...", (unsi
1de20 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1de30 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74  attr->type, (int
1de40 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
1de50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1de60 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 56 61  PRINTBUF("    Va
1de70 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a  lue looking for:
1de80 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  ", curr_attr->pV
1de90 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d  alue, curr_attr-
1dea0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  >ulValueLen);...
1deb0 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72  ..for (sess_attr
1dec0 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61  _idx = 0; sess_a
1ded0 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69  ttr_idx < curr_i
1dee0 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  d->attributes_co
1def0 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  unt; sess_attr_i
1df00 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  dx++) {.....if (
1df10 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
1df20 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
1df30 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f  x].type == curr_
1df40 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09  attr->type) {...
1df50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1df60 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20  PRINTF("    ... 
1df70 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74  found matching t
1df80 79 70 65 20 2e 2e 2e 22 29 3b 0a 09 09 09 09 09  ype ...");......
1df90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dfa0 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f  NTBUF("    ... o
1dfb0 75 72 20 76 61 6c 75 65 3a 22 2c 20 63 75 72 72  ur value:", curr
1dfc0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1dfd0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70  sess_attr_idx].p
1dfe0 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e  Value, curr_id->
1dff0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1e000 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
1e010 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 09 69 66 20  eLen);.......if 
1e020 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
1e030 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ue == NULL) {...
1e040 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e050 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
1e060 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61  ... found wildca
1e070 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09  rd match");.....
1e080 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ...matched_count
1e090 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
1e0a0 3b 0a 09 09 09 09 09 7d 0a 0a 20 09 09 09 09 09  ;......}.. .....
1e0b0 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75  if (curr_attr->u
1e0c0 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 63 75 72  lValueLen == cur
1e0d0 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
1e0e0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
1e0f0 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65  ulValueLen && me
1e100 6d 63 6d 70 28 63 75 72 72 5f 61 74 74 72 2d 3e  mcmp(curr_attr->
1e110 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d  pValue, curr_id-
1e120 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1e130 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75  _attr_idx].pValu
1e140 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  e, curr_id->attr
1e150 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1e160 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
1e170 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  ) == 0) {.......
1e180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e190 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
1e1a0 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63  found exact matc
1e1b0 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63  h");........matc
1e1c0 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09  hed_count++;....
1e1d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
1e1e0 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  }.....}....}....
1e1f0 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69  ./* If the attri
1e200 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  bute could not b
1e210 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f  e matched, do no
1e220 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61  t try to match a
1e230 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62  dditional attrib
1e240 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70  utes */....if (p
1e250 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
1e260 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  t == matched_cou
1e270 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  nt) {.....break;
1e280 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
1e290 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  (matched_count =
1e2a0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1e2b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1e2c0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20  ch_query_count) 
1e2d0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
1e2e0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
1e2f0 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65  All %i attribute
1e300 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
1e310 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e  und, adding iden
1e320 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72  tity:%i to retur
1e330 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29  ned list", (int)
1e340 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1e350 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1e360 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
1e370 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
1e380 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b  );.....phObject[
1e390 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d  curr_out_id_idx]
1e3a0 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b   = curr_id_idx +
1e3b0 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a   1;.....ulMaxObj
1e3c0 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09  ectCount--;.....
1e3d0 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b  curr_out_id_idx+
1e3e0 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  +;...} else {...
1e3f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e400 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20  INTF("  ... Not 
1e410 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75  all %i (only fou
1e420 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65  nd %i) attribute
1e430 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
1e440 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20  und, not adding 
1e450 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69  identity:%i", (i
1e460 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  nt) cackey_sessi
1e470 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1e480 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
1e490 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f  , (int) matched_
1e4a0 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72  count, (int) cur
1e4b0 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09  r_id_idx);...}..
1e4c0 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  }..cackey_sessio
1e4d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1e4e0 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75  rch_curr_id = cu
1e4f0 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c  rr_id_idx;..*pul
1e500 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75  ObjectCount = cu
1e510 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a  rr_out_id_idx;..
1e520 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1e530 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1e540 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1e550 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1e560 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1e570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e580 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1e590 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1e5a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e5b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1e5c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1e5d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1e5e0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1e5f0 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20  , num objects = 
1e600 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70  %lu", CKR_OK, *p
1e610 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a  ulObjectCount);.
1e620 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1e630 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e640 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e650 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61  _FindObjectsFina
1e660 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
1e670 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
1e680 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1e690 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1e6a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1e6b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1e6c0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1e6d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e6e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e6f0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1e700 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e710 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1e720 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1e730 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
1e740 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
1e750 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
1e760 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1e770 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1e780 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
1e790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e7a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1e7b0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1e7c0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1e7d0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1e7e0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1e7f0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1e800 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1e810 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1e820 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1e830 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1e840 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e850 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e860 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1e870 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e880 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1e890 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1e8a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e8b0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
1e8c0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1e8d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1e8e0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1e8f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e900 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
1e910 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1e920 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1e930 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1e940 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
1e950 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e960 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1e970 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
1e980 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1e990 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e9a0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1e9b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e9c0 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74    Search not act
1e9d0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1e9e0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
1e9f0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
1ea00 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
1ea10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ea20 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
1ea30 20 3d 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65   = 0;..if (cacke
1ea40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1ea50 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1ea60 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  y) {...free(cack
1ea70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1ea80 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1ea90 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ry);..}...mutex_
1eaa0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1eab0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1eac0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ead0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1eae0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1eaf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eb00 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1eb10 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1eb20 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1eb30 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1eb40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eb50 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1eb60 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1eb70 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1eb80 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1eb90 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1eba0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69  RV, C_EncryptIni
1ebb0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1ebc0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1ebd0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
1ebe0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
1ebf0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
1ec00 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
1ec10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ec20 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1ec30 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1ec40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ec50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ec60 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1ec70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1ec80 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1ec90 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1eca0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1ecb0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1ecc0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1ecd0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1ece0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1ecf0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1ed00 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1ed10 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1ed20 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1ed30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1ed40 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28  _RV, C_Encrypt)(
1ed50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1ed60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1ed70 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
1ed80 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
1ed90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1eda0 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
1edb0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
1edc0 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29  ncryptedDataLen)
1edd0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1ede0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1edf0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ee00 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ee10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ee20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ee30 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ee40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ee50 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ee60 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ee70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ee80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ee90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1eea0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1eeb0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1eec0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1eed0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1eee0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1eef0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1ef00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1ef10 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61  V, C_EncryptUpda
1ef20 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
1ef30 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1ef40 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
1ef50 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
1ef60 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
1ef70 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
1ef80 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1ef90 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
1efa0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1efb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1efc0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1efd0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1efe0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1eff0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f000 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1f010 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1f020 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1f030 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f040 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1f050 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1f060 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1f070 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1f080 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1f090 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f0a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1f0b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f0c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1f0d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1f0e0 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
1f0f0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
1f100 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1f110 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1f120 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72  LastEncryptedPar
1f130 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1f140 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64  pulLastEncrypted
1f150 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
1f160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f170 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1f180 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1f190 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1f1a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f1b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1f1c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1f1d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1f1e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1f1f0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1f200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1f210 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1f220 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f230 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1f240 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f250 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1f260 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1f270 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1f280 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1f290 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
1f2a0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
1f2b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1f2c0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
1f2d0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
1f2e0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
1f2f0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
1f300 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1f310 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
1f320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f330 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1f340 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1f350 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1f360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f370 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1f380 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1f390 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1f3a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1f3b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
1f3c0 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
1f3d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f3e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f3f0 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
1f400 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1f410 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1f420 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
1f430 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1f440 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
1f450 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
1f460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f470 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
1f480 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
1f490 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
1f4a0 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
1f4b0 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
1f4c0 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
1f4d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
1f4e0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1f4f0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1f500 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1f510 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1f520 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1f530 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1f540 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f550 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1f560 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1f570 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1f580 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1f590 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1f5a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1f5b0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1f5c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1f5d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1f5e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1f5f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f600 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1f610 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1f620 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1f630 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1f640 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1f650 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1f660 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1f670 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f680 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1f690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f6a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1f6b0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1f6c0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1f6d0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1f6e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1f6f0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
1f700 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1f710 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
1f720 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1f730 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f740 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1f750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f760 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
1f770 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
1f780 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
1f790 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
1f7a0 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
1f7b0 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
1f7c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f7d0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1f7e0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
1f7f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1f800 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f810 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1f820 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f830 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
1f840 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73  of range (reques
1f850 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c  ted key %lu, onl
1f860 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73  y %lu identities
1f870 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28   available).", (
1f880 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
1f890 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
1f8a0 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73  ong) cackey_sess
1f8b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1f8c0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1f8d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f8e0 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  KEY_HANDLE_INVAL
1f8f0 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
1f900 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f910 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
1f920 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79  ve = 1;...cackey
1f930 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f940 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
1f950 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69  anism = pMechani
1f960 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  sm->mechanism;..
1f970 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f980 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
1f990 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d  t_mech_parm = pM
1f9a0 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d  echanism->pParam
1f9b0 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65  eter;..cackey_se
1f9c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f9d0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
1f9e0 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69  rmlen = pMechani
1f9f0 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c  sm->ulParameterL
1fa00 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  en;..cackey_sess
1fa10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1fa20 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20  ecrypt_identity 
1fa30 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
1fa40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1fa50 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
1fa60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1fa70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1fa80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1fa90 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1faa0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1fab0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fac0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1fad0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1fae0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1faf0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1fb00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1fb10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1fb20 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1fb30 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1fb40 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1fb50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1fb60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
1fb70 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
1fb80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1fb90 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
1fba0 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
1fbb0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
1fbc0 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  edDataLen, CK_BY
1fbd0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
1fbe0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61  _ULONG_PTR pulDa
1fbf0 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f  taLen) {..CK_ULO
1fc00 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  NG datalen_updat
1fc10 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  e, datalen_final
1fc20 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74  ;..CK_RV decrypt
1fc30 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
1fc40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1fc50 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1fc60 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1fc70 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1fc80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fc90 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1fca0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1fcb0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1fcc0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1fcd0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74  ..}...if (pulDat
1fce0 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  aLen == NULL) {.
1fcf0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fd00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
1fd10 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c  lDataLen is NULL
1fd20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fd30 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1fd40 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f  );..}...datalen_
1fd50 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74  update = *pulDat
1fd60 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f  aLen;...decrypt_
1fd70 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55  ret = C_DecryptU
1fd80 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20  pdate(hSession, 
1fd90 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
1fda0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
1fdb0 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61  en, pData, &data
1fdc0 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66  len_update);..if
1fdd0 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d   (decrypt_ret !=
1fde0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
1fdf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fe00 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
1fe10 74 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e  tUpdate() return
1fe20 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
1fe30 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
1fe40 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74  ed long) decrypt
1fe50 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
1fe60 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09  (decrypt_ret);..
1fe70 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b  }...if (pData) {
1fe80 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61  ...pData += data
1fe90 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09  len_update;..}..
1fea0 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20  datalen_final = 
1feb0 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61  *pulDataLen - da
1fec0 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09  talen_update;...
1fed0 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
1fee0 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65  DecryptFinal(hSe
1fef0 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64  ssion, pData, &d
1ff00 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09  atalen_final);..
1ff10 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
1ff20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
1ff30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ff40 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
1ff50 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72  yptFinal() retur
1ff60 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
1ff70 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
1ff80 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70  ned long) decryp
1ff90 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  t_ret);....retur
1ffa0 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  n(decrypt_ret);.
1ffb0 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e  .}...*pulDataLen
1ffc0 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74   = datalen_updat
1ffd0 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61  e + datalen_fina
1ffe0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1fff0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20000 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
20010 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
20020 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
20030 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20040 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
20050 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
20060 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
20070 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
20080 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
20090 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
200a0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
200b0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
200c0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
200d0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73  pulPartLen) {..s
200e0 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75  tatic CK_BYTE bu
200f0 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65  f[16384];..ssize
20100 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53  _t buflen;..CK_S
20110 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
20120 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43  CK_RV retval = C
20130 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20140 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
20150 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
20160 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
20170 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
20180 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
20190 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
201a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
201b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
201c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
201d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
201e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
201f0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
20200 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
20210 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
20220 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
20230 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
20240 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
20250 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20260 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
20270 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
20280 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
20290 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
202a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
202b0 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
202c0 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
202d0 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50   && ulEncryptedP
202e0 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
202f0 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
20300 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
20310 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74  d to decrypt not
20320 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43  hing... */...CAC
20330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20340 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20350 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
20360 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
20370 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20380 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
20390 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
203a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
203b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
203c0 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65  Error. pEncrypte
203d0 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  dPart is NULL, b
203e0 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  ut ulEncryptedPa
203f0 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22  rtLen is not 0."
20400 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20410 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
20420 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72  ..}...if (ulEncr
20430 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20  yptedPartLen == 
20440 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20450 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20460 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  r. ulEncryptedPa
20470 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
20480 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
20490 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
204a0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
204b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
204c0 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  PartLen == NULL)
204d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
204e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
204f0 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e   pulPartLen is N
20500 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
20510 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
20520 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
20530 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
20540 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
20550 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
20560 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
20570 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20590 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
205a0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
205b0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
205c0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
205d0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
205e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
205f0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
20600 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
20610 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
20620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20630 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
20640 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
20650 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
20660 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
20670 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
20680 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
20690 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
206a0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
206b0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
206c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
206d0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
206e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
206f0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
20700 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
20710 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
20720 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
20730 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20740 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
20750 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20760 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
20770 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
20780 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
20790 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
207a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
207b0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
207c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
207d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
207e0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
207f0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
20800 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
20810 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
20820 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20830 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20840 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
20850 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
20860 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20880 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
20890 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
208a0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
208b0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
208c0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
208d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
208e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
208f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
20900 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
20910 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
20920 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20930 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
20940 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
20950 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
20960 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f  ../* Ask card to
20970 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62   decrypt */....b
20980 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
20990 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
209a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
209b0 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
209c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
209d0 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 45  ypt_identity, pE
209e0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75 6c  ncryptedPart, ul
209f0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
20a00 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
20a10 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69  f), 0, 1);.....i
20a20 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  f (buflen < 0) {
20a30 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69  ...../* Decrypti
20a40 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  on failed. */...
20a50 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  ..if (buflen == 
20a60 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
20a70 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
20a80 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
20a90 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
20aa0 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
20ab0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
20ac0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
20ad0 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
20ae0 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
20af0 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
20b00 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61  lse {......retva
20b10 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
20b20 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09  ERROR;.....}....
20b30 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73  } else if (((uns
20b40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c  igned long) bufl
20b50 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65  en) > *pulPartLe
20b60 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09  n && pPart) {...
20b70 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64  ../* Decrypted d
20b80 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  ata too large */
20b90 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
20ba0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
20bb0 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  LL;....} else {.
20bc0 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20 7b  ....if (pPart) {
20bd0 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61  ......memcpy(pPa
20be0 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29  rt, buf, buflen)
20bf0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
20c00 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65  lPartLen = bufle
20c10 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  n;......retval =
20c20 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09   CKR_OK;....}...
20c30 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75  ..break;..}...mu
20c40 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
20c50 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
20c60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20c70 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
20c80 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
20c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20ca0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
20cb0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
20cc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
20cd0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
20ce0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20cf0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
20d00 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
20d10 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
20d20 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
20d30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
20d40 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69  _RV, C_DecryptFi
20d50 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
20d60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
20d70 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61   CK_BYTE_PTR pLa
20d80 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  stPart, CK_ULONG
20d90 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74  _PTR pulLastPart
20da0 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Len) {..int mute
20db0 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74  x_retval;..int t
20dc0 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
20dd0 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 1;...CACKEY_D
20de0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20df0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20e00 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20e10 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20e20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20e30 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20e40 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20e50 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20e60 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20e70 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
20e80 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
20e90 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
20ea0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
20eb0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
20ec0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
20ed0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20ee0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20ef0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
20f00 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
20f10 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20f20 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
20f30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61  ;..}...if (pulLa
20f40 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c  stPartLen == NUL
20f50 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
20f60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20f70 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  r. pulLastPartLe
20f80 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
20f90 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
20fa0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
20fb0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
20fc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
20fd0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20fe0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
20ff0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
21000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21010 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
21020 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
21030 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
21040 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
21050 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
21060 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21070 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
21080 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21090 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
210a0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
210b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
210c0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
210d0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
210e0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
210f0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
21100 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
21110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21120 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
21130 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
21140 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
21150 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
21160 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21170 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
21180 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
21190 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
211a0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
211b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
211c0 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50  ;..}...*pulLastP
211d0 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66  artLen = 0;...if
211e0 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e   (pLastPart == N
211f0 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61  ULL) {...termina
21200 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a  te_decrypt = 0;.
21210 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61  .}...if (termina
21220 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09  te_decrypt) {...
21230 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21240 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
21250 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  t_active = 0;..}
21260 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
21270 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
21280 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21290 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
212a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
212b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
212c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
212d0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
212e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
212f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21300 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21320 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
21330 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
21340 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
21350 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21360 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
21370 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45  igestInit)(CK_SE
21380 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21390 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
213a0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
213b0 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  sm) {..CACKEY_DE
213c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
213d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
213e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
213f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21400 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21410 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21420 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21430 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21440 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21450 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
21460 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21470 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
21480 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
21490 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
214a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
214b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
214c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
214d0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
214e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
214f0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28  K_RV, C_Digest)(
21500 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
21510 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
21520 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
21530 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
21540 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
21550 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Digest, CK_ULONG
21560 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65  _PTR pulDigestLe
21570 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
21580 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
21590 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
215a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
215b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
215c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
215d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
215e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
215f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21600 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21610 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
21620 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21630 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
21640 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
21650 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
21660 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21670 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
21680 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21690 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
216a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
216b0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64  _RV, C_DigestUpd
216c0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
216d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
216e0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
216f0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
21700 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
21710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21720 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21730 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21740 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21750 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21760 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21770 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21780 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21790 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
217a0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
217b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
217c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
217d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
217e0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
217f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21800 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
21810 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21820 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
21830 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21840 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
21850 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  stKey)(CK_SESSIO
21860 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
21870 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
21880 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
21890 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
218a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
218b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
218c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
218d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
218e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
218f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21900 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21910 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21920 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
21930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21940 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
21950 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21960 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
21970 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21980 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
21990 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
219a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
219b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
219c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
219d0 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  gestFinal)(CK_SE
219e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
219f0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
21a00 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55  TR pDigest, CK_U
21a10 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65  LONG_PTR pulDige
21a20 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  stLen) {..CACKEY
21a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21a40 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21a50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
21a60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
21a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21a80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
21a90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
21aa0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
21ab0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
21ac0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21ae0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
21af0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21b00 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
21b10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21b20 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
21b30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21b40 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
21b50 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21b60 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49  N(CK_RV, C_SignI
21b70 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
21b80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
21b90 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
21ba0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
21bb0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
21bc0 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Key) {..int mute
21bd0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79  x_retval;...hKey
21be0 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  --;...CACKEY_DEB
21bf0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
21c00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
21c10 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
21c20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21c30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21c40 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
21c50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21c60 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21c70 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21c80 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
21c90 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  sm == NULL) {...
21ca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21cb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
21cc0 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22  hanism is NULL."
21cd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21ce0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
21cf0 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
21d00 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
21d10 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20  != CKM_RSA_PKCS 
21d20 26 26 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  && pMechanism->m
21d30 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
21d40 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 29 20 7b  SHA1_RSA_PKCS) {
21d50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21d60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
21d70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
21d80 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
21d90 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
21da0 43 53 20 6f 72 20 43 4b 4d 5f 53 48 41 31 5f 52  CS or CKM_SHA1_R
21db0 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65  SA_PKCS");....re
21dc0 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49  turn(CKR_MECHANI
21dd0 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44  SM_PARAM_INVALID
21de0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
21df0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
21e00 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
21e10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21e20 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
21e30 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
21e40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21e50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21e60 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
21e70 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
21e80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
21e90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
21ea0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
21eb0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21ec0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
21ed0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
21ee0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
21ef0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21f00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21f10 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
21f20 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21f30 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21f40 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
21f50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21f60 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
21f70 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
21f80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21f90 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
21fa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21fb0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
21fc0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
21fd0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
21fe0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
21ff0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
22000 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
22010 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
22020 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
22030 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
22040 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22050 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
22060 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22070 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20  .  Sign already 
22080 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
22090 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
220a0 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
220b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
220c0 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
220d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
220e0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
220f0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
22100 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22110 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
22120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22130 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
22140 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
22150 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
22160 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
22170 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
22180 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
22190 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
221a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
221b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
221c0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
221d0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
221e0 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
221f0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
22200 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
22210 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
22220 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
22230 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22240 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
22250 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
22260 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
22270 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
22280 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
22290 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a  n_buflen = 128;.
222a0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
222b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
222c0 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61  bufused = 0;..ca
222d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
222e0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
222f0 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
22300 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (*cackey_session
22310 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
22320 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73  _buf) * cackey_s
22330 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22340 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a  ].sign_buflen);.
22350 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22360 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25  RINTF("Session %
22370 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  lu sign_identity
22380 20 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79   is %p (identity
22390 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e   #%lu)", (unsign
223a0 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f  ed long) hSessio
223b0 6e 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  n, &cackey_sessi
223c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
223d0 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20  entities[hKey], 
223e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
223f0 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73  hKey);..cackey_s
22400 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22410 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  ].sign_identity 
22420 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
22430 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
22440 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
22450 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
22460 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22470 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22480 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
22490 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
224a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
224b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
224c0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
224d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
224e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
224f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
22500 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22510 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
22520 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
22530 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
22540 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22550 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
22560 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
22570 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
22580 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
22590 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
225a0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
225b0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
225c0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
225d0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75  gnatureLen) {..u
225e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61  nsigned long sta
225f0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
22600 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74  ..CK_RV sign_ret
22610 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22620 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22630 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22640 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22650 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22660 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22670 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22680 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22690 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
226a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
226b0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
226c0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
226d0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
226e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
226f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22700 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
22710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22720 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
22730 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
22740 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
22750 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
22760 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
22770 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75  ...start_sign_bu
22780 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73  fused = cackey_s
22790 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
227a0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  ].sign_bufused;.
227b0 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53  ..sign_ret = C_S
227c0 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69  ignUpdate(hSessi
227d0 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74  on, pData, ulDat
227e0 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e  aLen);..if (sign
227f0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
22800 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22810 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22820 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65   SignUpdate() re
22830 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
22840 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
22850 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
22860 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  n_ret);....retur
22870 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a  n(sign_ret);..}.
22880 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53  ..sign_ret = C_S
22890 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f  ignFinal(hSessio
228a0 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70  n, pSignature, p
228b0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b  ulSignatureLen);
228c0 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21  ..if (sign_ret !
228d0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66  = CKR_OK) {...if
228e0 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b   (sign_ret == CK
228f0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
22900 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
22910 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 69  DEBUG_PRINTF("Si
22920 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
22930 65 64 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  ed CKR_BUFFER_TO
22940 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c  O_SMALL (rv = %l
22950 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69  u), undoing C_Si
22960 67 6e 55 70 64 61 74 65 28 29 22 2c 20 28 75 6e  gnUpdate()", (un
22970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
22980 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b  n_ret);.....cack
22990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
229a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
229b0 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f  ed = start_sign_
229c0 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 74  bufused;.....ret
229d0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
229e0 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
229f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22a00 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72  .  SignFinal() r
22a10 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
22a20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
22a30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
22a40 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  gn_ret);....retu
22a50 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
22a60 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22a70 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22a80 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
22a90 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
22aa0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
22ab0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22ac0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70  (CK_RV, C_SignUp
22ad0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
22ae0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
22af0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
22b00 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
22b10 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
22b20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
22b30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22b40 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22b50 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22b60 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22b70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22b80 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22b90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22ba0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22bb0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22bc0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
22bd0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
22be0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
22bf0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22c00 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
22c10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22c20 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
22c30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22c40 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
22c50 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
22c60 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
22c70 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
22c80 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
22c90 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (pPart == NULL
22ca0 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d   && ulPartLen ==
22cb0 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
22cc0 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61   circuit if we a
22cd0 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e  re asked to sign
22ce0 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
22cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22d00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22d10 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
22d20 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
22d30 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
22d40 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
22d50 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (pPart == NULL
22d60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22d70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22d80 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  . pPart is NULL,
22d90 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69   but ulPartLen i
22da0 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
22db0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
22dc0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
22dd0 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  f (ulPartLen == 
22de0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
22df0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22e00 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  r. ulPartLen is 
22e10 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20  0, but pPart is 
22e20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
22e30 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
22e40 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
22e50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
22e60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
22e70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22e80 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
22e90 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
22ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22eb0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
22ec0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22ed0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22ee0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22ef0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
22f00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
22f10 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
22f20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
22f30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22f40 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
22f50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22f60 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
22f70 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
22f80 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
22f90 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
22fa0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
22fb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22fc0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
22fd0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
22fe0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22ff0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
23000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23010 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
23020 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
23030 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
23040 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
23050 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23060 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
23070 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23080 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
23090 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
230a0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
230b0 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74  ccumulate direct
230c0 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61  ly */....if ((ca
230d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
230e0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
230f0 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e  used + ulPartLen
23100 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) > cackey_sessi
23110 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
23120 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09  gn_buflen) {....
23130 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
23140 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
23150 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09  buflen *= 2;....
23160 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
23170 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
23180 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63  _buf = realloc(c
23190 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
231a0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
231b0 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  f, sizeof(*cacke
231c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
231d0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a  ion].sign_buf) *
231e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
231f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
23200 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09  buflen);....}...
23210 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
23220 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23230 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61  n].sign_buf + ca
23240 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23250 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
23260 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50  used, pPart, ulP
23270 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63  artLen);.....cac
23280 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23290 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
232a0 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e  sed += ulPartLen
232b0 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  ;.....break;...c
232c0 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41  ase CKM_SHA1_RSA
232d0 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 58 58 58  _PKCS:..../* XXX
232e0 3a 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74  : Accumulate int
232f0 6f 20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f  o a SHA1 hash */
23300 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
23310 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23320 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43  iglock);.....CAC
23330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23340 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23350 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23360 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
23370 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23380 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72  UPPORTED);.....r
23390 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
233a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
233b0 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  );....break;..}.
233c0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
233d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
233e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
233f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
23400 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
23410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23420 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
23430 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
23440 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23450 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
23460 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23470 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23480 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
23490 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
234a0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
234b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
234c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
234d0 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  gnFinal)(CK_SESS
234e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
234f0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
23500 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
23510 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
23520 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74  natureLen) {..st
23530 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67  atic CK_BYTE sig
23540 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a  buf[1024];..ssiz
23550 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09  e_t sigbuflen;..
23560 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
23570 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  D;..CK_RV retval
23580 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
23590 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69  RROR;..int termi
235a0 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
235b0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
235c0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
235d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
235e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
235f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
23600 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23610 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23620 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
23630 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23640 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
23650 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
23660 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75  ..if (pulSignatu
23670 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  reLen == NULL) {
23680 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23690 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
236a0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69  ulSignatureLen i
236b0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
236c0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
236d0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
236e0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
236f0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
23700 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
23710 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
23720 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23730 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
23740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23750 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
23760 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
23770 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23780 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
23790 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
237a0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
237b0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
237c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
237d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
237e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
237f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23800 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
23810 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
23820 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
23830 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
23840 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
23850 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
23860 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
23870 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23880 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23890 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
238a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
238b0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
238c0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
238d0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
238e0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
238f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
23900 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23910 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
23920 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
23930 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23940 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
23950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23960 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
23970 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
23980 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
23990 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
239a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
239b0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
239c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
239d0 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
239e0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
239f0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
23a00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
23a10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23a20 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
23a30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23a40 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
23a50 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23a60 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
23a70 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
23a80 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
23a90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23aa0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
23ab0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
23ac0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
23ad0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23ae0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23af0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
23b00 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
23b10 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
23b20 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
23b30 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
23b40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23b50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
23b60 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
23b70 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
23b80 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
23b90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23ba0 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
23bb0 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
23bc0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
23bd0 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e  Ask card to sign
23be0 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45   */....CACKEY_DE
23bf0 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69  BUG_PRINTF("Aski
23c00 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20  ng to sign from 
23c10 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73  identity %p in s
23c20 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 63 61 63  ession %lu", cac
23c30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23c40 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
23c50 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  tity, (unsigned 
23c60 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b  long) hSession);
23c70 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
23c80 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
23c90 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
23ca0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
23cb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23cc0 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
23cd0 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  y, cackey_sessio
23ce0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
23cf0 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65  n_buf, cackey_se
23d00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23d10 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73  .sign_bufused, s
23d20 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  igbuf, sizeof(si
23d30 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09  gbuf), 1, 0);...
23d40 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
23d50 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  < 0) {...../* Si
23d60 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f  gning failed. */
23d70 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
23d80 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
23d90 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b  C_E_NEEDLOGIN) {
23da0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
23db0 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47  KR_USER_NOT_LOGG
23dc0 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73  ED_IN;.....} els
23dd0 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  e if (sigbuflen 
23de0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
23df0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
23e00 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
23e10 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
23e20 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
23e30 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
23e40 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
23e50 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
23e60 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
23e70 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20  ong) sigbuflen) 
23e80 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  > *pulSignatureL
23e90 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65  en && pSignature
23ea0 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65  ) {...../* Signe
23eb0 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
23ec0 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44   */.....CACKEY_D
23ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74  EBUG_PRINTF("ret
23ee0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
23ef0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67  _TOO_SMALL;  sig
23f00 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75  buflen = %lu, pu
23f10 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
23f20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
23f30 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c  long) sigbuflen,
23f40 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
23f50 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
23f60 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  n);......retval 
23f70 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
23f80 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72  _SMALL;......ter
23f90 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
23fa0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
23fb0 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
23fc0 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53  = 0;......if (pS
23fd0 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09  ignature) {.....
23fe0 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75  .memcpy(pSignatu
23ff0 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62  re, sigbuf, sigb
24000 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65  uflen);.......te
24010 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31  rminate_sign = 1
24020 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
24030 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
24040 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  sigbuflen;......
24050 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
24060 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
24070 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31  ...case CKM_SHA1
24080 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
24090 20 58 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65   XXX: Accumulate
240a0 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73   into a SHA1 has
240b0 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d  h */....cackey_m
240c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
240d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
240e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
240f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24100 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24110 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
24120 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
24130 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
24140 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
24150 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24160 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b  RTED);....break;
24170 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e  ..}...if (termin
24180 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66  ate_sign) {...if
24190 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
241a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
241b0 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28  _buf) {....free(
241c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
241d0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
241e0 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  uf);...}....cack
241f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24200 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
24210 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
24220 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
24230 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
24240 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24250 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24260 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
24270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24280 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
24290 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
242a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
242b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
242c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
242d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
242e0 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
242f0 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
24300 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  val);.}..CK_DEFI
24310 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
24320 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  V, C_SignRecover
24330 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
24340 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
24350 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
24360 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
24370 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
24380 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
24390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
243a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
243b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
243c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
243d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
243e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
243f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24400 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24410 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24420 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
24430 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
24440 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
24450 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24460 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
24470 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24480 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
24490 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
244a0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
244b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
244c0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65  (CK_RV, C_SignRe
244d0 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f  cover)(CK_SESSIO
244e0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
244f0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
24500 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
24510 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
24520 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
24530 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
24540 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
24550 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
24560 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24570 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24580 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
245a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
245b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
245c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
245d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
245e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
245f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24600 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24610 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24620 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
24630 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
24640 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
24650 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
24660 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24670 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
24680 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24690 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28  , C_VerifyInit)(
246a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
246b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
246c0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
246d0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
246e0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
246f0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
24700 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24710 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24720 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24750 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24760 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24770 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24780 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
247a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
247b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
247c0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
247d0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
247e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
247f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
24800 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24810 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
24820 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24830 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53  , C_Verify)(CK_S
24840 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24850 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
24860 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
24870 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
24880 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
24890 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
248a0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
248b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
248c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
248d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
248e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
248f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24900 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24910 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24920 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24930 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24940 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24960 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24970 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24980 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
24990 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
249a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
249b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
249c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
249d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
249e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
249f0 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  , C_VerifyUpdate
24a00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
24a10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
24a20 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
24a30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
24a40 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
24a50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
24a60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
24a70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
24a80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
24a90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24aa0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24ab0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24ac0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24ad0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24ae0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24af0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24b00 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
24b10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
24b20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
24b30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24b40 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
24b50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24b60 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
24b70 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
24b80 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46  CK_RV, C_VerifyF
24b90 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
24ba0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
24bb0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
24bc0 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
24bd0 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
24be0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
24bf0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24c00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24c10 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24c20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24c30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24c40 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
24c50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24c60 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
24c70 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
24c80 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24c90 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24ca0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
24cb0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
24cc0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
24cd0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24ce0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
24cf0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24d00 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
24d10 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24d20 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63  _RV, C_VerifyRec
24d30 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
24d40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24d50 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
24d60 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
24d70 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
24d80 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
24d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24da0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24db0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24dc0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24de0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
24df0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
24e00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
24e10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
24e20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
24e30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24e40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
24e50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24e60 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
24e70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24e80 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
24e90 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
24ea0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
24eb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
24ec0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
24ed0 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f  rifyRecover)(CK_
24ee0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24ef0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
24f00 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
24f10 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
24f20 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54  atureLen, CK_BYT
24f30 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
24f40 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
24f50 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
24f60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24f70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24f80 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24f90 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24fb0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24fc0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24fd0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24fe0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24ff0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
25000 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25010 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
25020 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
25030 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
25040 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25050 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
25060 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25070 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
25080 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25090 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
250a0 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43  EncryptUpdate)(C
250b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
250c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
250d0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
250e0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
250f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
25100 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
25110 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
25120 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
25130 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
25140 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
25150 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
25160 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
25170 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25180 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
25190 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
251a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
251b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
251c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
251d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
251e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
251f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25200 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
25210 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
25220 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
25230 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
25240 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25250 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
25260 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
25270 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  , C_DecryptDiges
25280 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
25290 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
252a0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
252b0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
252c0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
252d0 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b  yptedPartLen, CK
252e0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
252f0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
25300 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
25310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25320 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25330 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25340 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25360 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25370 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25380 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25390 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
253a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
253b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
253c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
253d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
253e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
253f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25400 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
25410 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
25420 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
25430 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25440 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
25450 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  gnEncryptUpdate)
25460 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
25470 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
25480 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
25490 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
254a0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
254b0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
254c0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
254d0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
254e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
254f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
25500 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
25510 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
25520 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25530 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25540 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
25550 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25560 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
25570 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
25580 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25590 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
255a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
255b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
255c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
255d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
255e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
255f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
25600 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
25610 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
25620 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72  RV, C_DecryptVer
25630 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ifyUpdate)(CK_SE
25640 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25650 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
25660 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
25670 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
25680 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
25690 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
256a0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
256b0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
256c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
256d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
256e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
256f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
25700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25710 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
25720 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
25730 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
25740 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
25750 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
25760 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25770 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25780 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25790 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
257a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
257b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
257c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
257d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
257e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
257f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25800 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f  GenerateKey)(CK_
25810 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
25820 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
25830 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
25840 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55  nism, CK_ATTRIBU
25850 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
25860 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
25870 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
25880 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
25890 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
258a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
258b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
258c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
258d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
258e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
258f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
25900 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25910 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25920 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25940 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25950 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25960 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
25970 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
25980 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
25990 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
259a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
259b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
259c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
259d0 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  , C_GenerateKeyP
259e0 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  air)(CK_SESSION_
259f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
25a00 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
25a10 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
25a20 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
25a30 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74  PublicKeyTemplat
25a40 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75  e, CK_ULONG ulPu
25a50 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65  blicKeyAttribute
25a60 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42  Count, CK_ATTRIB
25a70 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65  UTE_PTR pPrivate
25a80 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  KeyTemplate, CK_
25a90 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b  ULONG ulPrivateK
25aa0 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  eyAttributeCount
25ab0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
25ac0 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b  LE_PTR phPublicK
25ad0 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
25ae0 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61  NDLE_PTR phPriva
25af0 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  teKey) {..CACKEY
25b00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
25b10 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
25b20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
25b30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
25b40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25b50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
25b60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
25b70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
25b80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
25b90 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
25ba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
25bb0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
25bc0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25bd0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
25be0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25bf0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
25c00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25c10 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
25c20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25c30 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b  N(CK_RV, C_WrapK
25c40 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
25c50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
25c60 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
25c70 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
25c80 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57  OBJECT_HANDLE hW
25c90 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f  rappingKey, CK_O
25ca0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
25cb0 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
25cc0 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
25cd0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70  LONG_PTR pulWrap
25ce0 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41  pedKeyLen) {..CA
25cf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25d00 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25d10 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
25d20 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
25d30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25d40 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
25d50 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
25d60 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
25d70 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
25d80 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
25d90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25da0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
25db0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25dc0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
25dd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25de0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
25df0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
25e00 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25e10 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25e20 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55  CTION(CK_RV, C_U
25e30 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  nwrapKey)(CK_SES
25e40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
25e50 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
25e60 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
25e70 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
25e80 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b  DLE hUnwrappingK
25e90 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  ey, CK_BYTE_PTR 
25ea0 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f  pWrappedKey, CK_
25eb0 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b  ULONG ulWrappedK
25ec0 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42  eyLen, CK_ATTRIB
25ed0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
25ee0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74  e, CK_ULONG ulAt
25ef0 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
25f00 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
25f10 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
25f20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25f30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25f40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25f50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25f60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25f70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25f80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25f90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25fa0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25fb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
25fc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25fd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
25fe0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
25ff0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
26000 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26010 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
26020 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
26030 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
26040 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26050 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
26060 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53  riveKey)(CK_SESS
26070 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26080 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
26090 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
260a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
260b0 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f  LE hBaseKey, CK_
260c0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
260d0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
260e0 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
260f0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
26100 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
26110 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
26120 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
26130 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
26140 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
26150 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26160 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
26170 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
26180 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26190 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
261a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
261b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
261c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
261d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
261e0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
261f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
26200 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
26210 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
26220 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26230 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
26240 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
26250 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28  , C_SeedRandom)(
26260 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26270 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
26280 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43  YTE_PTR pSeed, C
26290 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65  K_ULONG ulSeedLe
262a0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
262b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
262c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
262d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
262e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
262f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26300 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
26310 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26320 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
26330 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26340 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
26350 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
26360 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
26370 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
26380 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
26390 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
263a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
263b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
263c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
263d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
263e0 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52  _RV, C_GenerateR
263f0 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f  andom)(CK_SESSIO
26400 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
26410 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
26420 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55  RandomData, CK_U
26430 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e  LONG ulRandomLen
26440 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
26450 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
26460 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
26470 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
26480 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26490 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
264a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
264b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
264c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
264d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
264e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
264f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26500 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
26510 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
26520 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
26530 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26540 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
26550 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26560 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70  RTED);.}../* Dep
26570 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  recated Function
26580 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
26590 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
265a0 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75  GetFunctionStatu
265b0 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
265c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
265d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
265e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
265f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
26600 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
26610 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
26620 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69  NOT_PARALLEL (%i
26630 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
26640 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
26650 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
26660 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
26670 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20  EL);...hSession 
26680 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53  = hSession; /* S
26690 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
266a0 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
266b0 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74  /.}../* Deprecat
266c0 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43  ed Function */.C
266d0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
266e0 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65  N(CK_RV, C_Cance
266f0 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45  lFunction)(CK_SE
26700 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
26710 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59  ssion) {..CACKEY
26720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
26730 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
26740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26750 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
26760 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
26770 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f  LLEL (%i)", CKR_
26780 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
26790 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e  ALLEL);...return
267a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
267b0 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68  T_PARALLEL);...h
267c0 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69  Session = hSessi
267d0 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  on; /* Supress u
267e0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
267f0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
26800 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
26810 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63  CK_RV, C_GetFunc
26820 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e  tionList)(CK_FUN
26830 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50  CTION_LIST_PTR_P
26840 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  TR ppFunctionLis
26850 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f  t) {..CK_FUNCTIO
26860 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63  N_LIST_PTR pFunc
26870 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b  tionList;...CACK
26880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26890 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
268a0 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   (ppFunctionList
268b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
268c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
268d0 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63  F("Error. ppFunc
268e0 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c  tionList is NULL
268f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26900 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
26910 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f  );..}...pFunctio
26920 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73  nList = malloc(s
26930 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e  izeof(*pFunction
26940 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74  List));...pFunct
26950 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e  ionList->version
26960 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45  .major = ((CACKE
26970 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
26980 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20  ON_CODE) >> 16) 
26990 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69  & 0xff;..pFuncti
269a0 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e  onList->version.
269b0 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  minor = ((CACKEY
269c0 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
269d0 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20  N_CODE) >> 8) & 
269e0 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f  0xff;...pFunctio
269f0 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c  nList->C_Initial
26a00 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69  ize = C_Initiali
26a10 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
26a20 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d  st->C_Finalize =
26a30 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46   C_Finalize;..pF
26a40 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
26a50 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e  etInfo = C_GetIn
26a60 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
26a70 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73  st->C_GetSlotLis
26a80 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  t = C_GetSlotLis
26a90 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
26aa0 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f  t->C_GetSlotInfo
26ab0 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f   = C_GetSlotInfo
26ac0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
26ad0 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  ->C_GetTokenInfo
26ae0 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66   = C_GetTokenInf
26af0 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
26b00 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  t->C_WaitForSlot
26b10 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f  Event = C_WaitFo
26b20 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75  rSlotEvent;..pFu
26b30 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
26b40 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d  tMechanismList =
26b50 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c   C_GetMechanismL
26b60 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
26b70 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e  ist->C_GetMechan
26b80 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d  ismInfo = C_GetM
26b90 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70  echanismInfo;..p
26ba0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26bb0 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e  InitToken = C_In
26bc0 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74  itToken;..pFunct
26bd0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50  ionList->C_InitP
26be0 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a  IN = C_InitPIN;.
26bf0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
26c00 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74  C_SetPIN = C_Set
26c10 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  PIN;..pFunctionL
26c20 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69  ist->C_OpenSessi
26c30 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69  on = C_OpenSessi
26c40 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
26c50 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69  st->C_CloseSessi
26c60 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73  on = C_CloseSess
26c70 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ion;..pFunctionL
26c80 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53  ist->C_CloseAllS
26c90 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73  essions = C_Clos
26ca0 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70  eAllSessions;..p
26cb0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26cc0 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d  GetSessionInfo =
26cd0 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66   C_GetSessionInf
26ce0 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
26cf0 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f  t->C_GetOperatio
26d00 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70  nState = C_GetOp
26d10 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70  erationState;..p
26d20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26d30 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
26d40 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69  e = C_SetOperati
26d50 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74  onState;..pFunct
26d60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e  ionList->C_Login
26d70 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75   = C_Login;..pFu
26d80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f  nctionList->C_Lo
26d90 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b  gout = C_Logout;
26da0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
26db0 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20  >C_CreateObject 
26dc0 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  = C_CreateObject
26dd0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
26de0 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d  ->C_CopyObject =
26df0 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09   C_CopyObject;..
26e00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
26e10 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d  _DestroyObject =
26e20 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74   C_DestroyObject
26e30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
26e40 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  ->C_GetObjectSiz
26e50 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53  e = C_GetObjectS
26e60 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ize;..pFunctionL
26e70 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62  ist->C_GetAttrib
26e80 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74  uteValue = C_Get
26e90 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a  AttributeValue;.
26ea0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
26eb0 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
26ec0 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69  lue = C_SetAttri
26ed0 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e  buteValue;..pFun
26ee0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
26ef0 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43  dObjectsInit = C
26f00 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
26f10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
26f20 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20  ->C_FindObjects 
26f30 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b  = C_FindObjects;
26f40 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
26f50 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69  >C_FindObjectsFi
26f60 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  nal = C_FindObje
26f70 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ctsFinal;..pFunc
26f80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
26f90 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72  yptInit = C_Encr
26fa0 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  yptInit;..pFunct
26fb0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
26fc0 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a  pt = C_Encrypt;.
26fd0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
26fe0 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  C_EncryptUpdate 
26ff0 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  = C_EncryptUpdat
27000 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
27010 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61  t->C_EncryptFina
27020 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e  l = C_EncryptFin
27030 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
27040 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69  st->C_DecryptIni
27050 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69  t = C_DecryptIni
27060 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
27070 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43  t->C_Decrypt = C
27080 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63  _Decrypt;..pFunc
27090 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
270a0 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  yptUpdate = C_De
270b0 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
270c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
270d0 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f  ecryptFinal = C_
270e0 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70  DecryptFinal;..p
270f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
27100 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44  DigestInit = C_D
27110 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e  igestInit;..pFun
27120 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
27130 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a  est = C_Digest;.
27140 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27150 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 20 3d  C_DigestUpdate =
27160 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b   C_DigestUpdate;
27170 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27180 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43  >C_DigestKey = C
27190 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75  _DigestKey;..pFu
271a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
271b0 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69  gestFinal = C_Di
271c0 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  gestFinal;..pFun
271d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
271e0 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e  nInit = C_SignIn
271f0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
27200 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53  st->C_Sign = C_S
27210 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ign;..pFunctionL
27220 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74  ist->C_SignUpdat
27230 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65  e = C_SignUpdate
27240 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27250 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20  ->C_SignFinal = 
27260 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46  C_SignFinal;..pF
27270 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
27280 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d  ignRecoverInit =
27290 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e   C_SignRecoverIn
272a0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
272b0 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65  st->C_SignRecove
272c0 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  r = C_SignRecove
272d0 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
272e0 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20  t->C_VerifyInit 
272f0 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a  = C_VerifyInit;.
27300 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27310 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72  C_Verify = C_Ver
27320 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ify;..pFunctionL
27330 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64  ist->C_VerifyUpd
27340 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70  ate = C_VerifyUp
27350 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
27360 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69  List->C_VerifyFi
27370 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69  nal = C_VerifyFi
27380 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
27390 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63  ist->C_VerifyRec
273a0 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72  overInit = C_Ver
273b0 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a  ifyRecoverInit;.
273c0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
273d0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 20  C_VerifyRecover 
273e0 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  = C_VerifyRecove
273f0 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
27400 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79  t->C_DigestEncry
27410 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67  ptUpdate = C_Dig
27420 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
27430 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27440 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  ->C_DecryptDiges
27450 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  tUpdate = C_Decr
27460 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 3b  yptDigestUpdate;
27470 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27480 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70  >C_SignEncryptUp
27490 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63  date = C_SignEnc
274a0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
274b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
274c0 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74  cryptVerifyUpdat
274d0 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72  e = C_DecryptVer
274e0 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ifyUpdate;..pFun
274f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e  ctionList->C_Gen
27500 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e  erateKey = C_Gen
27510 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63  erateKey;..pFunc
27520 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
27530 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f  rateKeyPair = C_
27540 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b  GenerateKeyPair;
27550 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27560 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57  >C_WrapKey = C_W
27570 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  rapKey;..pFuncti
27580 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70  onList->C_Unwrap
27590 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65  Key = C_UnwrapKe
275a0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
275b0 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d  t->C_DeriveKey =
275c0 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70   C_DeriveKey;..p
275d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
275e0 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53  SeedRandom = C_S
275f0 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e  eedRandom;..pFun
27600 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e  ctionList->C_Gen
27610 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f  erateRandom = C_
27620 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a  GenerateRandom;.
27630 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27640 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
27650 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  tus = C_GetFunct
27660 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e  ionStatus;..pFun
27670 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e  ctionList->C_Can
27680 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f  celFunction = C_
27690 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a  CancelFunction;.
276a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
276b0 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
276c0 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  t = C_GetFunctio
276d0 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63  nList;...*ppFunc
276e0 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63  tionList = pFunc
276f0 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b  tionList;...CACK
27700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
27720 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
27730 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
27740 4b 29 3b 0a 7d 0a 0a                             K);.}..