Hex Artifact Content

Artifact 7d1ac77f3707c79b32fa12d820b0c854cc0ab919:


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 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T0, &slot->pc
5a90: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
5aa0: 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  ol);....if (scar
5ab0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
5ac0: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
5ad0: 43 41 52 44 29 20 7b 0a 09 09 09 73 63 61 72 64  CARD) {....scard
5ae0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
5af0: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
5b00: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
5b10: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
5b20: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49 52   SCARD_SHARE_DIR
5b30: 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  ECT, SCARD_PROTO
5b40: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
5b50: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
5b60: 63 6f 6c 29 3b 0a 09 09 09 73 63 61 72 64 5f 63  col);....scard_c
5b70: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
5b80: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
5b90: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
5ba0: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
5bb0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c  ARD_PROTOCOL_T0,
5bc0: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
5bd0: 44 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  D, &protocol);..
5be0: 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  .}....if (scard_
5bf0: 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52  conn_ret != SCAR
5c00: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
5c10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5c20: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
5c30: 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64  n to card failed
5c40: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
5c50: 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e  ailure (SCardCon
5c60: 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29  nect() = %s/%li)
5c70: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
5c80: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
5c90: 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  _STR(scard_conn_
5ca0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
5cb0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09  rd_conn_ret);...
5cc0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5cd0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
5ce0: 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63  ...}....slot->pc
5cf0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
5d00: 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74  d = 1;...slot->t
5d10: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
5d20: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72   = 0;..}...retur
5d30: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
5d40: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
5d50: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
5d60: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
5d70: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
5d80: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
5d90: 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a  slot *slot);. *.
5da0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
5db0: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
5dc0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
5dd0: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
5de0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
5df0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
5e00: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
5e10: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
5e20: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
5e30: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5e40: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
5e50: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
5e60: 20 20 20 20 54 68 65 20 74 72 61 6e 73 61 63 74      The transact
5e70: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65  ion should be te
5e80: 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22  rminated using "
5e90: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
5ea0: 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73  action". *. */.s
5eb0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
5ec0: 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
5ed0: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
5ee0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
5ef0: 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65  ot) {..cackey_re
5f00: 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65  t cackey_conn_re
5f10: 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74  t;..LONG scard_t
5f20: 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  rans_ret;...CACK
5f30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5f40: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61  "Called.");...ca
5f50: 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  ckey_conn_ret = 
5f60: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
5f70: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
5f80: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
5f90: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
5fa0: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
5fb0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
5fc0: 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20  able to connect 
5fd0: 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
5fe0: 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a  ng in error");..
5ff0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6000: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6010: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
6020: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b  saction_depth++;
6030: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
6040: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
6050: 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   1) {...CACKEY_D
6060: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 6c 72  EBUG_PRINTF("Alr
6070: 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e 73 61  eady in a transa
6080: 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e  ction, performin
6090: 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77  g no action (new
60a0: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
60b0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
60c0: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75  _depth);....retu
60d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
60e0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  _OK);..}...scard
60f0: 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61  _trans_ret = SCa
6100: 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  rdBeginTransacti
6110: 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  on(slot->pcsc_ca
6120: 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  rd);..if (scard_
6130: 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41  trans_ret != SCA
6140: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
6150: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6160: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
6170: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
6180: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
6190: 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74   error");....ret
61a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
61b0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
61c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
61d0: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
61e0: 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74  y began transact
61f0: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29  ion on slot (%s)
6200: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
6210: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ader);...return(
6220: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6230: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
6240: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
6250: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e  ey_ret cackey_en
6260: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  d_transaction(st
6270: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
6280: 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41   *slot);. *. * A
6290: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
62a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
62b0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
62c0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
62d0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55  ds to. *. * RETU
62e0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
62f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6300: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
6310: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
6320: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6330: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
6340: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
6350: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
6360: 71 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62  quires "cackey_b
6370: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
6380: 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  " to be called f
6390: 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  irst. *. */.stat
63a0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
63b0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
63c0: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
63d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
63e0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61  ..LONG scard_tra
63f0: 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ns_ret;...CACKEY
6400: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6410: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
6420: 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  !slot->pcsc_card
6430: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
6440: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6450: 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74  NTF("Card is not
6460: 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62   connected, unab
6470: 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61  le to end transa
6480: 63 74 69 6f 6e 22 29 3b 0a 0a 09 09 72 65 74 75  ction");....retu
6490: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
64a0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
64b0: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
64c0: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30  ction_depth == 0
64d0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
64e0: 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69  UG_PRINTF("Termi
64f0: 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  nating a transac
6500: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
6510: 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72  t begun!");....r
6520: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6530: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
6540: 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
6550: 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09  tion_depth--;...
6560: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
6570: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
6580: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
6590: 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61  G_PRINTF("Transa
65a0: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20  ctions still in 
65b0: 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65  progress, not te
65c0: 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72  rminating on-car
65d0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63  d Transaction (c
65e0: 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25  urrent depth = %
65f0: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
6600: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
6610: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6620: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6630: 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e  ..}...scard_tran
6640: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64  s_ret = SCardEnd
6650: 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  Transaction(slot
6660: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
6670: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
6680: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
6690: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
66a0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
66b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
66c0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  ("Unable to end 
66d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
66e0: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
66f0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
6700: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6710: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
6720: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
6730: 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69  ucessfully termi
6740: 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  nated transactio
6750: 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c  n on slot (%s)",
6760: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
6770: 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  er);...return(CA
6780: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
6790: 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61  .}../* APDU Rela
67a0: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
67b0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
67c0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
67d0: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
67e0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
67f0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
6800: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
6810: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6820: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
6830: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
6840: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
6850: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
6860: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
6870: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
6880: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
6890: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
68a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
68b0: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
68c0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a  espdata_len);. *
68d0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
68e0: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
68f0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
6900: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
6910: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
6920: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6930: 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20  ar class. *     
6940: 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28      APDU Class (
6950: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
6960: 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41  816 or GSCIS_CLA
6970: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
6980: 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73  RM. *         us
6990: 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a  ually), (CLA). *
69a0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
69b0: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
69c0: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  n. *         APD
69d0: 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49  U Instruction (I
69e0: 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  NS). *. *     un
69f0: 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20  signed char p1. 
6a00: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50  *         APDU P
6a10: 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a  arameter 1 (P1).
6a20: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
6a30: 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20  ed char p2. *   
6a40: 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d        APDU Param
6a50: 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20  eter 2 (P2). *. 
6a60: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
6a70: 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20  har lc. *       
6a80: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66    APDU Length of
6a90: 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d   Content (Lc) --
6aa0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
6ab0: 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a  gth of "data". *
6ac0: 20 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74           paramet
6ad0: 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69  er.  If "data" i
6ae0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  s specified as N
6af0: 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65  ULL, this parame
6b00: 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  ter will. *     
6b10: 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a      be ignored..
6b20: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
6b30: 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a  ed char *data. *
6b40: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
6b50: 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65   to buffer to se
6b60: 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62  nd.  It should b
6b70: 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e  e "Lc" bytes lon
6b80: 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20  g.  If. *       
6b90: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e    specified as N
6ba0: 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e  ULL, "Lc" will n
6bb0: 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20  ot be sent, and 
6bc0: 74 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c  this buffer will
6bd0: 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69   be. *         i
6be0: 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  gnored.. *. *   
6bf0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6c00: 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  le. *         AP
6c10: 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70  DU Length of Exp
6c20: 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d  ectation (Le) --
6c30: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
6c40: 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20  gth of the. *   
6c50: 20 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72        expected r
6c60: 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69  eply.  If this i
6c70: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30  s specified as 0
6c80: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
6c90: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20  t. *         be 
6ca0: 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  sent.. *. *     
6cb0: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
6cc0: 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  de. *         [O
6cd0: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT] Pointer to s
6ce0: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72  torage of APDU r
6cf0: 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49  esponse code.  I
6d00: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20  f this is. *    
6d10: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
6d20: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70  s NULL, the resp
6d30: 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62  onse code will b
6d40: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
6d50: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
6d60: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20  char *respdata. 
6d70: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
6d80: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61  Pointer to stora
6d90: 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f  ge of APDU respo
6da0: 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68  nse data.  If th
6db0: 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  is is. *        
6dc0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
6dd0: 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65  LL, the response
6de0: 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69   data will be di
6df0: 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20  scarded.  If. * 
6e00: 20 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73          the "res
6e10: 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d  pdata_len" param
6e20: 65 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65  eter is specifie
6e30: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
6e40: 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20  buffer. *       
6e50: 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70    will not be up
6e60: 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  dated.. *. *    
6e70: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74   size_t *respdat
6e80: 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  a_len. *        
6e90: 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74   [IN, OUT] Point
6ea0: 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f  er initialing co
6eb0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a  ntaining the siz
6ec0: 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61  e of the "respda
6ed0: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62  ta". *         b
6ee0: 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72  uffer.  Before r
6ef0: 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f  eturning, the po
6f00: 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69  inted to value i
6f10: 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65  s updated to the
6f20: 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62  . *         numb
6f30: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
6f40: 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65  ten to the buffe
6f50: 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  r.  If this is s
6f60: 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20  pecified as. *  
6f70: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20         NULL, it 
6f80: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
6f90: 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61  ted, and "respda
6fa0: 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ta" will be igno
6fb0: 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20  red causing. *  
6fc0: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f         the respo
6fd0: 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64  nse data to be d
6fe0: 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20  iscarded.. *. * 
6ff0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
7000: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
7010: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f  S_OK           O
7020: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
7030: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
7040: 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65  ENERIC      On e
7050: 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b  rror. *     CACK
7060: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
7070: 42 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65  BSENT  If the se
7080: 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63  nding failed bec
7090: 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69  ause the token i
70a0: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20  s. *            
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a      absent. *. *
70d0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
70e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
70f0: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
7100: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
7110: 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20   Manager via. * 
7120: 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f      cackey_pcsc_
7130: 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65  connect() if nee
7140: 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49  ded.. *. *     I
7150: 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  t will connect t
7160: 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68  o the card in th
7170: 65 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65  e reader attache
7180: 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a  d to the slot. *
7190: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20       specified. 
71a0: 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65   It will reconne
71b0: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
71c0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
71d0: 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61  . *     goes awa
71e0: 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  y.. *. */.static
71f0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7200: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72  ey_send_apdu(str
7210: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7220: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
7230: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69  char class, unsi
7240: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
7250: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20  ction, unsigned 
7260: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65  char p1, unsigne
7270: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67  d char p2, unsig
7280: 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73  ned char lc, uns
7290: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
72a0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
72b0: 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65  le, uint16_t *re
72c0: 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64  spcode, unsigned
72d0: 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c   char *respdata,
72e0: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74   size_t *respdat
72f0: 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f  a_len) {..uint8_
7300: 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f  t major_rc, mino
7310: 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79  r_rc;..size_t by
7320: 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70  tes_to_copy, tmp
7330: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09  _respdata_len;..
7340: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a  DWORD protocol;.
7350: 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c  .DWORD xmit_len,
7360: 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47   recv_len;..LONG
7370: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c   scard_xmit_ret,
7380: 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65   scard_reconn_re
7390: 74 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75  t;..BYTE xmit_bu
73a0: 66 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75  f[1024], recv_bu
73b0: 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63  f[1024];..int pc
73c0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20  sc_connect_ret, 
73d0: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
73e0: 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41  ;..int idx;...CA
73f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7400: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
7410: 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43  if (!slot) {...C
7420: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7430: 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74  TF("Invalid slot
7440: 20 73 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a   specified.");..
7450: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7460: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
7470: 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ..}...pcsc_conne
7480: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
7490: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
74a0: 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
74b0: 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
74c0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
74d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
74e0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
74f0: 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
7500: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
7510: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
7520: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7530: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7540: 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f  ../* Transmit */
7550: 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a  ..xmit_len = 0;.
7560: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
7570: 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09  en++] = class;..
7580: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
7590: 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74 69  n++] = instructi
75a0: 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  on;..xmit_buf[xm
75b0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a  it_len++] = p1;.
75c0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
75d0: 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20  en++] = p2;..if 
75e0: 28 64 61 74 61 29 20 7b 0a 09 09 78 6d 69 74 5f  (data) {...xmit_
75f0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
7600: 3d 20 6c 63 3b 0a 09 09 66 6f 72 20 28 69 64 78  = lc;...for (idx
7610: 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20   = 0; idx < lc; 
7620: 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74  idx++) {....xmit
7630: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
7640: 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09   = data[idx];...
7650: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d  }..}...if (le !=
7660: 20 30 78 30 30 29 20 7b 0a 09 09 78 6d 69 74 5f   0x00) {...xmit_
7670: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
7680: 3d 20 6c 65 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65  = le;..}.../* Be
7690: 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72  gin Smartcard Tr
76a0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
76b0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
76c0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
76d0: 69 66 20 28 63 6c 61 73 73 20 3d 3d 20 47 53 43  if (class == GSC
76e0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
76f0: 20 26 26 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   && instruction 
7700: 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  == GSCIS_INSTR_V
7710: 45 52 49 46 59 20 26 26 20 70 31 20 3d 3d 20 30  ERIFY && p1 == 0
7720: 78 30 30 20 26 26 20 70 32 20 3d 3d 20 30 78 30  x00 && p2 == 0x0
7730: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
7740: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6e 64  BUG_PRINTF("Send
7750: 69 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73  ing APDU: <<cens
7760: 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73  ored>>");..} els
7770: 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  e {...CACKEY_DEB
7780: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6e  UG_PRINTBUF("Sen
7790: 64 69 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d 69  ding APDU:", xmi
77a0: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29  t_buf, xmit_len)
77b0: 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20  ;..}...recv_len 
77c0: 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75  = sizeof(recv_bu
77d0: 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f  f);..scard_xmit_
77e0: 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73  ret = SCardTrans
77f0: 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  mit(slot->pcsc_c
7800: 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54  ard, SCARD_PCI_T
7810: 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  0, xmit_buf, xmi
7820: 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63  t_len, NULL, rec
7830: 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e  v_buf, &recv_len
7840: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  );..if (scard_xm
7850: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
7860: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
7870: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7880: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
7890: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
78a0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
78b0: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43   = %s/%lx)", CAC
78c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
78d0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
78e0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
78f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
7900: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
7910: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7920: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
7930: 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62  slot as having b
7940: 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 0a 09 09  een reset");....
7950: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7960: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73  n_depth = 0;...s
7970: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20  lot->slot_reset 
7980: 3d 20 31 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  = 1;....if (scar
7990: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
79a0: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
79b0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
79c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
79d0: 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61  t required, plea
79e0: 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09  se hold...");...
79f0: 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  ..scard_reconn_r
7a00: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7a10: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7a20: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7a30: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7a40: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52  ROTOCOL_T0, SCAR
7a50: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 70  D_RESET_CARD, &p
7a60: 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20  rotocol);....if 
7a70: 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  (scard_reconn_re
7a80: 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
7a90: 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52  CESS) {...../* R
7aa0: 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e  e-establish tran
7ab0: 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77  saction, if it w
7ac0: 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09  as present */...
7ad0: 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
7ae0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
7af0: 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  0) {......slot->
7b00: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
7b10: 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  h--;......cackey
7b20: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
7b30: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a  on(slot);.....}.
7b40: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7b50: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
7b60: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72  successful, retr
7b70: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09  ansmitting");...
7b80: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
7b90: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
7ba0: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  ....scard_xmit_r
7bb0: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
7bc0: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
7bd0: 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30  rd, SCARD_PCI_T0
7be0: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
7bf0: 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76  _len, NULL, recv
7c00: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29  _buf, &recv_len)
7c10: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64  ;......if (scard
7c20: 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41  _xmit_ret != SCA
7c30: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
7c40: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7c50: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e  G_PRINTF("Retran
7c60: 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74  smit failed, ret
7c70: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7c80: 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65  e after disconne
7c90: 63 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28  cting the card (
7ca0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20  SCardTransmit = 
7cb0: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
7cc0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
7cd0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
7ce0: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f  d_xmit_ret), (lo
7cf0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
7d00: 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64  et);.......SCard
7d10: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
7d20: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
7d30: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
7d40: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
7d50: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
7d60: 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20  0;......./* End 
7d70: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
7d80: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c  ction */......sl
7d90: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
7da0: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09  depth = 1;......
7db0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
7dc0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
7dd0: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7de0: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
7df0: 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09  SENT);.....}....
7e00: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
7e10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7e20: 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  ("Disconnecting 
7e30: 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61  card");......SCa
7e40: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
7e50: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7e60: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
7e70: 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f  .....slot->pcsc_
7e80: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
7e90: 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20   0;....../* End 
7ea0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
7eb0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f  ction */.....slo
7ec0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
7ed0: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61  epth = 1;.....ca
7ee0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
7ef0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
7f00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7f10: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
7f20: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09  in failure");...
7f30: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7f40: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
7f50: 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  NT);....}...} el
7f60: 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
7f70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73  EBUG_PRINTF("Dis
7f80: 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22  connecting card"
7f90: 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63  );.....SCardDisc
7fa0: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
7fb0: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
7fc0: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c  AVE_CARD);....sl
7fd0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7fe0: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
7ff0: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
8000: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
8010: 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
8020: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b  ction_depth = 1;
8030: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
8040: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
8050: 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
8060: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
8070: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
8080: 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
8090: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
80a0: 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a  ABSENT);...}..}.
80b0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
80c0: 52 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65  RINTBUF("Returne
80d0: 64 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f  d Value:", recv_
80e0: 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  buf, recv_len);.
80f0: 0a 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c  ..if (recv_len <
8100: 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d   2) {.../* Minim
8110: 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67  al response leng
8120: 74 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72  th is 2 bytes, r
8130: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
8140: 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ure */...CACKEY_
8150: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
8160: 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c  sponse too small
8170: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
8180: 61 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e  ailure (recv_len
8190: 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67   = %lu)", (unsig
81a0: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
81b0: 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53  en);..../* End S
81c0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
81d0: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
81e0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
81f0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72  (slot);....retur
8200: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
8210: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
8220: 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75  * Determine resu
8230: 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f  lt code */..majo
8240: 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b  r_rc = recv_buf[
8250: 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09  recv_len - 2];..
8260: 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f  minor_rc = recv_
8270: 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31  buf[recv_len - 1
8280: 5d 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65  ];..if (respcode
8290: 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20  ) {...*respcode 
82a0: 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38  = (major_rc << 8
82b0: 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d  ) | minor_rc;..}
82c0: 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73  .../* Adjust mes
82d0: 73 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09  sage buffer */..
82e0: 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a  recv_len -= 2;..
82f0: 09 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f  ./* Add bytes to
8300: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
8310: 0a 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  ..tmp_respdata_l
8320: 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73  en = 0;..if (res
8330: 70 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74  pdata && respdat
8340: 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72  a_len) {...tmp_r
8350: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72  espdata_len = *r
8360: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
8370: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
8380: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a  *respdata_len;..
8390: 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c  ..if (recv_len <
83a0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20   bytes_to_copy) 
83b0: 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f  {....bytes_to_co
83c0: 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09  py = recv_len;..
83d0: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
83e0: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69  UG_PRINTF("Copyi
83f0: 6e 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20  ng %lu bytes to 
8400: 74 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76  the buffer (recv
8410: 27 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75  'd %lu bytes, bu
8420: 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73  t only %lu bytes
8430: 20 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66   left in our buf
8440: 66 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  fer)", (unsigned
8450: 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f   long) bytes_to_
8460: 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  copy, (unsigned 
8470: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20  long) recv_len, 
8480: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
8490: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  *respdata_len);.
84a0: 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61  ...memcpy(respda
84b0: 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79  ta, recv_buf, by
84c0: 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09  tes_to_copy);...
84d0: 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65  respdata += byte
84e0: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72  s_to_copy;....*r
84f0: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79  espdata_len = by
8500: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74  tes_to_copy;...t
8510: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  mp_respdata_len 
8520: 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  -= bytes_to_copy
8530: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
8540: 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29   (recv_len != 0)
8550: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8560: 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77  UG_PRINTF("Throw
8570: 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74  ing away %lu byt
8580: 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70  es, nowhere to p
8590: 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69  ut them!", (unsi
85a0: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f  gned long) recv_
85b0: 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  len);...}..}...i
85c0: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30  f (major_rc == 0
85d0: 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e  x61) {.../* We n
85e0: 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09  eed to READ */..
85f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8600: 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61  INTF("Buffer rea
8610: 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09  d required");...
8620: 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d  .if (minor_rc ==
8630: 20 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f   0x00) {....mino
8640: 72 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50  r_rc = CACKEY_AP
8650: 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70  DU_MTU;...}....p
8660: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
8670: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
8680: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
8690: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
86a0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45  CIS_INSTR_GET_RE
86b0: 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78  SPONSE, 0x00, 0x
86c0: 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e  00, 0, NULL, min
86d0: 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c  or_rc, respcode,
86e0: 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f   respdata, &tmp_
86f0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 09  respdata_len);..
8700: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
8710: 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  p_ret != CACKEY_
8720: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
8730: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8740: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
8750: 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e   failed!  Return
8760: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8770: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
8780: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
8790: 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
87a0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
87b0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  slot);.....retur
87c0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
87d0: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
87e0: 09 69 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65  .if (respdata_le
87f0: 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74  n) {....*respdat
8800: 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73  a_len += tmp_res
8810: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a  pdata_len;...}..
8820: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
8830: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
8840: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
8850: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
8860: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
8870: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
8880: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28  ing in success (
8890: 62 75 66 66 65 72 20 72 65 61 64 20 63 6f 6d 70  buffer read comp
88a0: 6c 65 74 65 29 22 29 3b 0a 09 09 72 65 74 75 72  lete)");...retur
88b0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
88c0: 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64  OK);..}.../* End
88d0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
88e0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
88f0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
8900: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d  n(slot);...if (m
8910: 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29  ajor_rc == 0x90)
8920: 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20   {.../* Success 
8930: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
8940: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
8950: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28  ing in success (
8960: 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29  major_rc = 0x90)
8970: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
8980: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
8990: 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
89a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55  BUG_PRINTF("APDU
89b0: 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   Returned an err
89c0: 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  or, returning in
89d0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65   failure");...re
89e0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
89f0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a  _E_GENERIC);.}..
8a00: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
8a10: 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61  *     ssize_t ca
8a20: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
8a30: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8a40: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
8a50: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
8a60: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
8a70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
8a80: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
8a90: 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a  tial_offset);. *
8aa0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
8ab0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
8ac0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
8ad0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
8ae0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
8af0: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
8b00: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
8b10: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  r. *         [OU
8b20: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20  T] Buffer. *. * 
8b30: 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74      size_t count
8b40: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62  . *         Numb
8b50: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
8b60: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20  ttempt to read. 
8b70: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
8b80: 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a  d char t_or_v. *
8b90: 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
8ba0: 74 68 65 20 54 2d 62 75 66 66 65 72 20 28 30 31  the T-buffer (01
8bb0: 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30  ) or V-buffer (0
8bc0: 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e  2) to read from.
8bd0: 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a    . *. *     siz
8be0: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
8bf0: 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70  et. *         Sp
8c00: 65 63 69 66 79 20 74 68 65 20 6f 66 66 73 65 74  ecify the offset
8c10: 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65   to begin the re
8c20: 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a  ad from. *. *. *
8c30: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
8c40: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
8c50: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
8c60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
8c70: 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72  ctually read, or
8c80: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a   -1 on error.. *
8c90: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
8ca0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
8cb0: 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
8cc0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
8cd0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8ce0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
8cf0: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
8d00: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
8d10: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
8d20: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
8d30: 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 73 69  al_offset) {..si
8d40: 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c  ze_t offset = 0,
8d50: 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78   max_offset, max
8d60: 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65  _count;..unsigne
8d70: 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09  d char cmd[2];..
8d80: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
8d90: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
8da0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
8db0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
8dc0: 22 29 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74  ");...max_offset
8dd0: 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63   = count;..max_c
8de0: 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41 50  ount = CACKEY_AP
8df0: 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74 5f  DU_MTU;...if (t_
8e00: 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f 6f  or_v != 1 && t_o
8e10: 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43 41  r_v != 2) {...CA
8e20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8e30: 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72 20  F("Invalid T or 
8e40: 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  V parameter spec
8e50: 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ified, returning
8e60: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
8e70: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
8e80: 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72  ...cmd[0] = t_or
8e90: 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20  _v;...while (1) 
8ea0: 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20 3e  {...if (offset >
8eb0: 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a  = max_offset) {.
8ec0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8ed0: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 74  PRINTF("Buffer t
8ee0: 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e  oo small, return
8ef0: 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74 2e  ing what we got.
8f00: 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  ..");.....break;
8f10: 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20  ...}....count = 
8f20: 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66  max_offset - off
8f30: 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74  set;...if (count
8f40: 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a   > max_count) {.
8f50: 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63  ...count = max_c
8f60: 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64  ount;...}....cmd
8f70: 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09  [1] = count;....
8f80: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
8f90: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
8fa0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  , GSCIS_CLASS_GL
8fb0: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47  OBAL_PLATFORM, G
8fc0: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
8fd0: 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69 61  BUFFER, ((initia
8fe0: 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65  l_offset + offse
8ff0: 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 2c  t) >> 8) & 0xff,
9000: 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74   (initial_offset
9010: 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78 66   + offset) & 0xf
9020: 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20  f, sizeof(cmd), 
9030: 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73 70  cmd, 0x00, &resp
9040: 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20 6f  code, buffer + o
9050: 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a  ffset, &count);.
9060: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
9070: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
9080: 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65 73  OK) {....if (res
9090: 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36 29  pcode == 0x6A86)
90a0: 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f 63   {.....if (max_c
90b0: 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09  ount == 1) {....
90c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
90d0: 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  ....max_count = 
90e0: 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a  max_count / 2;..
90f0: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
9100: 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
9110: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
9120: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66  ey_send_apdu() f
9130: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
9140: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
9150: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
9160: 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20  .}....offset += 
9170: 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f  count;....if (co
9180: 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29  unt < max_count)
9190: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
91a0: 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72 74  UG_PRINTF("Short
91b0: 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d   read -- count =
91c0: 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69   %i, cmd[1] = %i
91d0: 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20  ", (int) count, 
91e0: 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a  (int) cmd[1]);..
91f0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
9200: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
9210: 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
9220: 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
9230: 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e  AX..if (offset >
9240: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
9250: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
9260: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
9270: 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  et exceeds maxim
9280: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
9290: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
92a0: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73  (max = %li, offs
92b0: 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  et = %lu)", (lon
92c0: 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
92d0: 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
92e0: 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09  ong) offset);...
92f0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
9300: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
9310: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9320: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
9330: 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61   in success, rea
9340: 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75  d %lu bytes", (u
9350: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
9360: 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  fset);...return(
9370: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  offset);.}../*. 
9380: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
9390: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
93a0: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
93b0: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
93c0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
93d0: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20  gned char *aid, 
93e0: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b  size_t aid_len);
93f0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
9400: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
9410: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
9420: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
9430: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
9440: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
9450: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
9460: 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75 66  d. *         Buf
9470: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41  fer containing A
9480: 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65  pplet ID to sele
9490: 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  ct. *. *     siz
94a0: 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20  e_t aid_len. *  
94b0: 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66         Number of
94c0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22 61   bytes in the "a
94d0: 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29 20  id" (Applet ID) 
94e0: 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20  parameter. *. * 
94f0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
9500: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9510: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
9520: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
9530: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9540: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
9550: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
9560: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
9570: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
9580: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
9590: 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61  applet(struct ca
95a0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
95b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
95c0: 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f  aid, size_t aid_
95d0: 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64  len) {..int send
95e0: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
95f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
9600: 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
9610: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
9620: 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65  "Selecting apple
9630: 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65  t:", aid, aid_le
9640: 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d  n);...send_ret =
9650: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
9660: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
9670: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
9680: 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c  IS_INSTR_SELECT,
9690: 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c   GSCIS_PARAM_SEL
96a0: 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 30  ECT_APPLET, 0x00
96b0: 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20  , aid_len, aid, 
96c0: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
96d0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
96e0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
96f0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
9700: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9710: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f  NTF("Failed to o
9720: 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75  pen applet, retu
9730: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
9740: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
9750: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
9760: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
9770: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9780: 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c  Successfully sel
9790: 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09  ected file");...
97a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
97b0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
97c0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
97d0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
97e0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
97f0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
9800: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31  lot *slot, uint1
9810: 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41  6_t ef);. *. * A
9820: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
9830: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
9840: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
9850: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
9860: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
9870: 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20   *     uint16_t 
9880: 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c  ef. *         El
9890: 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20  emental File to 
98a0: 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54  select. *. * RET
98b0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
98c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
98d0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
98e0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
98f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9900: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
9910: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
9920: 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e   This selects an
9930: 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65   Elementary File
9940: 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65 20   (EF) under the 
9950: 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74  currently select
9960: 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61  ed. *     Dedica
9970: 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a  ted File (DF). *
9980: 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c  . *     Typicall
9990: 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  y this is called
99a0: 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67   after selecting
99b0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70 70   the correct App
99c0: 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20  let (using. *   
99d0: 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f    cackey_select_
99e0: 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63  applet) for VM c
99f0: 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  ards. *. */.stat
9a00: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
9a10: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
9a20: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
9a30: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31  lot *slot, uint1
9a40: 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67  6_t ef) {..unsig
9a50: 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75 66  ned char fid_buf
9a60: 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  [2];..int send_r
9a70: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
9a80: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
9a90: 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20  d.");.../* Open 
9aa0: 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66  the elementary f
9ab0: 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b  ile */..fid_buf[
9ac0: 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26  0] = (ef >> 8) &
9ad0: 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b   0xff;..fid_buf[
9ae0: 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a  1] = ef & 0xff;.
9af0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9b00: 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67  RINTF("Selecting
9b10: 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28   file: %04lx", (
9b20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65  unsigned long) e
9b30: 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d  f);...send_ret =
9b40: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
9b50: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
9b60: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
9b70: 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c  IS_INSTR_SELECT,
9b80: 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a   0x02, 0x0C, siz
9b90: 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69  eof(fid_buf), fi
9ba0: 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c  d_buf, 0x00, NUL
9bb0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
9bc0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
9bd0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
9be0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
9bf0: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
9c00: 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c  ed to open file,
9c10: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
9c20: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
9c30: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
9c40: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
9c50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9c60: 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c  NTF("Successfull
9c70: 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22  y selected file"
9c80: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
9c90: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
9ca0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
9cb0: 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63  . *     void cac
9cc0: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72  key_free_tlv(str
9cd0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
9ce0: 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a  ntity *root);. *
9cf0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
9d00: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
9d10: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72  ey_tlv_entity *r
9d20: 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52  oot. *         R
9d30: 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c  oot of the TLV l
9d40: 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72 65  ist to start fre
9d50: 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52  eing. *. * RETUR
9d60: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
9d70: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
9d80: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
9d90: 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54  tion frees the T
9da0: 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64  LV linked listed
9db0: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20   returned from. 
9dc0: 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65  *     "cackey_re
9dd0: 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73  ad_tlv". *. */.s
9de0: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
9df0: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
9e00: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
9e10: 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74  ity *root) {..st
9e20: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
9e30: 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e  entity *curr, *n
9e40: 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20  ext;...if (root 
9e50: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
9e60: 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63  urn;..}...for (c
9e70: 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72  urr = root; curr
9e80: 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b  ; curr = next) {
9e90: 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e  ...next = curr->
9ea0: 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68  _next;....switch
9eb0: 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09   (curr->tag) {..
9ec0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
9ed0: 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63  _ACR_TABLE:....c
9ee0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
9ef0: 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69  RTIFICATE:.....i
9f00: 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20  f (curr->value) 
9f10: 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
9f20: 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a  ->value);.....}.
9f30: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
9f40: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
9f50: 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75  DURL:.....if (cu
9f60: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
9f70: 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  l) {......free(c
9f80: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
9f90: 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62  rl);.....}.....b
9fa0: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65  reak;...}....fre
9fb0: 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65  e(curr);..}...re
9fc0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  turn;.}../*. * S
9fd0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
9fe0: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
9ff0: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
a000: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
a010: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
a020: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
a030: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
a040: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74   struct cackey_t
a050: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  lv_entity *cacke
a060: 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63  y_read_tlv(struc
a070: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
a080: 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  lot) {..struct c
a090: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
a0a0: 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a   *curr_entity, *
a0b0: 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61  root = NULL, *la
a0c0: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69  st = NULL;..unsi
a0d0: 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62  gned char tlen_b
a0e0: 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b  uf[2], tval_buf[
a0f0: 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75  1024], *tval;..u
a100: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65  nsigned char vle
a110: 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62  n_buf[2], vval_b
a120: 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b  uf[8192], *vval;
a130: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
a140: 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e  *tmpbuf;..unsign
a150: 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65  ed long tmpbufle
a160: 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e  n;..ssize_t tlen
a170: 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74  , vlen;..ssize_t
a180: 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65   read_ret;..size
a190: 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c  _t offset_t = 0,
a1a0: 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09   offset_v = 0;..
a1b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
a1c0: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74  g;..size_t lengt
a1d0: 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c  h;.#ifdef HAVE_L
a1e0: 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72  IBZ..int uncompr
a1f0: 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a  ess_ret;.#endif.
a200: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a210: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
a220: 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63  ;...read_ret = c
a230: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
a240: 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66  r(slot, tlen_buf
a250: 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75  , sizeof(tlen_bu
a260: 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29  f), 1, offset_t)
a270: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
a280: 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62  != sizeof(tlen_b
a290: 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  uf)) {...CACKEY_
a2a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
a2b0: 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  ad failed, retur
a2c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a2d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
a2e0: 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20  L);..}...tlen = 
a2f0: 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20  (tlen_buf[1] << 
a300: 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d  8) | tlen_buf[0]
a310: 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63  ;...read_ret = c
a320: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
a330: 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66  r(slot, vlen_buf
a340: 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75  , sizeof(vlen_bu
a350: 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29  f), 2, offset_v)
a360: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
a370: 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62  != sizeof(vlen_b
a380: 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  uf)) {...CACKEY_
a390: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
a3a0: 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  ad failed, retur
a3b0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a3c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
a3d0: 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20  L);..}...vlen = 
a3e0: 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20  (vlen_buf[1] << 
a3f0: 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d  8) | vlen_buf[0]
a400: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
a410: 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e  _PRINTF("Tag Len
a420: 67 74 68 20 3d 20 25 69 2c 20 56 61 6c 75 65 20  gth = %i, Value 
a430: 4c 65 6e 67 74 68 20 3d 20 25 69 22 2c 20 74 6c  Length = %i", tl
a440: 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66  en, vlen);...off
a450: 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66  set_t += 2;..off
a460: 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66  set_v += 2;...if
a470: 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (tlen > sizeof(
a480: 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  tval_buf)) {...C
a490: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a4a0: 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69  TF("Tag length i
a4b0: 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74  s too large, ret
a4c0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
a4d0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
a4e0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76  ULL);..}...if (v
a4f0: 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61  len > sizeof(vva
a500: 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  l_buf)) {...CACK
a510: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a520: 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73  "Value length is
a530: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
a540: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
a550: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
a560: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72  LL);..}...read_r
a570: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
a580: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76  _buffer(slot, tv
a590: 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c  al_buf, tlen, 1,
a5a0: 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20   offset_t);..if 
a5b0: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65  (read_ret != tle
a5c0: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
a5d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
a5e0: 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72  le to read entir
a5f0: 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75  e T-buffer, retu
a600: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
a610: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
a620: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72  LL);..}...read_r
a630: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
a640: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76  _buffer(slot, vv
a650: 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c  al_buf, vlen, 2,
a660: 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20   offset_v);..if 
a670: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65  (read_ret != vle
a680: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
a690: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
a6a0: 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72  le to read entir
a6b0: 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75  e V-buffer, retu
a6c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
a6d0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
a6e0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d  LL);..}...tval =
a6f0: 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c   tval_buf;..vval
a700: 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68   = vval_buf;..wh
a710: 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26  ile (tlen > 0 &&
a720: 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74   vlen > 0) {...t
a730: 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76  ag = *tval;...tv
a740: 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a  al++;...tlen--;.
a750: 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20  ...if (*tval == 
a760: 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74  0xff) {....lengt
a770: 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20  h = (tval[2] << 
a780: 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09  8) | tval[1];...
a790: 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74  .tval += 3;....t
a7a0: 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c  len -= 3;...} el
a7b0: 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d  se {....length =
a7c0: 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b   *tval;....tval+
a7d0: 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09  +;....tlen--;...
a7e0: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
a7f0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25  G_PRINTF("Tag: %
a800: 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45  s (%02x)", CACKE
a810: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
a820: 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75  _TO_STR(tag), (u
a830: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67  nsigned int) tag
a840: 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
a850: 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75  G_PRINTBUF("Valu
a860: 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  e:", vval, lengt
a870: 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69  h);....curr_enti
a880: 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69  ty = NULL;...swi
a890: 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63  tch (tag) {....c
a8a0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
a8b0: 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f  RDURL:.....curr_
a8c0: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
a8d0: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
a8e0: 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f  ity));.....curr_
a8f0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
a900: 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  rdurl = malloc(s
a910: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
a920: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a930: 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79  l));......memcpy
a940: 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  (curr_entity->va
a950: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
a960: 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09  , vval, 5);.....
a970: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
a980: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
a990: 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09  ype = vval[5];..
a9a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a9b0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
a9c0: 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b  bjectid = (vval[
a9d0: 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b  6] << 8) | vval[
a9e0: 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  7];.....curr_ent
a9f0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
aa00: 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61  rl->appid = (vva
aa10: 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61  l[8] << 8) | vva
aa20: 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f  l[9];......curr_
aa30: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
aa40: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
aa50: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
aa60: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
aa70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
aa80: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63  ACR_TABLE:.....c
aa90: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
aaa0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
aab0: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74  _entity));.....t
aac0: 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c  mpbuf = malloc(l
aad0: 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d  ength);......mem
aae0: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
aaf0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  , length);......
ab00: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
ab10: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
ab20: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
ab30: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75  = length;.....cu
ab40: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
ab50: 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63   = tmpbuf;.....c
ab60: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
ab70: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
ab80: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
ab90: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
aba0: 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  ATE:.....curr_en
abb0: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
abc0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
abd0: 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56  y));..#ifdef HAV
abe0: 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75  E_LIBZ.....tmpbu
abf0: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20  flen = length * 
ac00: 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  2;.....tmpbuf = 
ac10: 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
ac20: 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65  );......uncompre
ac30: 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72  ss_ret = uncompr
ac40: 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70  ess(tmpbuf, &tmp
ac50: 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65  buflen, vval, le
ac60: 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75  ngth);.....if (u
ac70: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d  ncompress_ret !=
ac80: 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41   Z_OK) {......CA
ac90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
aca0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63  F("Failed to dec
acb0: 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72  ompress, uncompr
acc0: 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25  ess() returned %
acd0: 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74  i -- resorting t
ace0: 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20  o direct copy", 
acf0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b  uncompress_ret);
ad00: 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  .......tmpbuflen
ad10: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09   = length;......
ad20: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
ad30: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
ad40: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
ad50: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
ad60: 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a  Decompressed to:
ad70: 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ", tmpbuf, tmpbu
ad80: 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09  flen);.#else....
ad90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ada0: 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c  INTF("Missing ZL
adb0: 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73  IB Support, this
adc0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
add0: 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e  likely useless..
ade0: 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66  .");......tmpbuf
adf0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
ae00: 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c  ..memcpy(tmpbuf,
ae10: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
ae20: 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72  #endif......curr
ae30: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
ae40: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
ae50: 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d  ity->length = tm
ae60: 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72  pbuflen;.....cur
ae70: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
ae80: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
ae90: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
aea0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
aeb0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
aec0: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
aed0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
aee0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
aef0: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a  curr_entity));..
af00: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
af10: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
af20: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
af30: 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30  ue_byte = vval[0
af40: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
af50: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
af60: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
af70: 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e  }....vval += len
af80: 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c  gth;...vlen -= l
af90: 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75  ength;....if (cu
afa0: 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c  rr_entity != NUL
afb0: 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74  L) {....if (root
afc0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
afd0: 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  root = curr_enti
afe0: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ty;....}.....if 
aff0: 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  (last != NULL) {
b000: 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74  .....last->_next
b010: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
b020: 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20  ...}.....last = 
b030: 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d  curr_entity;...}
b040: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f  ..}...return(roo
b050: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
b060: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
b070: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
b080: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
b090: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
b0a0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
b0b0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
b0c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
b0d0: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
b0e0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
b0f0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
b100: 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74  y *start, size_t
b110: 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65   count, int free
b120: 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f  _start) {..size_
b130: 74 20 69 64 78 3b 0a 0a 09 66 6f 72 20 28 69 64  t idx;...for (id
b140: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75  x = 0; idx < cou
b150: 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
b160: 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65  f (start[idx].ce
b170: 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09  rtificate) {....
b180: 66 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e  free(start[idx].
b190: 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09  certificate);...
b1a0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f  }..}...if (free_
b1b0: 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28  start) {...free(
b1c0: 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74  start);..}...ret
b1d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  urn;.}../*. * SY
b1e0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
b1f0: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
b200: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
b210: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
b220: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
b230: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
b240: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
b250: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
b260: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  sc_identity *cac
b270: 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
b280: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
b290: 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20  t *slot, struct 
b2a0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
b2b0: 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e 73  tity *certs, uns
b2c0: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e  igned long *coun
b2d0: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
b2e0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
b2f0: 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74 72  y *curr_id;..str
b300: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
b310: 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20  ntity *ccc_tlv, 
b320: 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f  *ccc_curr, *app_
b330: 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a  tlv, *app_curr;.
b340: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
b350: 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49  cc_aid[] = {GSCI
b360: 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 75 6e 73  S_AID_CCC};..uns
b370: 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f  igned char curr_
b380: 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65  aid[7];..unsigne
b390: 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20  d long outidx = 
b3a0: 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74  0;..cackey_ret t
b3b0: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a  ransaction_ret;.
b3c0: 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a  .int certs_resiz
b3d0: 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  able;..int send_
b3e0: 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b  ret, select_ret;
b3f0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b400: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
b410: 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d  );...if (count =
b420: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
b430: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b440: 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  "count is NULL, 
b450: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b460: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
b470: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
b480: 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29   (certs != NULL)
b490: 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20   {...if (*count 
b4a0: 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  == 0) {....CACKE
b4b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b4c0: 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65 74  Requested we ret
b4d0: 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73  urn 0 objects, s
b4e0: 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a  hort-circuit");.
b4f0: 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74 73  ....return(certs
b500: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42  );...}..}.../* B
b510: 65 67 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64  egin a SmartCard
b520: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
b530: 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74  .transaction_ret
b540: 20 3d 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f   = cackey_begin_
b550: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b560: 29 3b 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74  );..if (transact
b570: 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ion_ret != CACKE
b580: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
b590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b5a0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67  INTF("Unable beg
b5b0: 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  in transaction, 
b5c0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b5d0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
b5e0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
b5f0: 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29   (certs == NULL)
b600: 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c   {...certs = mal
b610: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74  loc(sizeof(*cert
b620: 73 29 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e  s) * 5);...*coun
b630: 74 20 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72  t = 5;...certs_r
b640: 65 73 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d  esizable = 1;..}
b650: 20 65 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f   else {...certs_
b660: 72 65 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09  resizable = 0;..
b670: 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68  }.../* Select th
b680: 65 20 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a  e CCC Applet */.
b690: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
b6a0: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
b6b0: 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20  (slot, ccc_aid, 
b6c0: 73 69 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29  sizeof(ccc_aid))
b6d0: 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
b6e0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
b6f0: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
b700: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
b710: 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20 43  able to select C
b720: 43 43 20 41 70 70 6c 65 74 2c 20 72 65 74 75 72  CC Applet, retur
b730: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
b740: 29 3b 0a 0a 09 09 2f 2a 20 54 65 72 6d 69 6e 61  );..../* Termina
b750: 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61  te SmartCard Tra
b760: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
b770: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b780: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72  tion(slot);....r
b790: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
b7a0: 0a 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68  ../* Read all th
b7b0: 65 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74  e applets from t
b7c0: 68 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a  he CCC's TLV */.
b7d0: 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65  .ccc_tlv = cacke
b7e0: 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29  y_read_tlv(slot)
b7f0: 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ;.../* Look for 
b800: 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f  CARDURLs that co
b810: 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20  orespond to PKI 
b820: 61 70 70 6c 65 74 73 20 2a 2f 0a 09 66 6f 72 20  applets */..for 
b830: 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f  (ccc_curr = ccc_
b840: 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 63  tlv; ccc_curr; c
b850: 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 75  cc_curr = ccc_cu
b860: 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 43  rr->_next) {...C
b870: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b880: 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25  TF("Found tag: %
b890: 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f  s ... ", CACKEY_
b8a0: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
b8b0: 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
b8c0: 74 61 67 29 29 3b 0a 0a 09 09 69 66 20 28 63 63  tag));....if (cc
b8d0: 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  c_curr->tag != G
b8e0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
b8f0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
b900: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
b910: 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
b920: 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
b930: 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a  t CARDURLs)");..
b940: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
b950: 0a 0a 09 09 69 66 20 28 28 63 63 63 5f 63 75 72  ....if ((ccc_cur
b960: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
b970: 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b  ->apptype & CACK
b980: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20  EY_TLV_APP_PKI) 
b990: 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  != CACKEY_TLV_AP
b9a0: 50 5f 50 4b 49 29 20 7b 0a 09 09 09 43 41 43 4b  P_PKI) {....CACK
b9b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b9c0: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
b9d0: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
b9e0: 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65   about PKI apple
b9f0: 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20  ts, this applet 
ba00: 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32  supports: %s/%02
ba10: 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  x)", CACKEY_DEBU
ba20: 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54  G_FUNC_APPTYPE_T
ba30: 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
ba40: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
ba50: 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e  pptype), (unsign
ba60: 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72  ed int) ccc_curr
ba70: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
ba80: 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 63  >apptype);.....c
ba90: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
baa0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bab0: 4e 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63 63  NTBUF("RID:", cc
bac0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
bad0: 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65  rdurl->rid, size
bae0: 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  of(ccc_curr->val
baf0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29  ue_cardurl->rid)
bb00: 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
bb10: 47 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44 20  G_PRINTF("AppID 
bb20: 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43  = %s/%04lx", CAC
bb30: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
bb40: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f  BJID_TO_STR(ccc_
bb50: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
bb60: 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e  url->appid), (un
bb70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63  signed long) ccc
bb80: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
bb90: 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09  durl->appid);...
bba0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bbb0: 4e 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20  NTF("ObjectID = 
bbc0: 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45  %s/%04lx", CACKE
bbd0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
bbe0: 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  ID_TO_STR(ccc_cu
bbf0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
bc00: 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75  l->objectid), (u
bc10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63  nsigned long) cc
bc20: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
bc30: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
bc40: 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 63 75 72 72  ;....memcpy(curr
bc50: 5f 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e  _aid, ccc_curr->
bc60: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
bc70: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63  id, sizeof(ccc_c
bc80: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
bc90: 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 63 75 72  rl->rid));...cur
bca0: 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72  r_aid[sizeof(cur
bcb0: 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63  r_aid) - 2] = (c
bcc0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
bcd0: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e  ardurl->appid >>
bce0: 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 63 75   8) & 0xff;...cu
bcf0: 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75  rr_aid[sizeof(cu
bd00: 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63  rr_aid) - 1] = c
bd10: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
bd20: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20  ardurl->appid & 
bd30: 30 78 66 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65  0xff;..../* Sele
bd40: 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 20  ct found applet 
bd50: 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f  ... */...select_
bd60: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
bd70: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
bd80: 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f   curr_aid, sizeo
bd90: 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09  f(curr_aid));...
bda0: 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
bdb0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
bdc0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
bdd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
bde0: 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61  iled to select a
bdf0: 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  pplet, skipping 
be00: 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
be10: 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
be20: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
be30: 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a  ../* ... and obj
be40: 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09  ect (file) */...
be50: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
be60: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
be70: 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e  slot, ccc_curr->
be80: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
be90: 62 6a 65 63 74 69 64 29 3b 0a 09 09 69 66 20 28  bjectid);...if (
bea0: 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41  select_ret != CA
beb0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
bec0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
bed0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
bee0: 20 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 2c   to select file,
bef0: 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
bf00: 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
bf10: 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69  ect");.....conti
bf20: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50  nue;...}..../* P
bf30: 72 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c 65  rocess this file
bf40: 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66  's TLV looking f
bf50: 6f 72 20 63 65 72 74 69 66 69 63 61 74 65 73 20  or certificates 
bf60: 2a 2f 0a 09 09 61 70 70 5f 74 6c 76 20 3d 20 63  */...app_tlv = c
bf70: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
bf80: 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72 20 28 61 70  lot);....for (ap
bf90: 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76  p_curr = app_tlv
bfa0: 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f  ; app_curr; app_
bfb0: 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d  curr = app_curr-
bfc0: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43  >_next) {....CAC
bfd0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bfe0: 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 22  ("Found tag: %s"
bff0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
c000: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61  UNC_TAG_TO_STR(a
c010: 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a  pp_curr->tag));.
c020: 09 09 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d  ...if (app_curr-
c030: 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41  >tag != GSCIS_TA
c040: 47 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  G_CERTIFICATE) {
c050: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
c060: 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
c070: 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20  skipping it (we 
c080: 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
c090: 43 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b  CERTIFICATEs)");
c0a0: 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
c0b0: 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64  ...}.....curr_id
c0c0: 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78   = &certs[outidx
c0d0: 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ];....outidx++;.
c0e0: 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
c0f0: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72 72  id->applet, curr
c100: 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
c110: 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a  r_id->applet));.
c120: 09 09 09 63 75 72 72 5f 69 64 2d 3e 66 69 6c 65  ...curr_id->file
c130: 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   = ccc_curr->val
c140: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
c150: 63 74 69 64 3b 0a 09 09 09 63 75 72 72 5f 69 64  ctid;....curr_id
c160: 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a  ->keysize = -1;.
c170: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c180: 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67  _PRINTF("Filling
c190: 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74   curr_id->applet
c1a0: 20 28 25 70 29 20 77 69 74 68 20 25 6c 75 20 62   (%p) with %lu b
c1b0: 79 74 65 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d  ytes:", curr_id-
c1c0: 3e 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e  >applet, (unsign
c1d0: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28  ed long) sizeof(
c1e0: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29  curr_id->applet)
c1f0: 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
c200: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c  UG_PRINTBUF("VAL
c210: 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 70  :", curr_id->app
c220: 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  let, sizeof(curr
c230: 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a  _id->applet));..
c240: 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
c250: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70  ificate_len = ap
c260: 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a  p_curr->length;.
c270: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
c280: 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
c290: 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  c(curr_id->certi
c2a0: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
c2b0: 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
c2c0: 63 65 72 74 69 66 69 63 61 74 65 2c 20 61 70 70  certificate, app
c2d0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75  _curr->value, cu
c2e0: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
c2f0: 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  te_len);.....if 
c300: 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e  (outidx >= *coun
c310: 74 29 20 7b 0a 09 09 09 09 69 66 20 28 63 65 72  t) {.....if (cer
c320: 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
c330: 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32  .....*count *= 2
c340: 3b 0a 09 09 09 09 09 63 65 72 74 73 20 3d 20 72  ;......certs = r
c350: 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69  ealloc(certs, si
c360: 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28  zeof(*certs) * (
c370: 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 7d 20  *count));.....} 
c380: 65 6c 73 65 20 7b 0a 09 09 09 09 09 62 72 65 61  else {......brea
c390: 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09  k;.....}....}...
c3a0: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
c3b0: 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a  _tlv(app_tlv);..
c3c0: 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20  ..if (outidx >= 
c3d0: 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 65  *count) {....bre
c3e0: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  ak;...}..}...cac
c3f0: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63  key_free_tlv(ccc
c400: 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20  _tlv);...*count 
c410: 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28  = outidx;...if (
c420: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
c430: 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61   {...certs = rea
c440: 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
c450: 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
c460: 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ount));..}.../* 
c470: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
c480: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
c490: 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
c4a0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
c4b0: 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73  ;...return(certs
c4c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
c4d0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
c4e0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
c4f0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
c500: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
c510: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
c520: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
c530: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
c540: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67  ize_t cackey_sig
c550: 6e 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20  ndecrypt(struct 
c560: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
c570: 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
c580: 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
c590: 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
c5a0: 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  ar *buf, size_t 
c5b0: 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  buflen, unsigned
c5c0: 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73   char *outbuf, s
c5d0: 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c  ize_t outbuflen,
c5e0: 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69   int padInput, i
c5f0: 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20  nt unpadOutput) 
c600: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
c610: 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75   *tmpbuf, *tmpbu
c620: 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 3b 0a  f_s, *outbuf_s;.
c630: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
c640: 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31  ytes_to_send, p1
c650: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
c660: 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63   blocktype;..cac
c670: 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74  key_ret send_ret
c680: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
c690: 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72  code;..ssize_t r
c6a0: 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64  etval = 0, unpad
c6b0: 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20  offset;..size_t 
c6c0: 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65  tmpbuflen, padle
c6d0: 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b  n, tmpoutbuflen;
c6e0: 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75  ..int free_tmpbu
c6f0: 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a  f = 0;..int le;.
c700: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c710: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
c720: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20  ;...if (slot == 
c730: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
c740: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
c750: 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e  rror.  slot is N
c760: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
c770: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62  (-1);..}...if (b
c780: 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
c790: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c7a0: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66  NTF("Error.  buf
c7b0: 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
c7c0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
c7d0: 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55  if (outbuf == NU
c7e0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
c7f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
c800: 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e  or.  outbuf is N
c810: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
c820: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69  (-1);..}...if (i
c830: 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
c840: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
c850: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
c860: 20 20 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55    identity is NU
c870: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
c880: 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64  -1);..}...if (id
c890: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
c8a0: 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
c8b0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c8c0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
c8d0: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
c8e0: 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22  dentity is NULL"
c8f0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c900: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
c910: 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79  ine identity Key
c920: 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64   size */..if (id
c930: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
c940: 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c  ntity->keysize <
c950: 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79   0) {...identity
c960: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
c970: 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f  >keysize = x509_
c980: 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74  to_keysize(ident
c990: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
c9a0: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
c9b0: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
c9c0: 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
c9d0: 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  icate_len);..}..
c9e0: 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20  ./* Pad message 
c9f0: 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09  to key size */..
ca00: 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a  if (padInput) {.
ca10: 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
ca20: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
ca30: 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09  eysize > 0) {...
ca40: 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69  .if (buflen != i
ca50: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
ca60: 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29  entity->keysize)
ca70: 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65   {.....if (bufle
ca80: 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  n > (identity->p
ca90: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
caa0: 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09 09  ysize + 3)) {...
cab0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cac0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
cad0: 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  Message is too l
cae0: 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63  arge to sign/dec
caf0: 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65  rypt");.......re
cb00: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a  turn(-1);.....}.
cb10: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
cb20: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
cb30: 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
cb40: 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  e;.....tmpbuf = 
cb50: 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
cb60: 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  );.....free_tmpb
cb70: 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64  uf = 1;......pad
cb80: 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20  len = tmpbuflen 
cb90: 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09  - buflen - 3;...
cba0: 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31  .../* RSA PKCS#1
cbb0: 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35   EMSA-PKCS1-v1_5
cbc0: 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09   Padding */.....
cbd0: 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30  tmpbuf[0] = 0x00
cbe0: 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20  ;.....tmpbuf[1] 
cbf0: 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73  = 0x01;.....mems
cc00: 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30  et(&tmpbuf[2], 0
cc10: 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09  xFF, padlen);...
cc20: 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  ..tmpbuf[padlen 
cc30: 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09  + 2]= 0x00;.....
cc40: 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70  memcpy(&tmpbuf[p
cc50: 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c  adlen + 3], buf,
cc60: 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43   buflen);......C
cc70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cc80: 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22  TBUF("Unpadded:"
cc90: 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a  , buf, buflen);.
cca0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ccb0: 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65  _PRINTBUF("Padde
ccc0: 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  d:", tmpbuf, tmp
ccd0: 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c  buflen);....} el
cce0: 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20  se {.....tmpbuf 
ccf0: 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75  = buf;.....tmpbu
cd00: 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
cd10: 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
cd20: 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d   0;.....padlen =
cd30: 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73   0;....}...} els
cd40: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
cd50: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
cd60: 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
cd70: 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67  key size, hoping
cd80: 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73 20   the message is 
cd90: 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21  properly padded!
cda0: 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d  ");.....tmpbuf =
cdb0: 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c   buf;....tmpbufl
cdc0: 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09  en = buflen;....
cdd0: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
cde0: 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ....padlen = 0;.
cdf0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
ce00: 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
ce10: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
ce20: 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75  en;...free_tmpbu
ce30: 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20  f = 0;...padlen 
ce40: 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  = 0;..}.../* Beg
ce50: 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  in transaction *
ce60: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
ce70: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
ce80: 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63  );.../* Select c
ce90: 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f  orrect applet */
cea0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ceb0: 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67  RINTF("Selecting
cec0: 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74   applet found at
ced0: 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69   %p ...", identi
cee0: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
cef0: 79 2d 3e 61 70 70 6c 65 74 29 3b 0a 09 63 61 63  y->applet);..cac
cf00: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
cf10: 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79  t(slot, identity
cf20: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
cf30: 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28  >applet, sizeof(
cf40: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
cf50: 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29  dentity->applet)
cf60: 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63  );.../* Select c
cf70: 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09  orrect file */..
cf80: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
cf90: 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  le(slot, identit
cfa0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
cfb0: 2d 3e 66 69 6c 65 29 3b 0a 0a 09 74 6d 70 62 75  ->file);...tmpbu
cfc0: 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f  f_s = tmpbuf;..o
cfd0: 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66  utbuf_s = outbuf
cfe0: 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66  ;..while (tmpbuf
cff0: 6c 65 6e 29 20 7b 0a 09 09 69 66 20 28 74 6d 70  len) {...if (tmp
d000: 62 75 66 6c 65 6e 20 3e 20 32 34 35 29 20 7b 0a  buflen > 245) {.
d010: 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ...bytes_to_send
d020: 20 3d 20 32 34 35 3b 0a 09 09 09 70 31 20 3d 20   = 245;....p1 = 
d030: 30 78 38 30 3b 0a 09 09 09 6c 65 20 3d 20 30 78  0x80;....le = 0x
d040: 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  00;...} else {..
d050: 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20  ..bytes_to_send 
d060: 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
d070: 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 6c 65  p1 = 0x00;....le
d080: 20 3d 20 30 78 30 30 3b 0a 09 09 7d 0a 0a 09 09   = 0x00;...}....
d090: 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f  tmpoutbuflen = o
d0a0: 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 73 65 6e  utbuflen;....sen
d0b0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
d0c0: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
d0d0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
d0e0: 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49  L_PLATFORM, GSCI
d0f0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52  S_INSTR_SIGNDECR
d100: 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 62  YPT, p1, 0x00, b
d110: 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d  ytes_to_send, tm
d120: 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63  pbuf, le, &respc
d130: 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d  ode, outbuf, &tm
d140: 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 69  poutbuflen);...i
d150: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
d160: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
d170: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
d180: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
d190: 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d  Sending Failed -
d1a0: 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  - returning in e
d1b0: 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20  rror.");.....if 
d1c0: 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a  (free_tmpbuf) {.
d1d0: 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73  ....if (tmpbuf_s
d1e0: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d  ) {......free(tm
d1f0: 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09  pbuf_s);.....}..
d200: 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74  ..}...../* End t
d210: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
d220: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
d230: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
d240: 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
d250: 3d 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09 09  == 0x6982) {....
d260: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d270: 49 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73  INTF("Security s
d280: 74 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69  tatus not satisi
d290: 66 69 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67  fied.  Returning
d2a0: 20 4e 45 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09   NEEDLOGIN");...
d2b0: 09 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65  ...slot->slot_re
d2c0: 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f  set = 1;.....slo
d2d0: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
d2e0: 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
d2f0: 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  RED;......return
d300: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  (CACKEY_PCSC_E_N
d310: 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a  EEDLOGIN);....}.
d320: 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
d330: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
d340: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
d350: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
d360: 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20  G_PRINTF("Token 
d370: 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  absent.  Returni
d380: 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29  ng TOKENABSENT")
d390: 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 73 6c 6f  ;......slot->slo
d3a0: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09  t_reset = 1;....
d3b0: 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
d3c0: 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
d3d0: 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65  EQUIRED;......re
d3e0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
d3f0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
d400: 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
d410: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70  (-1);...}....tmp
d420: 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  buf += bytes_to_
d430: 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65  send;...tmpbufle
d440: 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  n -= bytes_to_se
d450: 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d  nd;....outbuf +=
d460: 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
d470: 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d  .outbuflen -= tm
d480: 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65  poutbuflen;...re
d490: 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tval += tmpoutbu
d4a0: 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  flen;..}...if (f
d4b0: 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
d4c0: 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
d4d0: 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
d4e0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62  );...}..}...outb
d4f0: 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a  uf = outbuf_s;..
d500: 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
d510: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
d520: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
d530: 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41  lot);..#ifdef CA
d540: 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
d550: 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
d560: 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74  IZE_MAX..if (out
d570: 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  buflen > _POSIX_
d580: 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
d590: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d5a0: 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78  TF("Outbuflen ex
d5b0: 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
d5c0: 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
d5d0: 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
d5e0: 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e  = %li, outbuflen
d5f0: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
d600: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
d610: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
d620: 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a  g) outbuflen);..
d630: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
d640: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
d650: 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c  .../* Unpad repl
d660: 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f  y */..if (unpadO
d670: 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72  utput) {...if (r
d680: 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09  etval < 3) {....
d690: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d6a0: 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f  NTF("Reply is to
d6b0: 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20  o small, we are 
d6c0: 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61  not able to unpa
d6d0: 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  d -- passing bac
d6e0: 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
d6f0: 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
d700: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d710: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
d720: 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
d730: 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
d740: 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
d750: 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
d760: 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  tval);...}....if
d770: 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30   (outbuf[0] != 0
d780: 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  x00) {....CACKEY
d790: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
d7a0: 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64  nrecognized padd
d7b0: 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61  ing scheme -- pa
d7c0: 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68  ssing back and h
d7d0: 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oping for the be
d7e0: 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45  st!");.....CACKE
d7f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d800: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
d810: 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
d820: 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
d830: 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09  ng) retval);....
d840: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
d850: 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65  ..}....blocktype
d860: 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09   = outbuf[1];...
d870: 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b  unpadoffset = 0;
d880: 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63  ....switch (bloc
d890: 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  ktype) {....case
d8a0: 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61   0x00:...../* Pa
d8b0: 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20  dding Scheme 1, 
d8c0: 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65  the first non-ze
d8d0: 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73  ro byte is the s
d8e0: 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a  tart of data */.
d8f0: 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
d900: 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
d910: 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
d920: 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
d930: 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
d940: 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
d950: 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62   0x00) {.......b
d960: 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
d970: 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
d980: 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09  .case 0x01:.....
d990: 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
d9a0: 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61  e 2, pad bytes a
d9b0: 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64  re 0xFF followed
d9c0: 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09   by 0x00 */.....
d9d0: 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
d9e0: 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 2; unpadoffse
d9f0: 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
da00: 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
da10: 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
da20: 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46  adoffset] != 0xF
da30: 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f  F) {.......if (o
da40: 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
da50: 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
da60: 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
da70: 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61  ++;.........brea
da80: 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  k;.......} else 
da90: 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  {........CACKEY_
daa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
dab0: 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
dac0: 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
dad0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
dae0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
daf0: 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30   0x00 found 0x%0
db00: 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
db10: 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
db20: 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
db30: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
db40: 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73  ....}......} els
db50: 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  e {.......CACKEY
db60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
db70: 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64  nvalid padding d
db80: 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  ata found, retur
db90: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c  ning in failure,
dba0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
dbb0: 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25  n 0xFF found 0x%
dbc0: 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  02x", (unsigned 
dbd0: 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61  int) outbuf[unpa
dbe0: 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09  doffset]);......
dbf0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
dc00: 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
dc10: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
dc20: 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  02:...../* Paddi
dc30: 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64  ng Scheme 3, pad
dc40: 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a   bytes are non-z
dc50: 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62  ero first zero b
dc60: 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65  yte found is the
dc70: 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20   seperator byte 
dc80: 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
dc90: 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
dca0: 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
dcb0: 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
dcc0: 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
dcd0: 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
dce0: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   == 0x00) {.....
dcf0: 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
dd00: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
dd10: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09  ....}.....}.....
dd20: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
dd30: 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20   (unpadoffset > 
dd40: 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43  retval) {....CAC
dd50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
dd60: 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72  ("Offset greater
dd70: 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65   than reply size
dd80: 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e  , aborting.  (un
dd90: 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c  padoffset = %lu,
dda0: 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c   retval = %lu)",
ddb0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ddc0: 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75   unpadoffset, (u
ddd0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
dde0: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
ddf0: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  n(-1);...}....CA
de00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
de10: 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f  BUF("Padded:", o
de20: 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a  utbuf, retval);.
de30: 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70  ...retval -= unp
de40: 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d  adoffset;...memm
de50: 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62  ove(outbuf, outb
de60: 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74  uf + unpadoffset
de70: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41  , retval);....CA
de80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
de90: 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c  BUF("Unpadded:",
dea0: 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
deb0: 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44  ;..}....CACKEY_D
dec0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
ded0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
dee0: 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
def0: 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
df00: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
df10: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
df20: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
df30: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
df40: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
df50: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
df60: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
df70: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
df80: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
df90: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
dfa0: 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73  t cackey_login(s
dfb0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
dfc0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
dfd0: 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
dfe0: 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
dff0: 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72  en, int *tries_r
e000: 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75  emaining_p) {..u
e010: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63  nsigned char cac
e020: 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c  _pin[8] = {0xFF,
e030: 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
e040: 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
e050: 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e  xFF, 0xFF};..uin
e060: 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63  t16_t response_c
e070: 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f  ode;..int tries_
e080: 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20  remaining;..int 
e090: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49  send_ret;.../* I
e0a0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
e0b0: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75  do not know abou
e0c0: 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73  t how many tries
e0d0: 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a   are remaining *
e0e0: 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  /..if (tries_rem
e0f0: 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74  aining_p) {...*t
e100: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
e110: 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41   = -1;..}.../* A
e120: 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50  pparently, CAC P
e130: 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59  INs are *EXACTLY
e140: 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d  * 8 bytes long -
e150: 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20  - pad with 0xFF 
e160: 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  if too short */.
e170: 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20  .if (pin_len >= 
e180: 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  8) {...memcpy(ca
e190: 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a  c_pin, pin, 8);.
e1a0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
e1b0: 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
e1c0: 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09   pin_len);..}...
e1d0: 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 72  /* Issue PIN Ver
e1e0: 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  ify */..send_ret
e1f0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
e200: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
e210: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
e220: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
e230: 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 73  Y, 0x00, 0x00, s
e240: 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20  izeof(cac_pin), 
e250: 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26  cac_pin, 0x00, &
e260: 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e  response_code, N
e270: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
e280: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
e290: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
e2a0: 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65  ...if ((response
e2b0: 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20  _code & 0x63C0) 
e2c0: 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09  == 0x63C0) {....
e2d0: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20  tries_remaining 
e2e0: 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  = (response_code
e2f0: 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43   & 0xF);.....CAC
e300: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e310: 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
e320: 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72  on failed, %i tr
e330: 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20  ies remaining", 
e340: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29  tries_remaining)
e350: 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f  ;.....if (tries_
e360: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
e370: 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
e380: 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65  ing_p = tries_re
e390: 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09  maining;....}...
e3a0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
e3b0: 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
e3c0: 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f  ..}....if (respo
e3d0: 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39  nse_code == 0x69
e3e0: 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  83) {....CACKEY_
e3f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
e400: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
e410: 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73  ailed, device is
e420: 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72   locked");.....r
e430: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
e440: 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  C_E_LOCKED);...}
e450: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
e460: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
e470: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
e480: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
e490: 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   Verification su
e4a0: 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74  cceeded");...ret
e4b0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
e4c0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
e4d0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
e4e0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
e4f0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
e500: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
e510: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
e520: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
e530: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
e540: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
e550: 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
e560: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
e570: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63  slot *slot) {..c
e580: 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63  ackey_ret pcsc_c
e590: 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f  onnect_ret;..DWO
e5a0: 52 44 20 72 65 61 64 65 72 5f 6c 65 6e 2c 20 73  RD reader_len, s
e5b0: 74 61 74 65 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20  tate, protocol, 
e5c0: 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61  atr_len;..BYTE a
e5d0: 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d  tr[MAX_ATR_SIZE]
e5e0: 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72  ;..LONG status_r
e5f0: 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e  et, scard_reconn
e600: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
e610: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
e620: 6c 65 64 2e 22 29 3b 0a 0a 09 70 63 73 63 5f 63  led.");...pcsc_c
e630: 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
e640: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
e650: 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73  (slot);..if (pcs
e660: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
e670: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
e680: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
e690: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
e6a0: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
e6b0: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
e6c0: 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b   token absent");
e6d0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
e6e0: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
e6f0: 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f  SENT);..}...atr_
e700: 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72  len = sizeof(atr
e710: 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d  );..status_ret =
e720: 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f   SCardStatus(slo
e730: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55  t->pcsc_card, NU
e740: 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c  LL, &reader_len,
e750: 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63   &state, &protoc
e760: 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65  ol, atr, &atr_le
e770: 6e 29 3b 0a 09 69 66 20 28 73 74 61 74 75 73 5f  n);..if (status_
e780: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
e790: 55 43 43 45 53 53 29 20 7b 0a 09 09 73 6c 6f 74  UCCESS) {...slot
e7a0: 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31  ->slot_reset = 1
e7b0: 3b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  ;...slot->token_
e7c0: 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
e7d0: 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 69  N_REQUIRED;....i
e7e0: 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d  f (status_ret ==
e7f0: 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43   SCARD_W_RESET_C
e800: 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ARD) {....CACKEY
e810: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
e820: 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70  eset required, p
e830: 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b  lease hold...");
e840: 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e  .....scard_recon
e850: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63  n_ret = SCardRec
e860: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
e870: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48  c_card, SCARD_SH
e880: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
e890: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53  D_PROTOCOL_T0, S
e8a0: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
e8b0: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
e8c0: 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e  if (scard_reconn
e8d0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
e8e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f  SUCCESS) {...../
e8f0: 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
e900: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
e910: 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
e920: 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
e930: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
e940: 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
e950: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
e960: 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63  epth--;......cac
e970: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
e980: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09  ction(slot);....
e990: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
e9a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
e9b0: 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  et successful, r
e9c0: 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09  equerying");....
e9d0: 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43  .status_ret = SC
e9e0: 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e  ardStatus(slot->
e9f0: 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c  pcsc_card, NULL,
ea00: 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73   &reader_len, &s
ea10: 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c  tate, &protocol,
ea20: 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b   atr, &atr_len);
ea30: 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73 5f  .....if (status_
ea40: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
ea50: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
ea60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ea70: 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65  TF("Still unable
ea80: 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73   to query card s
ea90: 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67  tatus, returning
eaa0: 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20   token absent.  
eab0: 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20  SCardStatus() = 
eac0: 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
ead0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
eae0: 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65  TO_STR(status_re
eaf0: 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  t));.......retur
eb00: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
eb10: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
eb20: 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ..}....} else {.
eb30: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
eb40: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
eb50: 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  to reconnect to 
eb60: 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
eb70: 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
eb80: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20  CardReconnect() 
eb90: 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  = %s", CACKEY_DE
eba0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
ebb0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72  R_TO_STR(scard_r
ebc0: 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09  econn_ret));....
ebd0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ebe0: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
ebf0: 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  NT);....}...} el
ec00: 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
ec10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
ec20: 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72  ble to query car
ec30: 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e  d status, return
ec40: 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
ec50: 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29  .  SCardStatus()
ec60: 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
ec70: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
ec80: 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73  RR_TO_STR(status
ec90: 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75  _ret));.....retu
eca0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
ecb0: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
ecc0: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61  .}..}...if ((sta
ecd0: 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e  te & SCARD_ABSEN
ece0: 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45  T) == SCARD_ABSE
ecf0: 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  NT) {...CACKEY_D
ed00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72  EBUG_PRINTF("Car
ed10: 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74  d is absent, ret
ed20: 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
ed30: 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ent");....return
ed40: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
ed50: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a  OKENABSENT);..}.
ed60: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ed70: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
ed80: 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22   token present."
ed90: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
eda0: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
edb0: 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20  RESENT);.}../*. 
edc0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
edd0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
ede0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
edf0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
ee00: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
ee10: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
ee20: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
ee30: 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
ee40: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
ee50: 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74  _to_label(struct
ee60: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
ee70: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
ee80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ee90: 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67  label_buf, unsig
eea0: 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62  ned long label_b
eeb0: 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  uf_len) {..unsig
eec0: 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69  ned long certifi
eed0: 63 61 74 65 5f 6c 65 6e 3b 0a 09 63 68 61 72 20  cate_len;..char 
eee0: 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f  *label_asn1;..vo
eef0: 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  id *certificate;
ef00: 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f  ..int x509_read_
ef10: 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61  ret;...certifica
ef20: 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  te = identity->c
ef30: 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72  ertificate;..cer
ef40: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69  tificate_len = i
ef50: 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
ef60: 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  cate_len;...if (
ef70: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
ef80: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
ef90: 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72  -1);..}...x509_r
efa0: 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
efb0: 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
efc0: 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
efd0: 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a  te_len, (void **
efe0: 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a  ) &label_asn1);.
eff0: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
f000: 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  et < 0) {...retu
f010: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
f020: 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
f030: 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
f040: 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
f050: 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
f060: 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
f070: 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e  bel_buf_len, "CN
f080: 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  ");..if (x509_re
f090: 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
f0a0: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
f0b0: 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
f0c0: 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
f0d0: 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
f0e0: 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
f0f0: 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
f100: 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78   NULL);....if (x
f110: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
f120: 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d  0) {....return(-
f130: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  1);...}..}..#ifd
f140: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
f150: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
f160: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
f170: 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
f180: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
f190: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
f1a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30  EBUG_PRINTF("x50
f1b0: 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 65  9_read_ret excee
f1c0: 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
f1d0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
f1e0: 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
f1f0: 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  li, x509_read_re
f200: 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  t = %lu)", (long
f210: 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
f220: 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
f230: 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65  ng) x509_read_re
f240: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
f250: 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
f260: 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78  endif...return(x
f270: 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d  509_read_ret);.}
f280: 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
f290: 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
f2a0: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
f2b0: 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64  utex_create(void
f2c0: 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68   **mutex) {..pth
f2d0: 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
f2e0: 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
f2f0: 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
f300: 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
f310: 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
f320: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
f330: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
f340: 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
f350: 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
f360: 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
f370: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
f380: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
f390: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
f3a0: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29  *pthread_mutex))
f3b0: 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64  ;...if (!pthread
f3c0: 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43  _mutex) {....CAC
f3d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f3e0: 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f  ("Failed to allo
f3f0: 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a  cate memory.");.
f400: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
f410: 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ..}....pthread_r
f420: 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
f430: 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65  mutex_init(pthre
f440: 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b  ad_mutex, NULL);
f450: 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
f460: 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
f470: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f480: 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
f490: 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72  tex_init() retur
f4a0: 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
f4b0: 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
f4c0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
f4d0: 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78  );...}....*mutex
f4e0: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
f4f0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
f500: 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72   (cackey_args.Cr
f510: 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09  eateMutex) {....
f520: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
f530: 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
f540: 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  teMutex(mutex);.
f550: 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
f560: 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
f570: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
f580: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
f590: 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
f5a0: 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
f5b0: 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
f5c0: 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
f5d0: 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
f5e0: 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
f5f0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
f600: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
f610: 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
f620: 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
f630: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
f640: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
f650: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
f660: 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f  ey_mutex_lock(vo
f670: 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  id *mutex) {..pt
f680: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
f690: 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
f6a0: 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
f6b0: 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
f6c0: 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
f6d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f6e0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
f6f0: 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
f700: 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
f710: 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
f720: 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
f730: 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
f740: 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68   = mutex;....pth
f750: 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
f760: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
f770: 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
f780: 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
f790: 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
f7a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f7b0: 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
f7c0: 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72  tex_lock() retur
f7d0: 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
f7e0: 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
f7f0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
f800: 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
f810: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
f820: 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  gs.LockMutex) {.
f830: 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
f840: 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c   = cackey_args.L
f850: 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
f860: 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
f870: 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
f880: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
f890: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
f8a0: 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
f8b0: 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
f8c0: 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
f8d0: 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
f8e0: 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
f8f0: 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
f900: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f910: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
f920: 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
f930: 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
f940: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
f950: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
f960: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
f970: 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76  y_mutex_unlock(v
f980: 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70  oid *mutex) {..p
f990: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
f9a0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
f9b0: 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
f9c0: 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
f9d0: 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
f9e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f9f0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
fa00: 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
fa10: 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
fa20: 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
fa30: 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
fa40: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
fa50: 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74  x = mutex;....pt
fa60: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
fa70: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
fa80: 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
fa90: 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
faa0: 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
fab0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fac0: 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
fad0: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20  _mutex_unlock() 
fae0: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
faf0: 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
fb00: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
fb10: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
fb20: 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
fb30: 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
fb40: 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
fb50: 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
fb60: 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
fb70: 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
fb80: 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
fb90: 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
fba0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
fbb0: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
fbc0: 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20  s.UnlockMutex() 
fbd0: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
fbe0: 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
fbf0: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
fc00: 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
fc10: 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
fc20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fc30: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
fc40: 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
fc50: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
fc60: 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42  static CK_ATTRIB
fc70: 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67  UTE_PTR cackey_g
fc80: 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
fc90: 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62  _OBJECT_CLASS ob
fca0: 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63  jectclass, struc
fcb0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
fcc0: 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
fcd0: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
fce0: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b  identity_num, CK
fcf0: 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
fd00: 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43  unt) {..static C
fd10: 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20  K_BBOOL ck_true 
fd20: 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  = 1;..static CK_
fd30: 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d  BBOOL ck_false =
fd40: 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75   0;..CK_ULONG nu
fd50: 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76  mattrs = 0, retv
fd60: 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54  al_count;..CK_AT
fd70: 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 72  TRIBUTE_TYPE cur
fd80: 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b  r_attr_type;..CK
fd90: 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72 5f  _ATTRIBUTE curr_
fda0: 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09  attr, *retval;..
fdb0: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c  CK_VOID_PTR pVal
fdc0: 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ue;..CK_ULONG ul
fdd0: 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42  ValueLen;..CK_OB
fde0: 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62  JECT_CLASS ck_ob
fdf0: 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f  ject_class;..CK_
fe00: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
fe10: 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f   ck_certificate_
fe20: 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59  type;..CK_KEY_TY
fe30: 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a  PE ck_key_type;.
fe40: 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54  .CK_UTF8CHAR ucT
fe50: 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 75 6e  mpBuf[1024];..un
fe60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
fe70: 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65  tificate;..ssize
fe80: 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  _t certificate_l
fe90: 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65  en = -1, x509_re
fea0: 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61  ad_ret;..int pVa
feb0: 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b  lue_free;...CACK
fec0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fed0: 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43  "Called (objectC
fee0: 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e  lass = %lu, iden
fef0: 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e  tity_num = %lu).
ff00: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
ff10: 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20  g) objectclass, 
ff20: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a  identity_num);..
ff30: 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
ff40: 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
ff50: 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
ff60: 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
ff70: 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
ff80: 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41  ass != CKO_PRIVA
ff90: 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43 41 43 4b  TE_KEY) {...CACK
ffa0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ffb0: 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a  "Returning 0 obj
ffc0: 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76  ects (NULL), inv
ffd0: 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73  alid object clas
ffe0: 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  s");....return(N
fff0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65  ULL);..}.../* Ge
10000 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69  t Cert */..if (i
10010 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
10020 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
10030 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
10040 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
10050 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64  ULL), invalid id
10060 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22 29  entiy provided")
10070 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
10080 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63  );..}...certific
10090 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ate = identity->
100a0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65  certificate;..ce
100b0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
100c0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
100d0 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20  icate_len;...if 
100e0 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
100f0 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66   == -1 || certif
10100 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  icate == NULL) {
10110 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10120 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
10130 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
10140 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74  L), this identit
10150 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
10160 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  an X.509 certifi
10170 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20  cate associated 
10180 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c  with it and will
10190 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09   not work");....
101a0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
101b0 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
101c0 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  t certificate is
101d0 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58   ASN.1 encoded X
101e0 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
101f0 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f   */..if (x509_to
10200 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63  _serial(certific
10210 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
10220 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29  _len, NULL) < 0)
10230 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
10240 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
10250 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
10260 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20  ULL), the X.509 
10270 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73 6f  certificate asso
10280 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
10290 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74   identity is not
102a0 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74   valid");....ret
102b0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
102c0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 31  retval_count = 1
102d0 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c  6;..retval = mal
102e0 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74  loc(retval_count
102f0 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
10300 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72  l));...for (curr
10310 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20  _attr_type = 0; 
10320 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c  curr_attr_type <
10330 20 30 78 63 65 35 33 36 33 35 66 3b 20 63 75 72   0xce53635f; cur
10340 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b  r_attr_type++) {
10350 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
10360 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20  _type == 0x800) 
10370 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74  {....curr_attr_t
10380 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30 30  ype = 0xce536300
10390 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f  ;...}....pValue_
103a0 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c  free = 0;...pVal
103b0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56  ue = NULL;...ulV
103c0 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
103d0 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63  NG) -1;....switc
103e0 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  h (curr_attr_typ
103f0 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41  e) {....case CKA
10400 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b  _CLASS:.....CACK
10410 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10420 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
10430 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20  ibute CKA_CLASS 
10440 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
10450 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10460 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
10470 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f  ......ck_object_
10480 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c  class = objectcl
10490 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  ass;......pValue
104a0 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c   = &ck_object_cl
104b0 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ass;.....ulValue
104c0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
104d0 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a  object_class);..
104e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
104f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
10500 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
10510 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
10520 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a   long) *((CK_OBJ
10530 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61  ECT_CLASS *) pVa
10540 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
10550 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
10560 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
10570 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10580 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41  KA_TOKEN:.....CA
10590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
105a0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
105b0 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45  tribute CKA_TOKE
105c0 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  N (0x%08lx) ..."
105d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
105e0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
105f0 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
10600 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
10610 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
10620 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
10630 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10640 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
10650 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
10660 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
10670 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
10680 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
10690 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
106a0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
106b0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
106c0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45  .case CKA_TRUSTE
106d0 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  D:.....CACKEY_DE
106e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
106f0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
10700 20 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78   CKA_TRUSTED (0x
10710 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
10720 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
10730 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
10740 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
10750 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
10760 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
10770 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
10780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10790 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
107a0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
107b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
107c0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
107d0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
107e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
107f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
10800 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10810 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
10820 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10830 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
10840 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
10850 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30  KA_MODIFIABLE (0
10860 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
10870 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
10880 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
10890 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
108a0 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
108b0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
108c0 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
108d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
108e0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
108f0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
10900 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
10910 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
10920 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
10930 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10940 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10950 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10960 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09  ase CKA_LABEL:..
10970 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10980 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
10990 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
109a0 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29  _LABEL (0x%08lx)
109b0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
109c0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
109d0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 2f 2a 20  _type);....../* 
109e0 58 58 58 3a 20 44 65 74 65 72 6d 69 6e 65 20 6e  XXX: Determine n
109f0 61 6d 65 20 2a 2f 0a 09 09 09 09 75 6c 56 61 6c  ame */.....ulVal
10a00 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66  ueLen = snprintf
10a10 28 28 63 68 61 72 20 2a 29 20 75 63 54 6d 70 42  ((char *) ucTmpB
10a20 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d 70  uf, sizeof(ucTmp
10a30 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74 79 20  Buf), "Identity 
10a40 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  #%lu", (unsigned
10a50 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
10a60 6e 75 6d 29 3b 0a 09 09 09 09 70 56 61 6c 75 65  num);.....pValue
10a70 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09   = ucTmpBuf;....
10a80 09 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e  ..if (ulValueLen
10a90 20 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70   >= sizeof(ucTmp
10aa0 42 75 66 29 29 20 7b 0a 09 09 09 09 09 75 6c 56  Buf)) {......ulV
10ab0 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09  alueLen = 0;....
10ac0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
10ad0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
10ae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10af0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
10b00 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
10b10 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10b20 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10b30 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10b40 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09  ase CKA_VALUE:..
10b50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10b60 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
10b70 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
10b80 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29  _VALUE (0x%08lx)
10b90 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
10ba0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
10bb0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69  _type);......swi
10bc0 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  tch (objectclass
10bd0 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ) {......case CK
10be0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09  O_PRIVATE_KEY:..
10bf0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10c00 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
10c10 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
10c20 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
10c30 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22   a private key."
10c40 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
10c50 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
10c60 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09  UBLIC_KEY:......
10c70 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f  ./* XXX: TODO */
10c80 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
10c90 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52  ....case CKO_CER
10ca0 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09  TIFICATE:.......
10cb0 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69  pValue = certifi
10cc0 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61  cate;.......ulVa
10cd0 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69  lueLen = certifi
10ce0 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09  cate_len;.......
10cf0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
10d00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10d10 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
10d20 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
10d30 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
10d40 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
10d50 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
10d60 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53  ....case CKA_ISS
10d70 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  UER:.....CACKEY_
10d80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10d90 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
10da0 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30  te CKA_ISSUER (0
10db0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
10dc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
10dd0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
10de0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
10df0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
10e00 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
10e10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10e20 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
10e30 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
10e40 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
10e50 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
10e60 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
10e70 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
10e80 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
10e90 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
10ea0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
10eb0 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69  o_issuer(certifi
10ec0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
10ed0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
10ee0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
10ef0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
10f00 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
10f10 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
10f20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
10f30 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
10f40 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
10f50 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10f60 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
10f70 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
10f80 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
10f90 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
10fa0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
10fb0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
10fc0 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09  SERIAL_NUMBER:..
10fd0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10fe0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
10ff0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
11000 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28  _SERIAL_NUMBER (
11010 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
11020 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
11030 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
11040 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
11050 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
11060 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
11070 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11080 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
11090 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
110a0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
110b0 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29  a certificate.")
110c0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
110d0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
110e0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
110f0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
11100 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
11110 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
11120 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
11130 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
11140 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
11150 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
11160 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
11170 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
11180 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
11190 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
111a0 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
111b0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
111c0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
111d0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
111e0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
111f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
11200 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
11210 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
11220 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09  KA_SUBJECT:.....
11230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11240 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
11250 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55  attribute CKA_SU
11260 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20  BJECT (0x%08lx) 
11270 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
11280 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
11290 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
112a0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
112b0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
112c0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
112d0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
112e0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
112f0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
11300 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
11310 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
11320 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
11330 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
11340 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
11350 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
11360 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
11370 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
11380 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
11390 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
113a0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
113b0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
113c0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
113d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
113e0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
113f0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
11400 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
11410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11420 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
11430 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
11440 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
11450 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
11460 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
11470 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09  case CKA_ID:....
11480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11490 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
114a0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
114b0 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  D (0x%08lx) ..."
114c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
114d0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
114e0 29 3b 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66  );......ucTmpBuf
114f0 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79  [0] = ((identity
11500 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20  _num + 1) >> 8) 
11510 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d  & 0xff;.....ucTm
11520 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e  pBuf[1] =  (iden
11530 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20  tity_num + 1) & 
11540 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75  0xff;......pValu
11550 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09  e = &ucTmpBuf;..
11560 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
11570 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  2;......CACKEY_D
11580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
11590 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
115a0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
115b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
115c0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
115d0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
115e0 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
115f0 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PE:.....CACKEY_D
11600 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
11610 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
11620 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
11630 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29  E_TYPE (0x%08lx)
11640 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
11650 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
11660 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
11670 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
11680 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
11690 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
116a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
116b0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
116c0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
116d0 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
116e0 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09  icate.");.......
116f0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
11700 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70  ../* We only sup
11710 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69  port one certifi
11720 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09  cate type */....
11730 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f  .ck_certificate_
11740 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39  type = CKC_X_509
11750 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
11760 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f  &ck_certificate_
11770 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  type;.....ulValu
11780 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
11790 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
117a0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
117b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
117c0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43  .. returning CKC
117d0 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70  _X_509 (%lu) (%p
117e0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
117f0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45  d long) *((CK_CE
11800 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a  RTIFICATE_TYPE *
11810 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
11820 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
11830 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
11840 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
11850 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ase CKA_KEY_TYPE
11860 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
11870 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
11880 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
11890 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78  CKA_KEY_TYPE (0x
118a0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
118b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
118c0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
118d0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
118e0 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss != CKO_PRIVAT
118f0 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63  E_KEY && objectc
11900 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c  lass != CKO_PUBL
11910 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43  IC_KEY) {......C
11920 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11930 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
11940 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
11950 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
11960 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62   key.");.......b
11970 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
11980 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  ./* We only supp
11990 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65  ort one key type
119a0 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74   */.....ck_key_t
119b0 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a  ype = CKK_RSA;..
119c0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
119d0 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75  _key_type;.....u
119e0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
119f0 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b  of(ck_key_type);
11a00 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11a10 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
11a20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53  returning CKK_RS
11a30 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29  A (%lu) (%p/%lu)
11a40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
11a50 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49  g) *((CK_CERTIFI
11a60 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61  CATE_TYPE *) pVa
11a70 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
11a80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
11a90 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
11aa0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
11ab0 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43  KA_SIGN:.....CAC
11ac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11ad0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
11ae0 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20  ribute CKA_SIGN 
11af0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
11b00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11b10 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
11b20 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
11b30 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
11b40 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
11b50 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
11b60 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
11b70 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
11b80 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
11b90 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
11ba0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
11bb0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
11bc0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
11bd0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
11be0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11bf0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
11c00 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
11c10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
11c20 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
11c30 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
11c40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
11c50 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
11c60 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
11c70 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
11c80 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
11c90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
11ca0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
11cb0 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
11cc0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
11cd0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11ce0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
11cf0 3b 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72  ;....../* We cur
11d00 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70  rently only supp
11d10 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41  ort "Sign with A
11d20 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09  ppendix" */.....
11d30 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
11d40 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
11d50 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
11d60 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
11d70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11d80 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
11d90 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
11da0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
11db0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
11dc0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
11dd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
11de0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
11df0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
11e00 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09  CKA_DECRYPT:....
11e10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11e20 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
11e30 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44   attribute CKA_D
11e40 45 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29  ECRYPT (0x%08lx)
11e50 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
11e60 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
11e70 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
11e80 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
11e90 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
11ea0 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  || objectclass =
11eb0 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
11ec0 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
11ed0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
11ee0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
11ef0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
11f00 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
11f10 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
11f20 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
11f30 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
11f40 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
11f50 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11f60 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
11f70 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
11f80 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
11f90 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
11fa0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
11fb0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
11fc0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
11fd0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
11fe0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53  ...case CKA_SENS
11ff0 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45  ITIVE:.....CACKE
12000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12010 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
12020 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49  bute CKA_SENSITI
12030 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  VE (0x%08lx) ...
12040 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
12050 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
12060 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
12070 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
12080 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
12090 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
120a0 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
120b0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
120c0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
120d0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
120e0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
120f0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
12100 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
12110 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
12120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12130 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
12140 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
12150 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12160 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
12170 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
12180 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12190 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
121a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
121b0 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  se CKA_EXTRACTAB
121c0 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  LE:.....CACKEY_D
121d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
121e0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
121f0 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
12200 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
12210 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12220 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
12230 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
12240 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
12250 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
12260 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
12270 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
12280 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
12290 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
122a0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
122b0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
122c0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
122d0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
122e0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
122f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12300 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
12310 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
12320 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12330 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
12340 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
12350 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12360 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
12370 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
12380 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
12390 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
123a0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
123b0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
123c0 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c  _MODULUS (0x%08l
123d0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
123e0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
123f0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
12400 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
12410 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
12420 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
12430 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28  x509_to_modulus(
12440 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
12450 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
12460 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
12470 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
12480 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
12490 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
124a0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
124b0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
124c0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
124d0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
124e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
124f0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
12500 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
12510 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
12520 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
12530 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
12540 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f  case CKA_PUBLIC_
12550 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41  EXPONENT:.....CA
12560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12570 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
12580 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c  tribute CKA_PUBL
12590 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25  IC_EXPONENT (0x%
125a0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
125b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
125c0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
125d0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
125e0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
125f0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
12600 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e   = x509_to_expon
12610 65 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ent(certificate,
12620 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
12630 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
12640 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
12650 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
12660 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
12670 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
12680 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
12690 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
126a0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
126b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
126c0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
126d0 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
126e0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
126f0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
12700 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
12710 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
12720 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a  ST_SERVER_AUTH:.
12730 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12740 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
12750 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
12760 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41  A_TRUST_SERVER_A
12770 55 54 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  UTH (0x%08lx) ..
12780 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
12790 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
127a0 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
127b0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
127c0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
127d0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
127e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
127f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
12800 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
12810 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
12820 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
12830 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
12840 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
12850 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
12860 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
12870 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
12880 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09  T_CLIENT_AUTH:..
12890 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
128a0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
128b0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
128c0 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
128d0 54 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  TH (0x%08lx) ...
128e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
128f0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
12900 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
12910 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
12920 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
12930 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
12940 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12950 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
12960 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
12970 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
12980 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
12990 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
129a0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
129b0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
129c0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
129d0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
129e0 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09  _CODE_SIGNING:..
129f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12a00 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
12a10 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
12a20 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
12a30 49 4e 47 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ING (0x%08lx) ..
12a40 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
12a50 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
12a60 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
12a70 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
12a80 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
12a90 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
12aa0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12ab0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
12ac0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
12ad0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
12ae0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
12af0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
12b00 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
12b10 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
12b20 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
12b30 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
12b40 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49  T_EMAIL_PROTECTI
12b50 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ON:.....CACKEY_D
12b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
12b70 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
12b80 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49  e CKA_TRUST_EMAI
12b90 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 28 30 78  L_PROTECTION (0x
12ba0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
12bb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
12bc0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
12bd0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
12be0 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
12bf0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
12c00 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
12c10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12c20 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
12c30 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
12c40 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12c50 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
12c60 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
12c70 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12c80 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
12c90 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61  ..break;....defa
12ca0 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20  ult:.....pValue 
12cb0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61  = NULL;.....ulVa
12cc0 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
12cd0 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b  G) -1;.....break
12ce0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43  ;...}....if (((C
12cf0 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c  K_LONG) ulValueL
12d00 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47  en) != ((CK_LONG
12d10 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50  ) -1)) {..../* P
12d20 75 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e  ush curr_attr on
12d30 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a  to the stack */.
12d40 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70  ...curr_attr.typ
12d50 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79  e = curr_attr_ty
12d60 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  pe;....curr_attr
12d70 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c  .ulValueLen = ul
12d80 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75  ValueLen;.....cu
12d90 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d  rr_attr.pValue =
12da0 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74   malloc(curr_att
12db0 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  r.ulValueLen);..
12dc0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
12dd0 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  tr.pValue, pValu
12de0 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  e, curr_attr.ulV
12df0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66  alueLen);.....if
12e00 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26   (pValue_free &&
12e10 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66   pValue) {.....f
12e20 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09  ree(pValue);....
12e30 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74  }.....if (numatt
12e40 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75  rs >= retval_cou
12e50 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c  nt) {.....retval
12e60 5f 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09  _count *= 2;....
12e70 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
12e80 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c  c(retval, retval
12e90 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
12ea0 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a  *retval));....}.
12eb0 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76  ....memcpy(&retv
12ec0 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63  al[numattrs], &c
12ed0 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66  urr_attr, sizeof
12ee0 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09  (curr_attr));...
12ef0 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d  .numattrs++;...}
12f00 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74  ..}...if (numatt
12f10 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  rs != 0) {...ret
12f20 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61  val_count = numa
12f30 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d  ttrs;...retval =
12f40 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c   realloc(retval,
12f50 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20   retval_count * 
12f60 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
12f70 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72  ;..} else {...fr
12f80 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ee(retval);....r
12f90 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  etval = NULL;..}
12fa0 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e  ...*pulCount = n
12fb0 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45  umattrs;...CACKE
12fc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12fd0 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62  Returning %lu ob
12fe0 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75  jects (%p).", nu
12ff0 6d 61 74 74 72 73 2c 20 72 65 74 76 61 6c 29 3b  mattrs, retval);
13000 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
13010 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
13020 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64  d cackey_free_id
13030 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20  entities(struct 
13040 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
13050 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73  *identities, uns
13060 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
13070 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
13080 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
13090 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e  rr_attr;..unsign
130a0 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20  ed long id_idx, 
130b0 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28  attr_idx;...if (
130c0 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
130d0 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73  LL || identities
130e0 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  _count == 0) {..
130f0 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
13100 72 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69  r (id_idx = 0; i
13110 64 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69  d_idx < identiti
13120 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78  es_count; id_idx
13130 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e  ++) {...if (iden
13140 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
13150 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09  ttributes) {....
13160 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20  for (attr_idx = 
13170 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64  0; attr_idx < id
13180 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
13190 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
131a0 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  t; attr_idx++) {
131b0 0a 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d  .....curr_attr =
131c0 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
131d0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b  idx].attributes[
131e0 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09  attr_idx];......
131f0 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
13200 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72  Value) {......fr
13210 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  ee(curr_attr->pV
13220 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09  alue);.....}....
13230 7d 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69  }.....if (identi
13240 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
13250 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66  ributes) {.....f
13260 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69  ree(identities[i
13270 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
13280 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  s);....}.....cac
13290 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69  key_free_certs(i
132a0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
132b0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c  ].pcsc_identity,
132c0 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a   1, 1);...}..}..
132d0 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73  .free(identities
132e0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  );.}..static str
132f0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
13300 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
13310 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
13320 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
13330 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c  slot, unsigned l
13340 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20  ong *ids_found) 
13350 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
13360 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
13370 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b  pcsc_identities;
13380 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
13390 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
133a0 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
133b0 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64  long num_ids, id
133c0 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79  _idx, curr_id_ty
133d0 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  pe;..unsigned lo
133e0 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 63 65  ng num_certs, ce
133f0 72 74 5f 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  rt_idx;...CACKEY
13400 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
13410 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
13420 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c  ids_found == NUL
13430 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
13440 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13450 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73  r.  ids_found is
13460 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
13470 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 70  rn(NULL);..}...p
13480 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d  csc_identities =
13490 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72   cackey_read_cer
134a0 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26  ts(slot, NULL, &
134b0 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20  num_certs);..if 
134c0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
134d0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a   != NULL) {.../*
134e0 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20   Convert number 
134f0 6f 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62  of Certs to numb
13500 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f  er of objects */
13510 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b  ...num_ids = (CK
13520 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20  O_PRIVATE_KEY - 
13530 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
13540 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73  + 1) * num_certs
13550 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20  ;....identities 
13560 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
13570 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
13580 69 74 69 65 73 29 29 3b 0a 0a 09 09 69 64 5f 69  ities));....id_i
13590 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63  dx = 0;...for (c
135a0 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72  ert_idx = 0; cer
135b0 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74  t_idx < num_cert
135c0 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
135d0 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64  ....for (curr_id
135e0 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54  _type = CKO_CERT
135f0 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64  IFICATE; curr_id
13600 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49  _type <= CKO_PRI
13610 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69  VATE_KEY; curr_i
13620 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09  d_type++) {.....
13630 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
13640 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
13650 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
13660 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79  butes(curr_id_ty
13670 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  pe, &pcsc_identi
13680 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
13690 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
136a0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
136b0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
136c0 0a 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69  ......if (identi
136d0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
136e0 72 69 62 75 74 65 73 20 3d 3d 20 4e 55 4c 4c 29  ributes == NULL)
136f0 20 7b 0a 09 09 09 09 09 69 64 65 6e 74 69 74 69   {......identiti
13700 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
13710 62 75 74 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  butes_count = 0;
13720 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 64 65 6e  .....}......iden
13730 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
13740 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d  csc_identity = m
13750 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64  alloc(sizeof(*id
13760 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
13770 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
13780 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65  ;.....memcpy(ide
13790 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
137a0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26  pcsc_identity, &
137b0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
137c0 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f  cert_idx], sizeo
137d0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
137e0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
137f0 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e  ity));......iden
13800 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
13810 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
13820 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
13830 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  oc(pcsc_identiti
13840 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
13850 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
13860 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69  ...memcpy(identi
13870 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
13880 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
13890 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
138a0 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
138b0 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20  x].certificate, 
138c0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
138d0 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66  cert_idx].certif
138e0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
138f0 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a  .id_idx++;....}.
13900 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
13910 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
13920 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
13930 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73  rts, 1);....*ids
13940 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
13950 3b 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74  ;...return(ident
13960 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64  ities);..}...*id
13970 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65  s_found = 0;..re
13980 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43  turn(NULL);.}..C
13990 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
139a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69  N(CK_RV, C_Initi
139b0 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
139c0 54 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a  TR pInitArgs) {.
139d0 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45  .CK_C_INITIALIZE
139e0 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67  _ARGS CK_PTR arg
139f0 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78  s;..uint32_t idx
13a00 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69  ;..int mutex_ini
13a10 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
13a20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
13a30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
13a40 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c  InitArgs != NULL
13a50 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e  ) {...args = pIn
13a60 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79  itArgs;...memcpy
13a70 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61  (&cackey_args, a
13a80 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b  rgs, sizeof(cack
13a90 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66  ey_args));....if
13aa0 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
13ab0 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
13ac0 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
13ad0 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
13ae0 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  s->LockMutex == 
13af0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
13b00 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  lockMutex == NUL
13b10 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73  L) {....if (args
13b20 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d  ->CreateMutex !=
13b30 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44   NULL || args->D
13b40 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e  estroyMutex != N
13b50 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63  ULL || args->Loc
13b60 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  kMutex != NULL |
13b70 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75  | args->UnlockMu
13b80 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tex != NULL) {..
13b90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13ba0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
13bb0 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c  ome, but not All
13bc0 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69   threading primi
13bd0 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22  tives provided."
13be0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
13bf0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
13c00 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  );....}...}....i
13c10 66 20 28 61 72 67 73 2d 3e 70 52 65 73 65 72 76  f (args->pReserv
13c20 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
13c30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13c40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
13c50 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
13c60 4c 4c 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  LL.");.....retur
13c70 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
13c80 42 41 44 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  BAD);...}..} els
13c90 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  e {...cackey_arg
13ca0 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20  s.CreateMutex = 
13cb0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
13cc0 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78  rgs.DestroyMutex
13cd0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
13ce0 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
13cf0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
13d00 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
13d10 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
13d20 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d  key_args.flags =
13d30 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63   0;..}...if (cac
13d40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
13d50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13d60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13d70 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61    Already initia
13d80 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
13d90 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
13da0 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c  _ALREADY_INITIAL
13db0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  IZED);..}...for 
13dc0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
13dd0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
13de0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
13df0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
13e00 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
13e10 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
13e20 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
13e30 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64   0;..}...for (id
13e40 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
13e50 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
13e60 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
13e70 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
13e80 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79  dx++) {...cackey
13e90 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
13ea0 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ve = 0;...cackey
13eb0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
13ec0 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
13ed0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
13ee0 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
13ef0 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
13f00 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73  key_slots[idx].s
13f10 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
13f20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
13f30 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  x].token_flags =
13f40 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
13f50 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
13f60 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
13f70 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
13f80 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  1;...if (!cackey
13f90 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b  _biglock_init) {
13fa0 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  ...mutex_init_re
13fb0 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  t = cackey_mutex
13fc0 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f  _create(&cackey_
13fd0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20  biglock);....if 
13fe0 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  (mutex_init_ret 
13ff0 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
14000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14010 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e  Error.  Mutex in
14020 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
14030 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  led.");.....retu
14040 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b  rn(CKR_CANT_LOCK
14050 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
14060 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
14070 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  1;..}...CACKEY_D
14080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
14090 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
140a0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
140b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
140c0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
140d0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
140e0 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  inalize)(CK_VOID
140f0 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
14100 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
14110 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14120 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
14130 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
14140 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
14150 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14160 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
14170 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
14180 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
14190 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
141a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
141b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
141c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
141d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
141e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
141f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
14200 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
14210 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
14220 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
14230 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
14240 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
14250 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
14260 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
14270 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
14280 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
14290 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
142a0 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
142b0 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  (idx);...}..}...
142c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
142d0 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
142e0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
142f0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
14300 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
14310 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
14320 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
14330 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
14340 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
14350 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63  der) {....free(c
14360 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
14370 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
14380 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70  .}..}...cackey_p
14390 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
143a0 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69  ;...cackey_initi
143b0 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41  alized = 0;...CA
143c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
143d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
143e0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
143f0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
14400 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
14410 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
14420 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b  V, C_GetInfo)(CK
14430 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
14440 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
14450 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
14460 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
14470 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
14480 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
14490 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74   libraryDescript
144a0 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22  ion[] = "CACKey"
144b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
144c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
144d0 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
144e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
144f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14500 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
14510 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
14520 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
14530 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
14540 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
14550 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
14560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14570 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
14580 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
14590 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
145a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
145b0 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ED);..}...pInfo-
145c0 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
145d0 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45  .major = ((CACKE
145e0 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
145f0 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20  ON_CODE) >> 16) 
14600 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
14610 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e  cryptokiVersion.
14620 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  minor = ((CACKEY
14630 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
14640 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20  N_CODE) >> 8) & 
14650 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0xff;...memset(p
14660 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
14670 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
14680 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
14690 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
146a0 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
146b0 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
146c0 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
146d0 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
146e0 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   - 1);...pInfo->
146f0 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09  flags = 0x00;...
14700 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69  memset(pInfo->li
14710 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
14720 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
14730 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
14740 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
14750 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  py(pInfo->librar
14760 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69  yDescription, li
14770 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
14780 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79  , sizeof(library
14790 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31  Description) - 1
147a0 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  );...pInfo->libr
147b0 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  aryVersion.major
147c0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
147d0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
147e0 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c   0xff;..pInfo->l
147f0 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69  ibraryVersion.mi
14800 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
14810 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
14820 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
14830 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14840 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
14850 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
14860 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
14870 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63  );.}../*. * Proc
14880 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ess list of read
14890 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20  ers, and create 
148a0 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20  mapping between 
148b0 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20  reader name and 
148c0 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44  slot ID. */.CK_D
148d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
148e0 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c  K_RV, C_GetSlotL
148f0 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f  ist)(CK_BBOOL to
14900 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53  kenPresent, CK_S
14910 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
14920 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  List, CK_ULONG_P
14930 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
14940 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
14950 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
14960 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f  ect_ret;..CK_ULO
14970 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  NG count, slot_c
14980 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c  ount = 0, currsl
14990 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  ot;..char *pcsc_
149a0 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72  readers, *pcsc_r
149b0 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f  eaders_s, *pcsc_
149c0 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52  readers_e;..DWOR
149d0 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  D pcsc_readers_l
149e0 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
149f0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b  listreaders_ret;
14a00 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65  ..size_t curr_re
14a10 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b  ader_len;...CACK
14a20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14a30 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
14a40 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55   (pulCount == NU
14a50 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
14a60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14a70 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20  or. pulCount is 
14a80 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
14a90 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
14aa0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
14ab0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
14ac0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
14ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
14ae0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
14af0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
14b00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
14b10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
14b20 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
14b30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
14b40 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
14b50 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
14b60 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
14b70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14b80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
14b90 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
14ba0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
14bb0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
14bc0 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61  R);..}.../* Clea
14bd0 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  r list of slots 
14be0 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  */..if (pSlotLis
14bf0 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
14c00 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67  BUG_PRINTF("Purg
14c10 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66  ing all slot inf
14c20 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09  ormation.");....
14c30 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
14c40 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
14c50 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
14c60 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79  lly being supply
14c70 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
14c80 61 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ation */...cacke
14c90 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
14ca0 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72  ct_all();....for
14cb0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
14cc0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
14cd0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
14ce0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
14cf0 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
14d00 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66  rslot++) {....if
14d10 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
14d20 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
14d30 61 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 65  ader) {.....free
14d40 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
14d50 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
14d60 64 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  der);......cacke
14d70 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
14d80 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
14d90 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  NULL;....}.....i
14da0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
14db0 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29  currslot].label)
14dc0 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b   {.....free(cack
14dd0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
14de0 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09  t].label);......
14df0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
14e00 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e  rslot].label = N
14e10 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ULL;....}.....ca
14e20 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
14e30 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  lot].active = 0;
14e40 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ...}..}.../* Det
14e50 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72  ermine list of r
14e60 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f  eaders */..pcsc_
14e70 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
14e80 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
14e90 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  t();..if (pcsc_c
14ea0 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
14eb0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
14ec0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
14ed0 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
14ee0 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69  ion to PC/SC fai
14ef0 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  led, assuming no
14f00 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f   slots");....slo
14f10 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20  t_count = 0;..} 
14f20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65  else {...pcsc_re
14f30 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a  aders_len = 0;..
14f40 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
14f50 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
14f60 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
14f70 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
14f80 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73  NULL, NULL, &pcs
14f90 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
14fa0 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73  ...if (scard_lis
14fb0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20  treaders_ret == 
14fc0 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52  SCARD_F_COMM_ERR
14fd0 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OR) {....CACKEY_
14fe0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
14ff0 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65  ror. SCardListRe
15000 61 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64  aders() returned
15010 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52   SCARD_F_COMM_ER
15020 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f  ROR, assuming Co
15030 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53  nnection to PC/S
15040 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63  C went away. Rec
15050 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09  onnecting.");...
15060 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  ..cackey_pcsc_di
15070 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63  sconnect();....c
15080 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
15090 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ct();.....CACKEY
150a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
150b0 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52  rying SCardListR
150c0 65 61 64 65 72 73 28 29 20 61 67 61 69 6e 22 29  eaders() again")
150d0 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  ;....scard_listr
150e0 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
150f0 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
15100 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
15110 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26  e, NULL, NULL, &
15120 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
15130 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  );...}....if (sc
15140 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
15150 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
15160 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f 72  UCCESS && pcsc_r
15170 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29  eaders_len != 0)
15180 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65   {....pcsc_reade
15190 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  rs = malloc(pcsc
151a0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
151b0 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  ..pcsc_readers_s
151c0 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b   = pcsc_readers;
151d0 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  .....scard_listr
151e0 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
151f0 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
15200 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
15210 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65  e, NULL, pcsc_re
15220 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61  aders, &pcsc_rea
15230 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66  ders_len);....if
15240 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
15250 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
15260 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
15270 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  ..pcsc_readers_e
15280 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 20   = pcsc_readers 
15290 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  + pcsc_readers_l
152a0 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72  en;....../* Star
152b0 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31  t with Slot ID 1
152c0 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67  , to avoid a bug
152d0 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20   in GDM on RHEL 
152e0 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39  */...../* Bug 59
152f0 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75  4911: https://bu
15300 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f  gzilla.redhat.co
15310 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  m/show_bug.cgi?i
15320 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09  d=594911 */.....
15330 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09  currslot = 1;...
15340 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65  ..while (pcsc_re
15350 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61  aders < pcsc_rea
15360 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 63  ders_e) {......c
15370 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
15380 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61   strlen(pcsc_rea
15390 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20  ders);.......if 
153a0 28 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ((pcsc_readers +
153b0 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
153c0 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73  ) > pcsc_readers
153d0 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  _e) {.......brea
153e0 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
153f0 69 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f  if (curr_reader_
15400 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  len == 0) {.....
15410 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
15420 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c  ......if (currsl
15430 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ot >= (sizeof(ca
15440 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
15450 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
15460 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09  s[0]))) {.......
15470 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15480 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20  NTF("Found more 
15490 72 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f  readers than slo
154a0 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ts are available
154b0 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  !");........brea
154c0 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
154d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
154e0 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65  NTF("Found reade
154f0 72 3a 20 25 73 22 2c 20 70 63 73 63 5f 72 65 61  r: %s", pcsc_rea
15500 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20  ders);......./* 
15510 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
15520 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
15530 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
15540 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73 75 70   being asked sup
15550 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66  ply the slot inf
15560 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  ormation */.....
15570 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
15580 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  {.......cackey_s
15590 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
155a0 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09  ctive = 1;......
155b0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
155c0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
155d0 64 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73  der = strdup(pcs
155e0 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09  c_readers);.....
155f0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
15600 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61  urrslot].pcsc_ca
15610 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
15620 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
15630 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
15640 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
15650 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 0;.......cack
15660 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
15670 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  t].slot_reset = 
15680 31 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  1;.......cackey_
15690 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
156a0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
156b0 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
156c0 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
156d0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
156e0 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  abel = NULL;....
156f0 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f  ..}......currslo
15700 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f  t++;.......pcsc_
15710 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f  readers += curr_
15720 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a  reader_len + 1;.
15730 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 53 74  ....}....../* St
15740 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44  art with Slot ID
15750 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62   1, to avoid a b
15760 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45  ug in GDM on RHE
15770 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20  L */...../* Bug 
15780 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f  594911: https://
15790 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e  bugzilla.redhat.
157a0 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  com/show_bug.cgi
157b0 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09  ?id=594911 */...
157c0 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e  ..if (currslot >
157d0 20 31 29 20 7b 0a 09 09 09 09 09 2f 2a 20 53 74   1) {....../* St
157e0 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44  art with Slot ID
157f0 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62   1, to avoid a b
15800 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45  ug in GDM on RHE
15810 4c 20 2a 2f 0a 09 09 09 09 09 2f 2a 20 42 75 67  L */....../* Bug
15820 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f   594911: https:/
15830 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74  /bugzilla.redhat
15840 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67  .com/show_bug.cg
15850 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09  i?id=594911 */..
15860 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d  ....slot_count =
15870 20 63 75 72 72 73 6c 6f 74 20 2d 20 31 3b 0a 09   currslot - 1;..
15880 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
15890 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
158a0 47 5f 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64  G_PRINTF("Second
158b0 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69   call to SCardLi
158c0 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64  stReaders failed
158d0 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22  , return %s/%li"
158e0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
158f0 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
15900 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65  STR(scard_listre
15910 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e  aders_ret), (lon
15920 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61  g) scard_listrea
15930 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a  ders_ret);....}.
15940 0a 09 09 09 66 72 65 65 28 70 63 73 63 5f 72 65  ....free(pcsc_re
15950 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c  aders_s);...} el
15960 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
15970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72  EBUG_PRINTF("Fir
15980 73 74 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64  st call to SCard
15990 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c  ListReaders fail
159a0 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c  ed, return %s/%l
159b0 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  i", CACKEY_DEBUG
159c0 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
159d0 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74  O_STR(scard_list
159e0 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c  readers_ret), (l
159f0 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72  ong) scard_listr
15a00 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d  eaders_ret);...}
15a10 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
15a20 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
15a30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
15a40 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
15a50 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
15a60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15a70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15a80 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
15a90 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
15aa0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
15ab0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ROR);..}...if (p
15ac0 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  SlotList == NULL
15ad0 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20  ) {...*pulCount 
15ae0 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09  = slot_count;...
15af0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15b00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
15b10 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
15b20 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
15b30 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63  (CKR_OK);..}...c
15b40 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74  ount = *pulCount
15b50 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73  ;..if (count < s
15b60 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43  lot_count) {...C
15b70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15b80 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
15b90 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
15ba0 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61  tries, but we ha
15bb0 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22  ve %lu entries."
15bc0 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  , count, slot_co
15bd0 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
15be0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
15bf0 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 66 6f 72  MALL);...}...for
15c00 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
15c10 63 75 72 72 73 6c 6f 74 20 3c 20 73 6c 6f 74 5f  currslot < slot_
15c20 63 6f 75 6e 74 3b 20 63 75 72 72 73 6c 6f 74 2b  count; currslot+
15c30 2b 29 20 7b 0a 09 09 2f 2a 20 53 74 61 72 74 20  +) {.../* Start 
15c40 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20  with Slot ID 1, 
15c50 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69  to avoid a bug i
15c60 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f  n GDM on RHEL */
15c70 0a 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31  .../* Bug 594911
15c80 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c  : https://bugzil
15c90 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68  la.redhat.com/sh
15ca0 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39  ow_bug.cgi?id=59
15cb0 34 39 31 31 20 2a 2f 0a 09 09 70 53 6c 6f 74 4c  4911 */...pSlotL
15cc0 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d 20 3d 20  ist[currslot] = 
15cd0 63 75 72 72 73 6c 6f 74 20 2b 20 31 3b 0a 09 7d  currslot + 1;..}
15ce0 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73  ...*pulCount = s
15cf0 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43  lot_count;...CAC
15d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15d10 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
15d20 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20  OK (%i).  Found 
15d30 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43  %lu readers.", C
15d40 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64  KR_OK, (unsigned
15d50 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e   long) slot_coun
15d60 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
15d70 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65  _OK);...tokenPre
15d80 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73  sent = tokenPres
15d90 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ent; /* Supress 
15da0 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
15db0 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b  warning */.}..CK
15dc0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
15dd0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
15de0 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  tInfo)(CK_SLOT_I
15df0 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f  D slotID, CK_SLO
15e00 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  T_INFO_PTR pInfo
15e10 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
15e20 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63  TF8CHAR slotDesc
15e30 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43  ription[] = "CAC
15e40 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20  Key Slot";..int 
15e50 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
15e60 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  nt bytes_to_copy
15e70 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
15e80 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
15e90 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
15ea0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
15eb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15ec0 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
15ed0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
15ee0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
15ef0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
15f00 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
15f10 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
15f20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15f30 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
15f40 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
15f50 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
15f60 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
15f70 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
15f80 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
15f90 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
15fa0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
15fb0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
15fc0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
15fd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15fe0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
15ff0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
16000 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
16010 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
16020 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
16030 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
16040 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
16050 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
16060 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
16070 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
16080 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
16090 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
160a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
160b0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
160c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
160d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
160e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
160f0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
16100 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
16110 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
16120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16130 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
16140 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
16150 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
16160 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
16170 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
16180 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
16190 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
161a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
161b0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
161c0 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  }...pInfo->flags
161d0 20 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45   = CKF_REMOVABLE
161e0 5f 44 45 56 49 43 45 20 7c 20 43 4b 46 5f 48 57  _DEVICE | CKF_HW
161f0 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 63 61 63  _SLOT;...if (cac
16200 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
16210 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
16220 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b  slotID]) == CACK
16230 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
16240 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66  RESENT) {...pInf
16250 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
16260 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09  TOKEN_PRESENT;..
16270 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  }...bytes_to_cop
16280 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65  y = strlen(cacke
16290 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
162a0 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69  pcsc_reader);..i
162b0 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  f (sizeof(pInfo-
162c0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
162d0 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
162e0 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  ) {...bytes_to_c
162f0 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e  opy = sizeof(pIn
16300 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
16310 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28  ID);..}..memcpy(
16320 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
16330 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c  rerID, cackey_sl
16340 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
16350 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74  _reader, bytes_t
16360 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78  o_copy);...mutex
16370 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
16380 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
16390 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
163a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
163b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
163c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
163d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
163e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
163f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
16400 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
16410 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c  memset(pInfo->sl
16420 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  otDescription, '
16430 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
16440 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
16450 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  n));..memcpy(pIn
16460 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
16470 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70  ion, slotDescrip
16480 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f  tion, sizeof(slo
16490 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  tDescription) - 
164a0 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
164b0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
164c0 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
164d0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
164e0 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f  rerID));...pInfo
164f0 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
16500 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
16510 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
16520 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
16530 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
16540 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
16550 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
16560 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
16570 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
16580 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
16590 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
165a0 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
165b0 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
165c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
165d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
165e0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
165f0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
16600 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
16610 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
16620 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49  _RV, C_GetTokenI
16630 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
16640 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e  slotID, CK_TOKEN
16650 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
16660 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
16670 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
16680 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
16690 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
166a0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
166b0 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20   defaultLabel[] 
166c0 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e  = "Unknown Token
166d0 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
166e0 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d  F8CHAR model[] =
166f0 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73   "CAC Token";..s
16700 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
16710 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
16720 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
16730 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
16740 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20  certs;..ssize_t 
16750 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20  label_ret;..int 
16760 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
16770 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  nt use_default_l
16780 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  abel;...CACKEY_D
16790 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
167a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
167b0 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
167c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
167d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
167e0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
167f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
16800 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
16810 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
16820 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
16830 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16840 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
16850 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
16860 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
16870 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
16880 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
16890 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
168a0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
168b0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
168c0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
168d0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
168e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
168f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
16900 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
16910 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
16920 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
16930 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
16940 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
16950 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
16960 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
16970 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
16980 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
16990 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
169a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
169b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
169c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
169d0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
169e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
169f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
16a00 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
16a10 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
16a20 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
16a30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16a40 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
16a50 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
16a60 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
16a70 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
16a80 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
16a90 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
16aa0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
16ab0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
16ac0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
16ad0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
16ae0 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
16af0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
16b00 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45  lotID]) != CACKE
16b10 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
16b20 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  ESENT) {...CACKE
16b30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16b40 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  No token is pres
16b50 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20  ent in slotID = 
16b60 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  %lu", slotID);..
16b70 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
16b80 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
16b90 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
16ba0 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50  (CKR_TOKEN_NOT_P
16bb0 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75  RESENT);..}...mu
16bc0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
16bd0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
16be0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
16bf0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
16c00 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
16c10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16c20 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
16c30 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
16c40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
16c50 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
16c60 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
16c70 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d  token label from
16c80 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
16c90 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
16ca0 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  label, ' ', size
16cb0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
16cc0 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  );..use_default_
16cd0 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20  label = 1;...if 
16ce0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
16cf0 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e  otID].label == N
16d00 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64  ULL) {...pcsc_id
16d10 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
16d20 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61  y_read_certs(&ca
16d30 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
16d40 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
16d50 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73  erts);...if (pcs
16d60 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
16d70 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e  NULL) {....if (n
16d80 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
16d90 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
16da0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
16db0 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
16dc0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
16dd0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
16de0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
16df0 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65  ));.....if (labe
16e00 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  l_ret > 0) {....
16e10 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
16e20 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63  bel = 0;.......c
16e30 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
16e40 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c  ID].label = mall
16e50 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  oc(sizeof(pInfo-
16e60 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09  >label));.......
16e70 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c  memcpy(cackey_sl
16e80 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
16e90 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  l, pInfo->label,
16ea0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
16eb0 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09  abel));.....}...
16ec0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
16ed0 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
16ee0 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
16ef0 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20  rts, 1);...}..} 
16f00 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
16f10 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61  pInfo->label, ca
16f20 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
16f30 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  D].label, sizeof
16f40 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
16f50 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
16f60 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09  label = 0;..}...
16f70 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f  if (use_default_
16f80 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70  label) {...memcp
16f90 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  y(pInfo->label, 
16fa0 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69  defaultLabel, si
16fb0 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65  zeof(defaultLabe
16fc0 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65  l) - 1);..}...me
16fd0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
16fe0 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
16ff0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
17000 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
17010 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
17020 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
17030 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
17040 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75  sizeof(manufactu
17050 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d  rerID) - 1);...m
17060 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emset(pInfo->mod
17070 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  el, ' ', sizeof(
17080 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a  pInfo->model));.
17090 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
170a0 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a  odel, model, siz
170b0 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b  eof(model) - 1);
170c0 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
170d0 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27  >serialNumber, '
170e0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
170f0 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29  ->serialNumber))
17100 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
17110 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20  ->utcTime, ' ', 
17120 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74  sizeof(pInfo->ut
17130 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f  cTime));...pInfo
17140 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
17150 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
17160 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
17170 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
17180 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
17190 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
171a0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
171b0 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
171c0 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
171d0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
171e0 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
171f0 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
17200 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
17210 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
17220 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  KF_WRITE_PROTECT
17230 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49  ED | CKF_USER_PI
17240 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
17250 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41  CKF_TOKEN_INITIA
17260 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73  LIZED | cackey_s
17270 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
17280 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66  en_flags;...pInf
17290 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43  o->ulMaxSessionC
172a0 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63  ount = (sizeof(c
172b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
172c0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
172d0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20  sessions[0])) - 
172e0 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73  1;..pInfo->ulSes
172f0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
17300 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
17310 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
17320 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f  ulMaxRwSessionCo
17330 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  unt = 0;..pInfo-
17340 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  >ulRwSessionCoun
17350 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
17360 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
17370 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e  .pInfo->ulMaxPin
17380 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66  Len = 128;..pInf
17390 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d  o->ulMinPinLen =
173a0 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f   0;..pInfo->ulTo
173b0 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  talPublicMemory 
173c0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
173d0 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
173e0 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c  Info->ulFreePubl
173f0 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
17400 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
17410 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
17420 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d  lTotalPrivateMem
17430 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
17440 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
17450 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
17460 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
17470 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
17480 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41  NFORMATION;...CA
17490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
174a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
174b0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
174c0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
174d0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
174e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
174f0 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  V, C_WaitForSlot
17500 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20  Event)(CK_FLAGS 
17510 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49  flags, CK_SLOT_I
17520 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43  D_PTR pSlotID, C
17530 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65  K_VOID_PTR pRese
17540 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f  rved) {..CACKEY_
17550 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
17560 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
17570 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c  Reserved != NULL
17580 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17590 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
175a0 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
175b0 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
175c0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
175d0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
175e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
175f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
17600 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17610 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
17620 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
17630 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
17640 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
17650 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
17660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17670 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
17680 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
17690 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
176a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
176b0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
176c0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
176d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
176e0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
176f0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
17700 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28  tMechanismList)(
17710 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
17720 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
17730 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e  TYPE_PTR pMechan
17740 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  ismList, CK_ULON
17750 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
17760 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
17770 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
17780 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
17790 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
177a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
177b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
177c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
177d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
177e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
177f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
17800 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d  .if (pulCount ==
17810 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
17820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17830 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74  Error.  pulCount
17840 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
17850 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
17860 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
17870 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69  if (pMechanismLi
17880 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
17890 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a  *pulCount = 3;..
178a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
178b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
178c0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
178d0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
178e0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
178f0 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20  if (*pulCount < 
17900 33 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  3) {...CACKEY_DE
17910 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17920 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73  r.  Buffer too s
17930 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  mall.");....retu
17940 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  rn(CKR_BUFFER_TO
17950 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70  O_SMALL);..}...p
17960 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d  MechanismList[0]
17970 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b   = CKM_RSA_PKCS;
17980 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  ..pMechanismList
17990 5b 31 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52  [1] = CKM_SHA1_R
179a0 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f  SA_PKCS;..*pulCo
179b0 75 6e 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45  unt = 2;...CACKE
179c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
179d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
179e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
179f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
17a00 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
17a10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
17a20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
17a30 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
17a40 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
17a50 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43  ISM_TYPE type, C
17a60 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f  K_MECHANISM_INFO
17a70 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
17a80 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
17a90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17aa0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
17ab0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
17ac0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
17ad0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17ae0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
17af0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
17b00 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
17b10 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
17b20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
17b30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
17b40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17b50 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
17b60 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
17b70 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
17b80 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
17b90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
17ba0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
17bb0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
17bc0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
17bd0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
17be0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
17bf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17c00 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
17c10 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
17c20 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
17c30 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
17c40 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
17c50 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
17c60 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
17c70 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
17c80 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
17c90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
17ca0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
17cb0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
17cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17cd0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
17ce0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
17cf0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
17d00 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
17d10 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
17d20 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
17d30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
17d40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17d50 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
17d60 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
17d70 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
17d80 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
17d90 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
17da0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
17db0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
17dc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
17dd0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
17de0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
17df0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
17e00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
17e10 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
17e20 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
17e30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17e40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17e50 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
17e60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
17e70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
17e80 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20  );..}.../* XXX: 
17e90 54 68 69 73 20 69 73 20 75 6e 74 65 73 74 65 64  This is untested
17ea0 2c 20 61 6e 64 20 66 75 72 74 68 65 72 20 49 27  , and further I'
17eb0 6d 20 6e 6f 74 20 72 65 61 6c 6c 79 20 73 75 72  m not really sur
17ec0 65 20 69 66 20 74 68 69 73 20 69 73 20 63 6f 72  e if this is cor
17ed0 72 65 63 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68  rect. */..switch
17ee0 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65   (type) {...case
17ef0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
17f00 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65  ..pInfo->ulMinKe
17f10 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09  ySize = 512;....
17f20 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53  pInfo->ulMaxKeyS
17f30 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70  ize = 8192;....p
17f40 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
17f50 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59  F_HW | CKF_ENCRY
17f60 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54  PT | CKF_DECRYPT
17f70 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
17f80 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
17f90 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ak;...case CKM_R
17fa0 53 41 5f 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e  SA_X_509:....pIn
17fb0 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
17fc0 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
17fd0 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
17fe0 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
17ff0 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
18000 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
18010 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
18020 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
18030 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
18040 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52  .case CKM_SHA1_R
18050 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
18060 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
18070 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
18080 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
18090 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
180a0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
180b0 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f   CKF_SIGN | CKF_
180c0 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b  VERIFY;....break
180d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
180e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
180f0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
18100 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
18110 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
18120 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
18130 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
18140 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
18150 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
18160 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f  C_InitToken)(CK_
18170 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
18180 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
18190 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
181a0 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  lPinLen, CK_UTF8
181b0 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29  CHAR_PTR pLabel)
181c0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
181d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
181e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
181f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
18200 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18210 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18220 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
18230 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18240 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
18250 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
18260 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18270 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
18280 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
18290 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
182a0 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
182b0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
182c0 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
182d0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
182e0 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
182f0 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
18300 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
18310 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
18320 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43  RV, C_InitPIN)(C
18330 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
18340 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
18350 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
18360 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
18370 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
18380 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
18390 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
183a0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
183b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
183c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
183d0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
183e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
183f0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
18400 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
18410 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
18420 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
18430 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
18440 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
18450 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
18460 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
18470 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
18480 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
18490 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
184a0 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
184b0 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
184c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
184d0 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29  CK_RV, C_SetPIN)
184e0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
184f0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
18500 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c  UTF8CHAR_PTR pOl
18510 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dPin, CK_ULONG u
18520 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  lOldPinLen, CK_U
18530 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77  TF8CHAR_PTR pNew
18540 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
18550 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41  NewPinLen) {..CA
18560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18570 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18580 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
18590 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
185a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
185b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
185c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
185d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
185e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
185f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
18600 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18610 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
18620 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
18630 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
18640 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
18650 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
18660 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
18670 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
18680 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
18690 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f  CTION(CK_RV, C_O
186a0 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  penSession)(CK_S
186b0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
186c0 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
186d0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
186e0 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49  ication, CK_NOTI
186f0 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45  FY notify, CK_SE
18700 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52  SSION_HANDLE_PTR
18710 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75   phSession) {..u
18720 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78  nsigned long idx
18730 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
18740 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f  val;..int found_
18750 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43  session = 0;...C
18760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18770 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
18780 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b  .if ((flags & CK
18790 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
187a0 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f  ) != CKF_SERIAL_
187b0 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74  SESSION) {...ret
187c0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
187d0 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50  PARALLEL_NOT_SUP
187e0 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  PORTED);..}...if
187f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
18800 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
18810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18820 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
18830 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
18840 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
18850 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
18860 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
18870 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
18880 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
18890 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
188a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
188b0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
188c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
188d0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
188e0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
188f0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
18900 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
18910 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
18920 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
18930 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
18940 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
18950 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
18960 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
18970 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
18980 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
18990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
189a0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
189b0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
189c0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
189d0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
189e0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
189f0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
18a00 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18a10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18a20 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
18a30 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
18a40 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
18a50 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
18a60 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
18a70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
18a80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
18a90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
18aa0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
18ab0 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
18ac0 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61  at the card is a
18ad0 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73  ctually in the s
18ae0 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a  lot. */../* XXX:
18af0 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
18b00 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74  ure this is in t
18b10 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69  he PKCS#11 speci
18b20 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  fication */..if 
18b30 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
18b40 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
18b50 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
18b60 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
18b70 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
18b80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18b90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72  NTF("Error.  Car
18ba0 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20  d not present.  
18bb0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45  Returning CKR_DE
18bc0 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a  VICE_REMOVED");.
18bd0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
18be0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
18bf0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
18c00 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  n(CKR_DEVICE_REM
18c10 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  OVED);..}...for 
18c20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20  (idx = 1; idx < 
18c30 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
18c40 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
18c50 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
18c60 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
18c70 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
18c80 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
18c90 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f  ive) {....found_
18ca0 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09  session = 1;....
18cb0 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64  .*phSession = id
18cc0 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  x;.....cackey_se
18cd0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
18ce0 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65  ve = 1;....cacke
18cf0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
18d00 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b  slotID = slotID;
18d10 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
18d20 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d  ons[idx].state =
18d30 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
18d40 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65  ESSION;....cacke
18d50 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
18d60 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09  flags = flags;..
18d70 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18d80 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45  s[idx].ulDeviceE
18d90 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63  rror = 0;....cac
18da0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
18db0 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d  ].pApplication =
18dc0 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09   pApplication;..
18dd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18de0 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20  s[idx].Notify = 
18df0 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b  notify;.....cack
18e00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
18e10 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
18e20 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  LL;....cackey_se
18e30 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
18e40 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
18e50 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
18e60 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63  sions[idx].searc
18e70 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
18e80 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18e90 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69  s[idx].sign_acti
18ea0 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
18eb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
18ec0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
18ed0 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
18ee0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
18ef0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
18f00 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
18f10 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
18f20 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
18f30 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
18f40 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
18f50 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
18f60 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
18f70 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
18f80 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18f90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18fa0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18fb0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18fd0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
18fe0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
18ff0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
19000 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
19010 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20  !found_session) 
19020 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19030 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19040 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ng CKR_SESSION_C
19050 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f  OUNT (%i)", CKR_
19060 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
19070 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
19080 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d  SSION_COUNT);..}
19090 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
190a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
190b0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
190c0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
190d0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
190e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
190f0 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53  (CK_RV, C_CloseS
19100 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  ession)(CK_SESSI
19110 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
19120 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  on) {..int mutex
19130 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
19140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19150 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
19160 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
19170 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
19180 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19190 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
191a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
191b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
191c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
191d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
191e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
191f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
19200 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
19210 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
19220 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
19230 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19240 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19250 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
19260 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
19270 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
19280 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
19290 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
192a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
192b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
192c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
192d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
192e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
192f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19300 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
19310 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
19320 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
19330 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
19340 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19350 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
19360 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
19370 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
19380 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
19390 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
193a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
193b0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
193c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
193d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
193e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
193f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19400 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
19410 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72   = 0;..cackey_fr
19420 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
19430 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19440 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
19450 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
19460 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
19470 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
19480 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
19490 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
194a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
194b0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
194c0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
194d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
194e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
194f0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
19500 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19510 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
19520 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
19530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19540 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
19550 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
19560 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
19570 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
19580 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
19590 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29  loseAllSessions)
195a0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
195b0 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  ID) {..uint32_t 
195c0 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
195d0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
195e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
195f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
19600 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
19610 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
19620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19630 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
19640 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
19650 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
19660 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
19670 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
19680 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
19690 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
196a0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
196b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
196c0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
196d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
196e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
196f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
19700 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
19710 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
19720 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
19730 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
19740 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
19750 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
19760 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
19770 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
19780 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
19790 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
197a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
197b0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
197c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
197d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
197e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
197f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
19800 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
19810 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19820 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19830 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
19840 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
19850 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
19860 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
19870 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
19880 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
19890 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
198a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
198b0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
198c0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
198d0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
198e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
198f0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
19900 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
19910 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
19920 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
19930 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69  ].active) {....i
19940 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
19950 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21  ns[idx].slotID !
19960 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09  = slotID) {.....
19970 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
19980 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
19990 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
199a0 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f  glock);....C_Clo
199b0 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
199c0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
199d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
199e0 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ock);...}..}...m
199f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
19a00 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
19a10 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
19a20 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
19a30 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
19a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19a50 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
19a60 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
19a70 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
19a80 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
19a90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
19aa0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19ab0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
19ac0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
19ad0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
19ae0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
19af0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65  N(CK_RV, C_GetSe
19b00 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45  ssionInfo)(CK_SE
19b10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
19b20 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f  ssion, CK_SESSIO
19b30 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
19b40 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
19b50 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
19b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
19b70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
19b80 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
19b90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19ba0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
19bb0 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
19bc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
19bd0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
19be0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
19bf0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
19c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19c10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
19c20 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
19c30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
19c40 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
19c50 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
19c60 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
19c70 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
19c80 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
19c90 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
19ca0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
19cb0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
19cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19cd0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
19ce0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
19cf0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
19d00 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
19d10 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
19d20 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
19d30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
19d40 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
19d50 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
19d60 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
19d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19d80 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
19d90 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
19da0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
19db0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
19dc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
19dd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19de0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
19df0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19e00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19e10 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19e20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19e30 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
19e40 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
19e50 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
19e60 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
19e70 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f  ..}...pInfo->slo
19e80 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
19e90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19ea0 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e  slotID;..pInfo->
19eb0 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73  state = cackey_s
19ec0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19ed0 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d  ].state;..pInfo-
19ee0 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f  >flags = cackey_
19ef0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
19f00 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f  n].flags;..pInfo
19f10 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20  ->ulDeviceError 
19f20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
19f30 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65  s[hSession].ulDe
19f40 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74  viceError;...mut
19f50 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
19f60 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19f70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19f80 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
19f90 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
19fa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19fb0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
19fc0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
19fd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
19fe0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
19ff0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a000 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1a010 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1a020 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1a030 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1a040 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1a050 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72  CK_RV, C_GetOper
1a060 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
1a070 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1a080 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1a090 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
1a0a0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ate, CK_ULONG_PT
1a0b0 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  R pulOperationSt
1a0c0 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ateLen) {..CACKE
1a0d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a0e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1a0f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1a100 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1a110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a120 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1a130 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a140 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a150 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1a160 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1a170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a180 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1a190 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1a1a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1a1b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1a1c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1a1d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1a1e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1a1f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1a200 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f  ON(CK_RV, C_SetO
1a210 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
1a220 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1a230 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1a240 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
1a250 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
1a260 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74   ulOperationStat
1a270 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  eLen, CK_OBJECT_
1a280 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69  HANDLE hEncrypti
1a290 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  onKey, CK_OBJECT
1a2a0 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74  _HANDLE hAuthent
1a2b0 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43  icationKey) {..C
1a2c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a2d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1a2e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1a2f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1a300 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a310 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1a320 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1a330 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1a340 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1a350 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1a360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a370 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a380 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1a390 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1a3a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1a3b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1a3c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1a3d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1a3e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1a3f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1a400 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f  Login)(CK_SESSIO
1a410 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1a420 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20  n, CK_USER_TYPE 
1a430 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46  userType, CK_UTF
1a440 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
1a450 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
1a460 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  n) {..CK_SLOT_ID
1a470 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
1a480 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1a490 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
1a4a0 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74  ;..int login_ret
1a4b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1a4c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1a4d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1a4e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1a4f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a500 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a510 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1a520 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a530 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1a540 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1a550 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1a560 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1a570 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1a580 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1a590 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1a5a0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1a5b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a5c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1a5d0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1a5e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1a5f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1a600 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1a610 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20  ...if (userType 
1a620 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09  != CKU_USER) {..
1a630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a640 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65  INTF("Error.  We
1a650 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53   only support US
1a660 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66  ER mode, asked f
1a670 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28  or %lu mode.", (
1a680 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1a690 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75  serType)....retu
1a6a0 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45  rn(CKR_USER_TYPE
1a6b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1a6c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1a6d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1a6e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1a6f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1a700 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1a710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a720 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1a730 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1a740 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1a750 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1a760 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1a770 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a780 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1a790 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1a7a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a7b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a7c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a7d0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1a7e0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1a7f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1a800 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1a810 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
1a820 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a830 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
1a840 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1a850 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1a860 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1a870 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1a880 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1a890 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a8a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a8b0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1a8c0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1a8d0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1a8e0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1a8f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1a900 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1a910 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1a920 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
1a930 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
1a940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a950 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1a960 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1a970 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
1a980 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1a990 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1a9a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1a9b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1a9c0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1a9d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1a9e0 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65  );..}...login_re
1a9f0 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  t = cackey_login
1aa00 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
1aa10 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c  lotID], pPin, ul
1aa20 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72  PinLen, &tries_r
1aa30 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20 28  emaining);..if (
1aa40 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  login_ret != CAC
1aa50 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
1aa60 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1aa70 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1aa80 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c  glock);....if (l
1aa90 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
1aaa0 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
1aab0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1aac0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1aad0 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
1aae0 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ked.");.....cack
1aaf0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1ab00 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
1ab10 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
1ab20 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  KED;.....return(
1ab30 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
1ab40 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
1ab50 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
1ab60 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
1ab70 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1ab80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ab90 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
1aba0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
1abb0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
1abc0 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
1abd0 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
1abe0 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  W;.....if (tries
1abf0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29  _remaining == 1)
1ac00 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
1ac10 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
1ac20 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
1ac30 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52  SER_PIN_FINAL_TR
1ac40 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  Y;....}.....retu
1ac50 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
1ac60 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  RECT);...}....CA
1ac70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ac80 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f  F("Error.  Unkno
1ac90 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65  wn error returne
1aca0 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f  d from cackey_lo
1acb0 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67  gin() (%i)", log
1acc0 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  in_ret);....retu
1acd0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ace0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  RROR);..}...cack
1acf0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1ad00 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20  .token_flags &= 
1ad10 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c  ~(CKF_USER_PIN_L
1ad20 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52  OCKED | CKF_USER
1ad30 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c  _PIN_COUNT_LOW |
1ad40 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
1ad50 52 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  RED | CKF_USER_P
1ad60 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a  IN_FINAL_TRY);..
1ad70 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1ad80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
1ad90 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46   = CKS_RO_USER_F
1ada0 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65  UNCTIONS;...mute
1adb0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1adc0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1add0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1ade0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1adf0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1ae00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ae10 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1ae20 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1ae30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1ae40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1ae50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ae60 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ae70 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1ae80 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1ae90 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1aea0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1aeb0 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28  K_RV, C_Logout)(
1aec0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1aed0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
1aee0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1aef0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1af00 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1af10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1af20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1af30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1af40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1af50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1af60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1af70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1af80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1af90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1afa0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1afb0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1afc0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1afd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1afe0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1aff0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1b000 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b010 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1b020 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1b030 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1b040 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1b050 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1b060 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1b070 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1b080 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1b090 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1b0a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1b0b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b0c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b0d0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1b0e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b0f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1b100 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1b110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1b120 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1b130 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1b140 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1b150 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1b160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b170 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1b180 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1b190 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1b1a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1b1b0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
1b1c0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
1b1d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1b1e0 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
1b1f0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1b200 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1b210 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1b220 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1b230 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1b240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b250 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1b260 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1b270 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1b280 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1b290 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1b2a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1b2b0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1b2c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1b2d0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1b2e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b2f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b300 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1b310 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1b320 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1b330 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1b340 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1b350 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1b360 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1b370 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1b380 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61  _ERROR);..}...ca
1b390 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b3a0 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20  ession].state = 
1b3b0 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
1b3c0 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f 73  SSION;..cackey_s
1b3d0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1b3e0 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
1b3f0 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a  OGIN_REQUIRED;..
1b400 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1b410 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1b420 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1b430 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1b440 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1b450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1b470 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1b480 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b490 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1b4a0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1b4b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1b4c0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1b4d0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1b4e0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1b4f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1b500 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65  ION(CK_RV, C_Cre
1b510 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  ateObject)(CK_SE
1b520 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1b530 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
1b540 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
1b550 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
1b560 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
1b570 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
1b580 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
1b590 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1b5a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1b5b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1b5c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b5d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b5e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1b5f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b600 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1b610 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1b620 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1b630 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b640 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1b650 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1b660 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1b670 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1b680 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1b690 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b6a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1b6b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1b6c0 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65  K_RV, C_CopyObje
1b6d0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
1b6e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1b6f0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1b700 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
1b710 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
1b720 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
1b730 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
1b740 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e  T_HANDLE_PTR phN
1b750 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  ewObject) {..CAC
1b760 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b770 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1b780 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1b790 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1b7a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b7b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1b7c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1b7d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1b7e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1b7f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1b800 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b810 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1b820 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1b830 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1b840 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b850 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1b860 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1b870 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1b880 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1b890 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
1b8a0 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f  stroyObject)(CK_
1b8b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1b8c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1b8d0 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1b8e0 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
1b8f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1b900 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1b910 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1b920 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b930 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b940 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1b950 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b960 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1b970 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b980 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1b990 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1b9a0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1b9b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1b9c0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1b9d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1b9e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1b9f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1ba00 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1ba10 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1ba20 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74  _RV, C_GetObject
1ba30 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Size)(CK_SESSION
1ba40 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1ba50 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1ba60 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  LE hObject, CK_U
1ba70 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65  LONG_PTR pulSize
1ba80 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1ba90 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1baa0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1bab0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1bac0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1bad0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bae0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1baf0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1bb00 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1bb10 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1bb20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bb30 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1bb40 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1bb50 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1bb60 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1bb70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1bb80 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1bb90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1bba0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1bbb0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1bbc0 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75  RV, C_GetAttribu
1bbd0 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
1bbe0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1bbf0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
1bc00 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
1bc10 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
1bc20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
1bc30 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
1bc40 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
1bc50 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74  rr_attr;..struct
1bc60 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1bc70 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73   *identity;..uns
1bc80 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
1bc90 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64  ity_idx, attr_id
1bca0 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
1bcb0 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20  , num_ids;..int 
1bcc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43  mutex_retval;..C
1bcd0 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
1bce0 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  R_OK;..CK_VOID_P
1bcf0 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
1bd00 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
1bd10 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bd20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1bd30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1bd40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1bd50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bd60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1bd70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1bd80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1bd90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1bda0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1bdb0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1bdc0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1bdd0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1bde0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1bdf0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1be00 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1be10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1be20 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1be30 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1be40 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1be50 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1be60 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1be70 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d  ..if (hObject ==
1be80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1be90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1bea0 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
1beb0 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
1bec0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1bed0 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
1bee0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1bef0 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20  .if (ulCount == 
1bf00 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
1bf10 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
1bf20 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
1bf30 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
1bf40 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
1bf50 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45  ately */...CACKE
1bf60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bf70 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1bf80 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
1bf90 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
1bfa0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1bfb0 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  K);..}...if (pTe
1bfc0 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  mplate == NULL) 
1bfd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1bfe0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bff0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55   pTemplate is NU
1c000 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1c010 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1c020 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  AD);..}...identi
1c030 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74  ty_idx = hObject
1c040 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   - 1;...mutex_re
1c050 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1c060 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1c070 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1c080 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1c090 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c0a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c0b0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1c0c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1c0d0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1c0e0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1c0f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1c100 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1c110 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1c120 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1c130 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1c140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c150 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1c160 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1c170 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1c180 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1c190 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75  NVALID);..}...nu
1c1a0 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73  m_ids = cackey_s
1c1b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c1c0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1c1d0 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  nt;...if (identi
1c1e0 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64  ty_idx >= num_id
1c1f0 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  s) {...cackey_mu
1c200 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1c210 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1c220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c230 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
1c240 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
1c250 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74   range.  identit
1c260 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d  y_idx = %lu, num
1c270 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75  _ids = %lu.", (u
1c280 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
1c290 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73  entity_idx, (uns
1c2a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f  igned long) num_
1c2b0 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ids);....return(
1c2c0 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
1c2d0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1c2e0 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  .identity = &cac
1c2f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1c300 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1c310 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b  s[identity_idx];
1c320 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
1c330 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
1c340 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69   ulCount; attr_i
1c350 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61  dx++) {...curr_a
1c360 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65  ttr = &pTemplate
1c370 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70  [attr_idx];....p
1c380 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
1c390 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1c3a0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41  _LONG) -1;....CA
1c3b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c3c0 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  F("Looking for a
1c3d0 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78  ttribute 0x%08lx
1c3e0 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20   (identity:%lu) 
1c3f0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1c400 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
1c410 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  >type, (unsigned
1c420 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
1c430 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65  idx);....for (se
1c440 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
1c450 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
1c460 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
1c470 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
1c480 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
1c490 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
1c4a0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1c4b0 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
1c4c0 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
1c4d0 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  pe) {.....CACKEY
1c4e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1c4f0 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56  ... found it, pV
1c500 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c  alue = %p, ulVal
1c510 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64  ueLen = %lu", id
1c520 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
1c530 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1c540 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69  ].pValue, identi
1c550 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
1c560 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1c570 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a  ValueLen);......
1c580 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
1c590 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
1c5a0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1c5b0 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56  .pValue;.....ulV
1c5c0 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69  alueLen = identi
1c5d0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
1c5e0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1c5f0 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09  ValueLen;....}..
1c600 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61  .}....if (curr_a
1c610 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70  ttr->pValue && p
1c620 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28  Value) {....if (
1c630 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
1c640 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65  ueLen >= ulValue
1c650 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  Len) {.....memcp
1c660 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  y(curr_attr->pVa
1c670 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56  lue, pValue, ulV
1c680 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65  alueLen);....} e
1c690 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75  lse {.....ulValu
1c6a0 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
1c6b0 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c   -1;......retval
1c6c0 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
1c6d0 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09  O_SMALL;....}...
1c6e0 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e  }....curr_attr->
1c6f0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
1c700 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75  alueLen;..}...mu
1c710 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1c720 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1c730 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1c740 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1c750 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1c760 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c770 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1c780 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1c790 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1c7a0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1c7b0 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
1c7c0 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
1c7d0 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
1c7e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c7f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1c800 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
1c810 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22  PE_INVALID (%i)"
1c820 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
1c830 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
1c840 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  val == CKR_BUFFE
1c850 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
1c860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c870 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1c880 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
1c890 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74  MALL (%i)", (int
1c8a0 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
1c8b0 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
1c8c0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
1c8d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c8e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c8f0 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  OK (%i)", (int) 
1c900 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
1c910 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c920 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1c930 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
1c940 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
1c950 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1c960 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1c970 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41  ON(CK_RV, C_SetA
1c980 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
1c990 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1c9a0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
1c9b0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
1c9c0 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
1c9d0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
1c9e0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
1c9f0 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
1ca00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ca10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1ca20 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1ca30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ca40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ca50 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1ca60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1ca70 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1ca80 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1ca90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1caa0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1cab0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1cac0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1cad0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1cae0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1caf0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1cb00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1cb10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1cb20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1cb30 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
1cb40 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  tsInit)(CK_SESSI
1cb50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1cb60 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
1cb70 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
1cb80 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
1cb90 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
1cba0 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e  slotID;..CK_ULON
1cbb0 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
1cbc0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1cbd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cbe0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1cbf0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1cc00 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1cc10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cc20 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1cc30 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1cc40 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1cc50 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1cc60 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
1cc70 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1cc80 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1cc90 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1cca0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1ccb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1ccc0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1ccd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cce0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1ccf0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1cd00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1cd10 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1cd20 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1cd30 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1cd40 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1cd50 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1cd60 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1cd70 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1cd80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1cd90 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1cda0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1cdb0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1cdc0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1cdd0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1cde0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1cdf0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1ce00 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ce10 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1ce20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ce30 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1ce40 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1ce50 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ce60 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1ce70 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1ce80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
1ce90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1cea0 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
1ceb0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1cec0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1ced0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1cee0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cef0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c  rror.  Search al
1cf00 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b  ready active.");
1cf10 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1cf20 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
1cf30 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  E);..}...slotID 
1cf40 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1cf50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
1cf60 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
1cf70 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1cf80 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1cf90 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1cfa0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1cfb0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1cfc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cfd0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1cfe0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1cff0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1d000 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1d010 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1d020 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1d030 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1d040 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1d050 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1d060 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d070 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1d080 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1d090 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1d0a0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1d0b0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1d0c0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1d0d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1d0e0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1d0f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d100 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
1d110 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1d120 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ID].slot_reset) 
1d130 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d140 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f  _PRINTF("The slo
1d150 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74  t has been reset
1d160 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c   since we last l
1d170 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69  ooked for identi
1d180 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69  ties -- rescanni
1d190 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63  ng");....if (cac
1d1a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1d1b0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1d1c0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
1d1d0 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
1d1e0 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
1d1f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1d200 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
1d210 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1d220 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1d230 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61  s_count);.....ca
1d240 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1d250 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1d260 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
1d270 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1d280 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1d290 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  es_count = 0;...
1d2a0 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
1d2b0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1d2c0 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel != NULL) {..
1d2d0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
1d2e0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1d2f0 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  l);....cackey_sl
1d300 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1d310 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
1d320 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
1d330 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
1d340 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1d350 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1d360 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
1d370 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09  OGIN_REQUIRED;..
1d380 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1d390 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d3a0 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20  ].identities == 
1d3b0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1d3c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d3d0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
1d3e0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65   cackey_read_ide
1d3f0 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f  ntities(&cackey_
1d400 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26  slots[slotID], &
1d410 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d420 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1d430 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a  ties_count);..}.
1d440 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20  ..if (pTemplate 
1d450 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20  != NULL) {...if 
1d460 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b  (ulCount != 0) {
1d470 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1d480 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1d490 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
1d4a0 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63   = ulCount;....c
1d4b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1d4c0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1d4d0 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75  query = malloc(u
1d4e0 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  lCount * sizeof(
1d4f0 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09  *pTemplate));...
1d500 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
1d510 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d520 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c  n].search_query,
1d530 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f   pTemplate, ulCo
1d540 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54  unt * sizeof(*pT
1d550 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f  emplate));....fo
1d560 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1d570 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b  < ulCount; idx++
1d580 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d  ) {.....if (pTem
1d590 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c  plate[idx].ulVal
1d5a0 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  ueLen == 0) {...
1d5b0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d5c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1d5d0 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
1d5e0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  Value = NULL;...
1d5f0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1d600 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
1d610 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d620 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
1d630 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61  idx].pValue = ma
1d640 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69  lloc(pTemplate[i
1d650 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
1d660 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
1d670 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d680 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1d690 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a  [idx].pValue) {.
1d6a0 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
1d6b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d6c0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1d6d0 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  ry[idx].pValue, 
1d6e0 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70  pTemplate[idx].p
1d6f0 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65  Value, pTemplate
1d700 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
1d710 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09  );.....}....}...
1d720 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b  } else {....cack
1d730 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d740 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1d750 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
1d760 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1d770 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1d780 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a  h_query = NULL;.
1d790 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
1d7a0 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30  if (ulCount != 0
1d7b0 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  ) {....cackey_mu
1d7c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1d7d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
1d7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d7f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
1d800 72 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66  rch query specif
1d810 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74  ied as NULL, but
1d820 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79   number of query
1d830 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69   terms not speci
1d840 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09  fied as 0.");...
1d850 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1d860 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d  UMENTS_BAD);...}
1d870 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1d880 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1d890 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
1d8a0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1d8b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d8c0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d  ].search_query =
1d8d0 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b   NULL;..}...cack
1d8e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d8f0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
1d900 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79  ive = 1;..cackey
1d910 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d920 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
1d930 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f  id = 0;...mutex_
1d940 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1d950 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1d960 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1d970 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1d980 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1d990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d9a0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1d9b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d9c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d9d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1d9e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d9f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1da00 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1da10 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1da20 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1da30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1da40 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
1da50 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
1da60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1da70 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
1da80 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b  PTR phObject, CK
1da90 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65  _ULONG ulMaxObje
1daa0 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e  ctCount, CK_ULON
1dab0 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43  G_PTR pulObjectC
1dac0 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
1dad0 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
1dae0 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54  *curr_id;..CK_AT
1daf0 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
1db00 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75  tr;..CK_ULONG cu
1db10 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  rr_id_idx, curr_
1db20 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72  out_id_idx, curr
1db30 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f  _attr_idx, sess_
1db40 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c  attr_idx;..CK_UL
1db50 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ONG matched_coun
1db60 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  t, prev_matched_
1db70 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65  count;..int mute
1db80 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1db90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dba0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1dbb0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1dbc0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1dbd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1dbe0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1dbf0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1dc00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1dc10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1dc20 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
1dc30 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20  lObjectCount == 
1dc40 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1dc50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1dc60 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74  rror.  pulObject
1dc70 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29  Count is NULL.")
1dc80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1dc90 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1dca0 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63  .}...if (phObjec
1dcb0 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d  t == NULL && ulM
1dcc0 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  axObjectCount ==
1dcd0 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
1dce0 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72   circuit, if zer
1dcf0 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73  o objects were s
1dd00 70 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20  pecified return 
1dd10 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64  zero items immed
1dd20 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c  iately */...*pul
1dd30 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b  ObjectCount = 0;
1dd40 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1dd50 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1dd60 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
1dd70 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
1dd80 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
1dd90 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
1dda0 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d  ..if (phObject =
1ddb0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1ddc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ddd0 22 45 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63  "Error.  phObjec
1dde0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
1ddf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1de00 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1de10 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74  .if (ulMaxObject
1de20 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
1de30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1de40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 61 78  NTF("Error.  Max
1de50 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f  imum number of o
1de60 62 6a 65 63 74 73 20 73 70 65 63 69 66 69 65 64  bjects specified
1de70 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09   as zero.");....
1de80 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1de90 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1dea0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1deb0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1dec0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1ded0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1dee0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1def0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1df00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1df10 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1df20 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1df30 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1df40 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1df50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1df60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1df70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1df80 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1df90 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1dfa0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1dfb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dfc0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1dfd0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1dfe0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1dff0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1e000 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1e010 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1e020 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1e030 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1e040 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e050 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1e060 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e070 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1e080 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1e090 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1e0a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1e0b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1e0c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1e0d0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
1e0e0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1e0f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1e100 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1e110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e120 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1e130 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e  arch not active.
1e140 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1e150 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
1e160 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e170 09 7d 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64  .}...curr_out_id
1e180 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28  _idx = 0;..for (
1e190 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61  curr_id_idx = ca
1e1a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e1b0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
1e1c0 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f  urr_id; curr_id_
1e1d0 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
1e1e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1e1f0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
1e200 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43   && ulMaxObjectC
1e210 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64  ount; curr_id_id
1e220 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64  x++) {...curr_id
1e230 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
1e240 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1e250 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64  entities[curr_id
1e260 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59  _idx];....CACKEY
1e270 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
1e280 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69  rocessing identi
1e290 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  ty:%lu", (unsign
1e2a0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64  ed long) curr_id
1e2b0 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65  _idx);....matche
1e2c0 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  d_count = 0;....
1e2d0 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69  for (curr_attr_i
1e2e0 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74  dx = 0; curr_att
1e2f0 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  r_idx < cackey_s
1e300 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e310 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1e320 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f  ount; curr_attr_
1e330 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76  idx++) {....prev
1e340 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
1e350 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a   matched_count;.
1e360 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
1e370 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1e380 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1e390 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74  h_query[curr_att
1e3a0 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b  r_idx];.....CACK
1e3b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e3c0 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20  "  Checking for 
1e3d0 61 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c  attribute 0x%08l
1e3e0 78 20 69 6e 20 69 64 65 6e 74 69 74 79 3a 25 69  x in identity:%i
1e3f0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1e400 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
1e410 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72  >type, (int) cur
1e420 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41  r_id_idx);....CA
1e430 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e440 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c  BUF("    Value l
1e450 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75  ooking for:", cu
1e460 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
1e470 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61   curr_attr->ulVa
1e480 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72  lueLen);.....for
1e490 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
1e4a0 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
1e4b0 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74  dx < curr_id->at
1e4c0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
1e4d0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
1e4e0 20 7b 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f   {.....if (curr_
1e4f0 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
1e500 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79  ess_attr_idx].ty
1e510 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d  pe == curr_attr-
1e520 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 09 43 41  >type) {......CA
1e530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e540 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64  F("    ... found
1e550 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e   matching type .
1e560 2e 2e 22 29 3b 0a 09 09 09 09 09 43 41 43 4b 45  ..");......CACKE
1e570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
1e580 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61  ("    ... our va
1e590 6c 75 65 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e  lue:", curr_id->
1e5a0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1e5b0 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
1e5c0 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  , curr_id->attri
1e5d0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1e5e0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
1e5f0 3b 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72  ;.......if (curr
1e600 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 3d 3d  _attr->pValue ==
1e610 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43   NULL) {.......C
1e620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e630 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
1e640 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61  ound wildcard ma
1e650 74 63 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61  tch");........ma
1e660 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a  tched_count++;..
1e670 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1e680 09 09 7d 0a 0a 20 09 09 09 09 09 69 66 20 28 63  ..}.. .....if (c
1e690 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
1e6a0 65 4c 65 6e 20 3d 3d 20 63 75 72 72 5f 69 64 2d  eLen == curr_id-
1e6b0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1e6c0 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
1e6d0 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28  ueLen && memcmp(
1e6e0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1e6f0 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  e, curr_id->attr
1e700 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1e710 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75  _idx].pValue, cu
1e720 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
1e730 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1e740 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20  .ulValueLen) == 
1e750 30 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  0) {.......CACKE
1e760 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e770 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
1e780 20 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a   exact match");.
1e790 0a 09 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63  .......matched_c
1e7a0 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62  ount++;........b
1e7b0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
1e7c0 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49  .}....}...../* I
1e7d0 66 20 74 68 65 20 61 74 74 72 69 62 75 74 65 20  f the attribute 
1e7e0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74  could not be mat
1e7f0 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79  ched, do not try
1e800 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69   to match additi
1e810 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73 20  onal attributes 
1e820 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d  */....if (prev_m
1e830 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20  atched_count == 
1e840 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b  matched_count) {
1e850 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
1e860 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63  ...}....if (matc
1e870 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63  hed_count == cac
1e880 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1e890 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1e8a0 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  ery_count) {....
1e8b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e8c0 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25  NTF("  ... All %
1e8d0 69 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65  i attributes che
1e8e0 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20  cked for found, 
1e8f0 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  adding identity:
1e900 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c  %i to returned l
1e910 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b  ist", (int) cack
1e920 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1e930 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1e940 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  ry_count, (int) 
1e950 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09  curr_id_idx);...
1e960 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f  ..phObject[curr_
1e970 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75  out_id_idx] = cu
1e980 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a  rr_id_idx + 1;..
1e990 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  ...ulMaxObjectCo
1e9a0 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f  unt--;.....curr_
1e9b0 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09  out_id_idx++;...
1e9c0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
1e9d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e9e0 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25  "  ... Not all %
1e9f0 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69  i (only found %i
1ea00 29 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65  ) attributes che
1ea10 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20  cked for found, 
1ea20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74  not adding ident
1ea30 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63  ity:%i", (int) c
1ea40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1ea50 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1ea60 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e  query_count, (in
1ea70 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  t) matched_count
1ea80 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f  , (int) curr_id_
1ea90 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61  idx);...}..}..ca
1eaa0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1eab0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
1eac0 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64  urr_id = curr_id
1ead0 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63  _idx;..*pulObjec
1eae0 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75  tCount = curr_ou
1eaf0 74 5f 69 64 5f 69 64 78 3b 0a 0a 09 6d 75 74 65  t_id_idx;...mute
1eb00 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1eb10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1eb20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1eb30 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1eb40 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1eb50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eb60 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1eb70 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1eb80 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1eb90 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1eba0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ebb0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ebc0 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d  CKR_OK (%i), num
1ebd0 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c   objects = %lu",
1ebe0 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a   CKR_OK, *pulObj
1ebf0 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ectCount);...ret
1ec00 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1ec10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1ec20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
1ec30 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b  ObjectsFinal)(CK
1ec40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1ec50 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f  hSession) {..CK_
1ec60 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
1ec70 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
1ec80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ec90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1eca0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1ecb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1ecc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ecd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1ece0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1ecf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1ed00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1ed10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1ed20 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1ed30 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1ed40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1ed50 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1ed60 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1ed70 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1ed80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ed90 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1eda0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1edb0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1edc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1edd0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1ede0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1edf0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1ee00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ee10 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1ee20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1ee30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ee40 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1ee50 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1ee60 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1ee70 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1ee80 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1ee90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1eea0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1eeb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1eec0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1eed0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1eee0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1eef0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1ef00 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1ef10 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1ef20 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1ef30 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1ef40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ef50 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
1ef60 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1ef70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ef80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1ef90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1efa0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
1efb0 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
1efc0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1efd0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
1efe0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1eff0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1f000 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1f010 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
1f020 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1f030 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
1f040 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1f050 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
1f060 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
1f070 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
1f080 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1f090 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
1f0a0 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65  Value) {....free
1f0b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1f0c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1f0d0 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
1f0e0 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  lue);...}..}...i
1f0f0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
1f100 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1f110 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66  rch_query) {...f
1f120 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
1f130 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1f140 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a  arch_query);..}.
1f150 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f160 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1f170 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f180 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1f190 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1f1a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f1b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1f1c0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1f1d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f1e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1f1f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1f200 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1f210 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1f220 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1f230 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1f240 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1f250 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
1f260 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
1f270 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1f280 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
1f290 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
1f2a0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
1f2b0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
1f2c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f2d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1f2e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1f2f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1f300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f310 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1f320 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1f330 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1f340 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1f350 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1f360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f370 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1f380 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f390 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1f3a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f3b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1f3c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1f3d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1f3e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1f3f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
1f400 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ncrypt)(CK_SESSI
1f410 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1f420 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1f430 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
1f440 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
1f450 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
1f460 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dData, CK_ULONG_
1f470 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
1f480 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
1f490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f4a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1f4b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1f4c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1f4d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f4e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1f4f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1f500 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1f510 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1f520 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1f530 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1f540 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1f550 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f560 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1f570 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f580 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1f590 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1f5a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1f5b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1f5c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
1f5d0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
1f5e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1f5f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1f600 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
1f610 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
1f620 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
1f630 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
1f640 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
1f650 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
1f660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f670 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f680 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f690 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f6a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f6b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f6c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f6d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f6e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f6f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f710 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f720 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f730 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f740 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f750 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f760 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f770 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f780 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f790 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f7a0 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _EncryptFinal)(C
1f7b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1f7c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1f7d0 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72  TE_PTR pLastEncr
1f7e0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
1f7f0 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45  ONG_PTR pulLastE
1f800 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
1f810 20 7b 0a 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 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f830 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1f840 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f850 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f860 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f870 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f880 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f890 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f8a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f8b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f8c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1f8d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1f8e0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1f8f0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1f900 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1f910 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1f920 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f930 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1f940 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1f950 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74  V, C_DecryptInit
1f960 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1f970 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1f980 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
1f990 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
1f9a0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
1f9b0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
1f9c0 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b  etval;...hKey--;
1f9d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f9e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f9f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1fa00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1fa10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fa20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1fa30 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1fa40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fa50 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1fa60 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1fa70 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20  .if (pMechanism 
1fa80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1fa90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1faa0 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
1fab0 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ism is NULL.");.
1fac0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1fad0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1fae0 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
1faf0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
1fb00 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a  CKM_RSA_PKCS) {.
1fb10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fb20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
1fb30 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
1fb40 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65  ism not specifie
1fb50 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  d as CKM_RSA_PKC
1fb60 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
1fb70 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
1fb80 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
1fb90 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1fba0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1fbb0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1fbc0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1fbd0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1fbe0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1fbf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fc00 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1fc10 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1fc20 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1fc30 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1fc40 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1fc50 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1fc60 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1fc70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1fc80 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1fc90 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1fca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fcb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1fcc0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1fcd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1fce0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1fcf0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1fd00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1fd10 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
1fd20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1fd30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1fd40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1fd50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fd60 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
1fd70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1fd80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1fd90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1fda0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
1fdb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1fdc0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
1fdd0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1fde0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1fdf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1fe00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fe10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fe20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20  Decrypt already 
1fe30 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
1fe40 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1fe50 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
1fe60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
1fe70 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
1fe80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1fe90 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
1fea0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1feb0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1fec0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1fed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fee0 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
1fef0 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
1ff00 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
1ff10 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
1ff20 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
1ff30 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
1ff40 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
1ff50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
1ff60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1ff70 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1ff80 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
1ff90 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
1ffa0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ffb0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1ffc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
1ffd0 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ypt_active = 1;.
1ffe0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1fff0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
20000 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ypt_mechanism = 
20010 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
20020 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73  anism;..cackey_s
20030 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20040 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
20050 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  arm = pMechanism
20060 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63  ->pParameter;..c
20070 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20080 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
20090 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20  _mech_parmlen = 
200a0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61  pMechanism->ulPa
200b0 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63  rameterLen;..cac
200c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
200d0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
200e0 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
200f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20100 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
20110 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
20120 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20130 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
20140 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
20150 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
20160 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20180 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
20190 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
201a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
201b0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
201c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
201d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
201e0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
201f0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
20200 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
20210 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20220 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b  V, C_Decrypt)(CK
20230 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
20240 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
20250 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
20260 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
20270 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
20280 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
20290 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
202a0 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
202b0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c  ..CK_ULONG datal
202c0 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c  en_update, datal
202d0 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56  en_final;..CK_RV
202e0 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09   decrypt_ret;...
202f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20300 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20310 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20320 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20330 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20340 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20350 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20360 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20370 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
20380 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
20390 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20   (pulDataLen == 
203a0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
203b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
203c0 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e  rror. pulDataLen
203d0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
203e0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
203f0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
20400 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d  datalen_update =
20410 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09   *pulDataLen;...
20420 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
20430 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53  DecryptUpdate(hS
20440 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74  ession, pEncrypt
20450 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70  edData, ulEncryp
20460 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74  tedDataLen, pDat
20470 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61  a, &datalen_upda
20480 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  te);..if (decryp
20490 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
204a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
204b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
204c0 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28    DecryptUpdate(
204d0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
204e0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
204f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
20500 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
20510 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
20520 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
20530 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61  pData) {...pData
20540 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61   += datalen_upda
20550 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f  te;..}..datalen_
20560 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61  final = *pulData
20570 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70  Len - datalen_up
20580 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f  date;...decrypt_
20590 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46  ret = C_DecryptF
205a0 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
205b0 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66  Data, &datalen_f
205c0 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72  inal);..if (decr
205d0 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
205e0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
205f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20600 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c  r.  DecryptFinal
20610 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
20620 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
20630 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
20640 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
20650 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
20660 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75  t_ret);..}...*pu
20670 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c  lDataLen = datal
20680 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61  en_update + data
20690 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43  len_final;...CAC
206a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
206b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
206c0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
206d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
206e0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
206f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
20700 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  , C_DecryptUpdat
20710 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
20720 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
20730 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
20740 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
20750 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
20760 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
20770 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
20780 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
20790 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
207a0 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d  _BYTE buf[16384]
207b0 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65  ;..ssize_t bufle
207c0 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  n;..CK_SLOT_ID s
207d0 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65  lotID;..CK_RV re
207e0 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
207f0 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d  AL_ERROR;..int m
20800 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
20810 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20820 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
20830 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
20840 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
20850 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20860 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20870 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20880 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20890 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
208a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
208b0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
208c0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
208d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
208e0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
208f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20900 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
20910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20920 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
20930 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
20940 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
20950 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
20960 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
20970 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
20980 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e   == NULL && ulEn
20990 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
209a0 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
209b0 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
209c0 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63  are asked to dec
209d0 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20  rypt nothing... 
209e0 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
209f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20a00 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
20a10 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
20a20 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
20a30 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
20a40 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65  ...if (pEncrypte
20a50 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dPart == NULL) {
20a60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20a70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
20a80 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73  EncryptedPart is
20a90 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63   NULL, but ulEnc
20aa0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
20ab0 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
20ac0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
20ad0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
20ae0 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   (ulEncryptedPar
20af0 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
20b00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20b10 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63  TF("Error. ulEnc
20b20 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
20b30 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
20b40 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
20b50 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
20b60 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
20b70 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20  .if (pulPartLen 
20b80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
20b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20ba0 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74  ("Error. pulPart
20bb0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
20bc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
20bd0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
20be0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
20bf0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
20c00 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20c10 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
20c20 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
20c30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20c40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
20c50 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
20c60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
20c70 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
20c80 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
20c90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20ca0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
20cb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20cc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20cd0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
20ce0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20cf0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
20d00 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
20d10 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
20d20 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
20d30 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
20d40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20d50 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
20d60 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
20d70 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20d80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20d90 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20da0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20db0 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
20dc0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
20dd0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
20de0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
20df0 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
20e00 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
20e10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
20e20 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
20e30 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
20e40 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
20e50 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
20e60 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
20e70 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
20e80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20e90 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
20ea0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
20eb0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
20ec0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
20ed0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
20ee0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
20ef0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
20f00 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
20f10 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
20f20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20f30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
20f40 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
20f50 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
20f60 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
20f70 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
20f80 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20f90 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20fa0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
20fb0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20fc0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
20fd0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
20fe0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
20ff0 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20  rypt_mechanism) 
21000 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
21010 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
21020 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74   card to decrypt
21030 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20   */....buflen = 
21040 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
21050 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
21060 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
21070 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21080 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
21090 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
210a0 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
210b0 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
210c0 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31  izeof(buf), 0, 1
210d0 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  );.....if (bufle
210e0 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
210f0 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65  Decryption faile
21100 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75  d. */.....if (bu
21110 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
21120 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
21130 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
21140 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
21150 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
21160 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d  lse if (buflen =
21170 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
21180 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
21190 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
211a0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
211b0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
211c0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
211d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
211e0 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
211f0 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
21200 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70  ng) buflen) > *p
21210 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61  ulPartLen && pPa
21220 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63  rt) {...../* Dec
21230 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20  rypted data too 
21240 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74  large */.....ret
21250 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
21260 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
21270 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
21280 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65  pPart) {......me
21290 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c  mcpy(pPart, buf,
212a0 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a   buflen);.....}.
212b0 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e  .....*pulPartLen
212c0 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09   = buflen;......
212d0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
212e0 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
212f0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
21300 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21310 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21320 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
21330 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
21340 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21350 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21360 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
21370 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21380 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21390 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
213a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
213b0 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
213c0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
213d0 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
213e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
213f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
21400 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ecryptFinal)(CK_
21410 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
21420 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
21430 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20  _PTR pLastPart, 
21440 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
21450 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09  LastPartLen) {..
21460 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
21470 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65  ;..int terminate
21480 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09  _decrypt = 1;...
21490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
214a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
214b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
214c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
214d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
214e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
214f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21500 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21510 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21520 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
21530 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
21540 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
21550 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
21560 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
21570 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21580 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
215a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
215b0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
215c0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
215d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
215e0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
215f0 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  f (pulLastPartLe
21600 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
21610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21620 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61  TF("Error. pulLa
21630 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c  stPartLen is NUL
21640 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
21650 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
21660 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
21670 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21680 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
21690 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
216a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
216b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
216c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
216d0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
216e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
216f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21700 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
21710 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21720 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
21730 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
21740 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21750 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
21760 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21770 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
21780 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
21790 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
217a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
217b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
217c0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
217d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
217e0 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
217f0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
21800 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21810 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
21820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21830 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e  rror.  Decrypt n
21840 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
21850 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
21860 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
21870 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a  IALIZED);..}...*
21880 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
21890 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50   0;...if (pLastP
218a0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
218b0 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  .terminate_decry
218c0 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  pt = 0;..}...if 
218d0 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  (terminate_decry
218e0 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  pt) {...cackey_s
218f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21900 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
21910 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
21920 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
21930 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
21940 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
21950 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
21960 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
21970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21980 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
21990 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
219a0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
219b0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
219c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
219d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
219e0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
219f0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
21a00 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
21a10 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
21a20 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69  _RV, C_DigestIni
21a30 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
21a40 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
21a50 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
21a60 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43  pMechanism) {..C
21a70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21a80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
21a90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
21aa0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
21ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ac0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
21ad0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
21ae0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
21af0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
21b00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
21b10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21b20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
21b30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21b40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
21b50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
21b60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
21b70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
21b80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
21b90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
21ba0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
21bb0 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49  Digest)(CK_SESSI
21bc0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
21bd0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
21be0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
21bf0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
21c00 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
21c10 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
21c20 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
21c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21c40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21c50 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21c60 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21c70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21c80 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21c90 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21ca0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21cb0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21cc0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
21cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21ce0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
21cf0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21d00 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
21d10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21d20 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21d30 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21d40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21d50 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21d60 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
21d70 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
21d80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
21d90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
21da0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
21db0 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
21dc0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
21dd0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21de0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21df0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21e00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21e10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21e20 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21e30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21e40 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21e50 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21e60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21e70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21e80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21e90 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
21ea0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
21eb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
21ec0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
21ed0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21ee0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
21ef0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21f00 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43  , C_DigestKey)(C
21f10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
21f20 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
21f30 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
21f40 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
21f50 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
21f60 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
21f70 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
21f80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21f90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21fa0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
21fb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21fc0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
21fd0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
21fe0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21ff0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22000 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
22010 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
22020 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22030 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22040 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22050 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22060 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22070 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22080 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61  RV, C_DigestFina
22090 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
220a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
220b0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
220c0 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
220d0 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
220e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
220f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22100 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22110 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22120 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22130 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22140 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22150 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22160 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22170 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22190 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
221a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
221b0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
221c0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
221d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
221e0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
221f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22200 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22210 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22220 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f   C_SignInit)(CK_
22230 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22240 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
22250 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
22260 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
22270 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
22280 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22290 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
222a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
222b0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
222c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
222d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
222e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
222f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22300 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22310 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22320 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22330 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
22340 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
22350 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
22360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22370 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
22380 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
22390 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
223a0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
223b0 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
223c0 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
223d0 53 41 5f 50 4b 43 53 20 26 26 20 70 4d 65 63 68  SA_PKCS && pMech
223e0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
223f0 20 21 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41   != CKM_SHA1_RSA
22400 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
22410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22420 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
22430 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
22440 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
22450 4d 5f 52 53 41 5f 50 4b 43 53 20 6f 72 20 43 4b  M_RSA_PKCS or CK
22460 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 22  M_SHA1_RSA_PKCS"
22470 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22480 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
22490 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
224a0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
224b0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
224c0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
224d0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
224e0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
224f0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
22500 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22510 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
22520 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
22530 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
22540 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
22550 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
22560 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
22570 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
22580 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22590 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
225a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
225b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
225c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
225d0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
225e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
225f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
22600 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
22610 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22620 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
22630 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22640 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22650 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
22660 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22670 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
22680 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
22690 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
226a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
226b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
226c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
226d0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
226e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
226f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22700 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
22710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22720 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
22730 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
22740 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
22750 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
22760 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
22770 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
22780 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22790 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
227a0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
227b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
227c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
227d0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
227e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
227f0 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
22800 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73  of range (reques
22810 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c  ted key %lu, onl
22820 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73  y %lu identities
22830 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28   available).", (
22840 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
22850 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
22860 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73  ong) cackey_sess
22870 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
22880 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
22890 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
228a0 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  KEY_HANDLE_INVAL
228b0 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
228c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
228d0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  on].sign_active 
228e0 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  = 1;...cackey_se
228f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22900 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20  .sign_mechanism 
22910 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  = pMechanism->me
22920 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65  chanism;...cacke
22930 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22940 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
22950 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f   = 128;..cackey_
22960 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22970 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
22980 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 0;..cackey_ses
22990 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
229a0 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f  sign_buf = mallo
229b0 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  c(sizeof(*cackey
229c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
229d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20  on].sign_buf) * 
229e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
229f0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
22a00 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59  uflen);...CACKEY
22a10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
22a20 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f  ession %lu sign_
22a30 69 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28  identity is %p (
22a40 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c  identity #%lu)",
22a50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
22a60 20 68 53 65 73 73 69 6f 6e 2c 20 26 63 61 63 6b   hSession, &cack
22a70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22a80 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
22a90 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65  [hKey], (unsigne
22aa0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09  d long) hKey);..
22ab0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22ac0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
22ad0 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
22ae0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22af0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
22b00 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
22b10 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
22b20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22b30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
22b40 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
22b50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
22b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22b70 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
22b80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22b90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22ba0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
22bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22bc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22bd0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
22be0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
22bf0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
22c00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22c10 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45  V, C_Sign)(CK_SE
22c20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
22c30 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
22c40 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
22c50 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
22c60 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
22c70 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
22c80 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
22c90 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
22ca0 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f  long start_sign_
22cb0 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20  bufused;..CK_RV 
22cc0 73 69 67 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  sign_ret;...CACK
22cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22ce0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22cf0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22d00 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22d10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22d20 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22d30 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22d40 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22d50 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22d60 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
22d70 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
22d80 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
22d90 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
22da0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
22db0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
22dc0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
22dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22de0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
22df0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
22e00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
22e10 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
22e20 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72 74  LID);..}...start
22e30 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  _sign_bufused = 
22e40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22e50 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
22e60 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f 72  ufused;...sign_r
22e70 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74  et = C_SignUpdat
22e80 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74  e(hSession, pDat
22e90 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09  a, ulDataLen);..
22ea0 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20  if (sign_ret != 
22eb0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
22ec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22ed0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70 64  "Error.  SignUpd
22ee0 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66  ate() returned f
22ef0 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
22f00 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
22f10 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
22f20 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
22f30 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72  et);..}...sign_r
22f40 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  et = C_SignFinal
22f50 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e  (hSession, pSign
22f60 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74  ature, pulSignat
22f70 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ureLen);..if (si
22f80 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
22f90 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  ) {...if (sign_r
22fa0 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  et == CKR_BUFFER
22fb0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
22fc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22fd0 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28  INTF("SignFinal(
22fe0 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42  ) returned CKR_B
22ff0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
23000 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f  (rv = %lu), undo
23010 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
23020 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ()", (unsigned l
23030 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
23040 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
23050 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
23060 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
23070 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
23080 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e  .....return(sign
23090 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  _ret);...}....CA
230a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
230b0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46  F("Error.  SignF
230c0 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
230d0 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
230e0 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
230f0 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
23100 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
23110 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
23120 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c  Signature == NUL
23130 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
23140 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67  BUG_PRINTF("pSig
23150 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64  nature specified
23160 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e   as NULL, undoin
23170 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
23180 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
23190 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
231a0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
231b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
231c0 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f  bufused = start_
231d0 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
231e0 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
231f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
23200 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23210 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
23220 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
23230 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
23240 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
23250 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
23260 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ignUpdate)(CK_SE
23270 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
23280 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
23290 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
232a0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
232b0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
232c0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
232d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
232e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
232f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23300 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23310 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23320 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23330 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23340 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23350 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23360 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
23370 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
23380 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
23390 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
233a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
233b0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
233c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
233d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
233e0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
233f0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
23400 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
23410 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
23420 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d  }...if (pPart ==
23430 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c   NULL && ulPartL
23440 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  en == 0) {.../* 
23450 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66  Short circuit if
23460 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f   we are asked to
23470 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e   sign nothing...
23480 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
23490 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
234a0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
234b0 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
234c0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
234d0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
234e0 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d  }...if (pPart ==
234f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
23500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23510 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20  Error. pPart is 
23520 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74  NULL, but ulPart
23530 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b  Len is not 0.");
23540 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
23550 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
23560 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65  }...if (ulPartLe
23570 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  n == 0) {...CACK
23580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23590 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65  "Error. ulPartLe
235a0 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72  n is 0, but pPar
235b0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  t is not NULL.")
235c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
235d0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
235e0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
235f0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
23600 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
23610 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
23620 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
23630 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23640 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23650 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
23660 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23670 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
23680 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
23690 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
236a0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
236b0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
236c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
236d0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
236e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
236f0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
23700 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
23710 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
23720 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
23730 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
23740 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23750 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
23760 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
23770 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23780 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23790 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
237a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
237b0 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  Sign not active.
237c0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
237d0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
237e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
237f0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
23800 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23810 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
23820 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20  anism) {...case 
23830 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
23840 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64  ./* Accumulate d
23850 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66  irectly */....if
23860 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   ((cackey_sessio
23870 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
23880 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61  n_bufused + ulPa
23890 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f  rtLen) > cackey_
238a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
238b0 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20  n].sign_buflen) 
238c0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  {.....cackey_ses
238d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
238e0 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32  sign_buflen *= 2
238f0 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  ;......cackey_se
23900 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23910 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c  .sign_buf = real
23920 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69  loc(cackey_sessi
23930 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
23940 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a  gn_buf, sizeof(*
23950 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23960 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
23970 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73  uf) * cackey_ses
23980 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23990 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09  sign_buflen);...
239a0 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61  .}.....memcpy(ca
239b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
239c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
239d0 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   + cackey_sessio
239e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
239f0 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72 74  n_bufused, pPart
23a00 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09  , ulPartLen);...
23a10 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
23a20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
23a30 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61  _bufused += ulPa
23a40 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b  rtLen;.....break
23a50 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41  ;...case CKM_SHA
23a60 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  1_RSA_PKCS:..../
23a70 2a 20 58 58 58 3a 20 41 63 63 75 6d 75 6c 61 74  * XXX: Accumulat
23a80 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61  e into a SHA1 ha
23a90 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  sh */....cackey_
23aa0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23ab0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
23ac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23ad0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
23ae0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23af0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
23b00 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
23b10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
23b20 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ....return(CKR_F
23b30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23b40 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b  ORTED);....break
23b50 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
23b60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
23b70 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23b80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
23b90 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23ba0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23bb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23bc0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
23bd0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23be0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23bf0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
23c00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23c10 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
23c20 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
23c30 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
23c40 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
23c50 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23c60 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b   C_SignFinal)(CK
23c70 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
23c80 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
23c90 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
23ca0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
23cb0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
23cc0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
23cd0 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a  E sigbuf[1024];.
23ce0 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c  .ssize_t sigbufl
23cf0 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  en;..CK_SLOT_ID 
23d00 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72  slotID;..CK_RV r
23d10 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
23d20 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20  RAL_ERROR;..int 
23d30 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
23d40 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72   1;..int mutex_r
23d50 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
23d60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23d70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23d80 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23d90 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23da0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23db0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23dc0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23dd0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23de0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23df0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69  ;..}...if (pulSi
23e00 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55  gnatureLen == NU
23e10 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
23e20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23e30 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65  or. pulSignature
23e40 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
23e50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
23e60 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
23e70 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
23e80 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
23e90 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
23ea0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
23eb0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
23ec0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
23ed0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23ee0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
23ef0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
23f00 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
23f10 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
23f20 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
23f30 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
23f40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
23f50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23f60 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
23f70 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
23f80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23f90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
23fa0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
23fb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23fc0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23fd0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
23fe0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23ff0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
24000 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24010 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24020 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
24030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24040 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
24050 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
24060 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
24070 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
24080 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
24090 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
240a0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
240b0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
240c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
240d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
240e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
240f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24100 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ign not active."
24110 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24120 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
24130 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
24140 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
24150 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24160 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
24170 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
24180 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
24190 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
241a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
241b0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
241c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
241d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
241e0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
241f0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
24200 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
24210 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
24220 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24230 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
24240 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
24250 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
24260 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 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 49 6e 76 61 6c 69 64 20  "Error. Invalid 
24290 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
242a0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
242b0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
242c0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
242d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
242e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
242f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24300 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24310 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
24320 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24330 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
24340 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
24350 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
24360 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f  ../* Ask card to
24370 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b   sign */....CACK
24380 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24390 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20  "Asking to sign 
243a0 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70  from identity %p
243b0 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22   in session %lu"
243c0 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
243d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
243e0 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69  _identity, (unsi
243f0 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
24400 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c  ion);....sigbufl
24410 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e  en = cackey_sign
24420 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f  decrypt(&cackey_
24430 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63  slots[slotID], c
24440 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24450 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
24460 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73  entity, cackey_s
24470 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24480 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b  ].sign_buf, cack
24490 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
244a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
244b0 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65  ed, sigbuf, size
244c0 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30  of(sigbuf), 1, 0
244d0 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75  );.....if (sigbu
244e0 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09  flen < 0) {.....
244f0 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65  /* Signing faile
24500 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69  d. */.....if (si
24510 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  gbuflen == CACKE
24520 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
24530 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  IN) {......retva
24540 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54  l = CKR_USER_NOT
24550 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09  _LOGGED_IN;.....
24560 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75  } else if (sigbu
24570 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
24580 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
24590 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  T) {......retval
245a0 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45   = CKR_DEVICE_RE
245b0 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73  MOVED;.....} els
245c0 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  e {......retval 
245d0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
245e0 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  ROR;.....}....} 
245f0 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67  else if (((unsig
24600 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66  ned long) sigbuf
24610 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61  len) > *pulSigna
24620 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e  tureLen && pSign
24630 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20  ature) {...../* 
24640 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20  Signed data too 
24650 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43  large */.....CAC
24660 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24670 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ("retval = CKR_B
24680 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
24690 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c    sigbuflen = %l
246a0 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  u, pulSignatureL
246b0 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69  en = %lu", (unsi
246c0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
246d0 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20  flen, (unsigned 
246e0 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74  long) *pulSignat
246f0 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65  ureLen);......re
24700 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
24710 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09  R_TOO_SMALL;....
24720 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
24730 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20   = 0;....} else 
24740 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f  {.....terminate_
24750 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69  sign = 0;......i
24760 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b  f (pSignature) {
24770 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69  ......memcpy(pSi
24780 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c  gnature, sigbuf,
24790 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09   sigbuflen);....
247a0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
247b0 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09  n = 1;.....}....
247c0 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  ..*pulSignatureL
247d0 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a  en = sigbuflen;.
247e0 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
247f0 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  R_OK;....}.....b
24800 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d  reak;...case CKM
24810 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a  _SHA1_RSA_PKCS:.
24820 09 09 09 2f 2a 20 58 58 58 3a 20 41 63 63 75 6d  .../* XXX: Accum
24830 75 6c 61 74 65 20 69 6e 74 6f 20 61 20 53 48 41  ulate into a SHA
24840 31 20 68 61 73 68 20 2a 2f 0a 09 09 09 63 61 63  1 hash */....cac
24850 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24860 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24870 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
24880 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24890 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
248a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
248b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
248c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
248d0 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  D);.....return(C
248e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
248f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 09 09 62  SUPPORTED);....b
24900 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74  reak;..}...if (t
24910 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b  erminate_sign) {
24920 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
24930 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24940 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09  .sign_buf) {....
24950 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
24960 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24970 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09  ign_buf);...}...
24980 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24990 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
249a0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
249b0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
249c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
249d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
249e0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
249f0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
24a00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24a10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
24a20 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
24a30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24a40 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24a50 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24a60 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24a70 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
24a80 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
24a90 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
24aa0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
24ab0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65  (CK_RV, C_SignRe
24ac0 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45  coverInit)(CK_SE
24ad0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24ae0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
24af0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
24b00 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
24b10 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
24b20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24b30 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24b40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24b50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24b60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24b70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
24b80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24b90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24ba0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24bb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
24bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24bd0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
24be0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24bf0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
24c00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24c10 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
24c20 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
24c30 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
24c40 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
24c50 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
24c60 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ignRecover)(CK_S
24c70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24c80 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
24c90 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
24ca0 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
24cb0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
24cc0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
24cd0 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
24ce0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
24cf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
24d00 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
24d10 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
24d20 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
24d30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24d40 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24d50 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24d60 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24d70 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24d80 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24d90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24da0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
24db0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
24dc0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
24dd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24de0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
24df0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24e00 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
24e10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
24e20 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49  CK_RV, C_VerifyI
24e30 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
24e40 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24e50 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
24e60 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
24e70 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
24e80 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
24e90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
24ea0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
24eb0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
24ec0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
24ed0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24ee0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24ef0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24f00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24f10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24f20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24f30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24f40 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
24f50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
24f60 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
24f70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24f80 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
24f90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24fa0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
24fb0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
24fc0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29  CK_RV, C_Verify)
24fd0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
24fe0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
24ff0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
25000 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
25010 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
25020 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
25030 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
25040 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
25050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25060 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
25070 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25080 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
25090 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
250a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
250b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
250c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
250d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
250e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
250f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25100 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
25110 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
25120 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
25130 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25140 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
25150 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25160 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
25170 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25180 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55  CK_RV, C_VerifyU
25190 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
251a0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
251b0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
251c0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
251d0 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
251e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
251f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25200 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25210 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25230 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25240 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25250 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25260 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25270 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
25280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25290 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
252a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
252b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
252c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
252d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
252e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
252f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
25300 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25310 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
25320 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45  rifyFinal)(CK_SE
25330 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25340 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
25350 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
25360 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74  K_ULONG ulSignat
25370 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ureLen) {..CACKE
25380 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25390 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
253a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
253b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
253c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
253d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
253e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
253f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
25400 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
25410 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
25420 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
25430 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
25440 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25450 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
25460 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
25470 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
25480 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25490 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
254a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
254b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
254c0 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43  fyRecoverInit)(C
254d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
254e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
254f0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
25500 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
25510 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
25520 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25530 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25540 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25550 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25570 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25580 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25590 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
255a0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
255b0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
255c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
255d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
255e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
255f0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
25600 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25610 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
25620 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
25630 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25640 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
25650 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25660 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
25670 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
25680 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
25690 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
256a0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
256b0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43  lSignatureLen, C
256c0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
256d0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
256e0 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41  ulDataLen) {..CA
256f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25700 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25710 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
25720 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
25730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25740 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
25750 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
25760 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
25770 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
25780 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
25790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
257a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
257b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
257c0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
257d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
257e0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
257f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
25800 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25810 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25820 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
25830 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
25840 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
25850 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
25860 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
25870 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
25880 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
25890 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
258a0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
258b0 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
258c0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
258d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
258e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
258f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25900 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
25910 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25920 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
25930 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
25940 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
25950 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25960 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
25970 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25980 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
25990 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
259a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
259b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
259c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
259d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
259e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
259f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25a00 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
25a10 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
25a20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
25a30 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
25a40 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
25a50 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
25a60 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
25a70 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
25a80 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
25a90 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
25aa0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25ab0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25ac0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25ad0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25ae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25af0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25b00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25b10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25b20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25b30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25b40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25b50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
25b60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25b70 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
25b80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25b90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
25ba0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
25bb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25bc0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
25bd0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25be0 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70   C_SignEncryptUp
25bf0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
25c00 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
25c10 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
25c20 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
25c30 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
25c40 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
25c50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
25c60 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
25c70 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
25c80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
25c90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
25ca0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
25cb0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
25cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25cd0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
25ce0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
25cf0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
25d00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
25d10 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
25d20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
25d30 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
25d40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25d50 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
25d60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25d70 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
25d80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25d90 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
25da0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25db0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
25dc0 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28  ptVerifyUpdate)(
25dd0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
25de0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
25df0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
25e00 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
25e10 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
25e20 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
25e30 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
25e40 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
25e50 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
25e60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
25e70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
25e80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
25e90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25ea0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25eb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
25ec0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25ed0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
25ee0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
25ef0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25f00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25f10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25f20 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
25f30 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
25f40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25f50 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
25f60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25f70 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
25f80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
25f90 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  V, C_GenerateKey
25fa0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
25fb0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
25fc0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
25fd0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
25fe0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
25ff0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
26000 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
26010 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
26020 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
26030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26040 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
26050 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
26060 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
26070 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26080 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
26090 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
260a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
260b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
260c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
260d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
260e0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
260f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
26100 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
26110 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26120 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
26130 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26140 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
26150 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
26160 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
26170 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53  eKeyPair)(CK_SES
26180 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26190 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
261a0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
261b0 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
261c0 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65  PTR pPublicKeyTe
261d0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
261e0 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72   ulPublicKeyAttr
261f0 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41  ibuteCount, CK_A
26200 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72  TTRIBUTE_PTR pPr
26210 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65  ivateKeyTemplate
26220 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69  , CK_ULONG ulPri
26230 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65  vateKeyAttribute
26240 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
26250 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75  _HANDLE_PTR phPu
26260 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  blicKey, CK_OBJE
26270 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
26280 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43  PrivateKey) {..C
26290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
262a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
262b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
262c0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
262d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
262e0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
262f0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26300 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
26310 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
26320 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
26330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26340 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26350 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26360 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26370 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26380 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26390 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
263a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
263b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
263c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
263d0 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  WrapKey)(CK_SESS
263e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
263f0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
26400 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
26410 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
26420 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c  LE hWrappingKey,
26430 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
26440 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  E hKey, CK_BYTE_
26450 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
26460 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
26470 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20  lWrappedKeyLen) 
26480 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
26490 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
264a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
264b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
264c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
264d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
264e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
264f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26500 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
26510 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
26520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26530 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
26540 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26550 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
26560 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
26570 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
26580 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
26590 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
265a0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
265b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
265c0 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43  , C_UnwrapKey)(C
265d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
265e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
265f0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
26600 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
26610 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70  T_HANDLE hUnwrap
26620 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45  pingKey, CK_BYTE
26630 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
26640 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61  , CK_ULONG ulWra
26650 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41  ppedKeyLen, CK_A
26660 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
26670 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
26680 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
26690 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
266a0 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
266b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
266c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
266d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
266e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
266f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26700 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26710 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26720 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26730 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26740 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26760 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26770 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26780 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
26790 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
267a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
267b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
267c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
267d0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
267e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
267f0 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b   C_DeriveKey)(CK
26800 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
26810 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
26820 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
26830 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
26840 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79  _HANDLE hBaseKey
26850 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
26860 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
26870 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75  _ULONG ulAttribu
26880 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
26890 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
268a0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
268b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
268c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
268d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
268e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
268f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26900 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
26910 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
26920 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
26930 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
26940 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26950 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26960 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
26970 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
26980 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
26990 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
269a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
269b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
269c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
269d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
269e0 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e  CK_RV, C_SeedRan
269f0 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  dom)(CK_SESSION_
26a00 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26a10 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65   CK_BYTE_PTR pSe
26a20 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  ed, CK_ULONG ulS
26a30 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  eedLen) {..CACKE
26a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26a50 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26a60 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26a70 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26a90 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26aa0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
26ab0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
26ac0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26ad0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
26ae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26af0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
26b00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26b10 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
26b20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26b30 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
26b40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26b50 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
26b60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26b70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
26b80 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53  rateRandom)(CK_S
26b90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26ba0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
26bb0 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c  PTR pRandomData,
26bc0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64   CK_ULONG ulRand
26bd0 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  omLen) {..CACKEY
26be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
26bf0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
26c00 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
26c10 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
26c20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26c30 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26c40 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26c50 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26c60 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26c70 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
26c80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26c90 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
26ca0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26cb0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
26cc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26cd0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
26ce0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26cf0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f  SUPPORTED);.}../
26d00 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e  * Deprecated Fun
26d10 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49  ction */.CK_DEFI
26d20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
26d30 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  V, C_GetFunction
26d40 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49  Status)(CK_SESSI
26d50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
26d60 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
26d70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
26d80 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
26d90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26da0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
26db0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
26dc0 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
26dd0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
26de0 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
26df0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
26e00 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
26e10 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
26e20 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
26e30 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
26e40 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70  ing */.}../* Dep
26e50 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  recated Function
26e60 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
26e70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
26e80 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28  CancelFunction)(
26e90 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26ea0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
26eb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26ec0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26ed0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26ee0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
26ef0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26f00 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
26f10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26f20 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
26f30 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
26f40 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
26f50 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
26f60 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
26f70 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
26f80 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
26f90 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26fa0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
26fb0 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43  tFunctionList)(C
26fc0 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
26fd0 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69  PTR_PTR ppFuncti
26fe0 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55  onList) {..CK_FU
26ff0 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20  NCTION_LIST_PTR 
27000 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
27010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27020 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
27030 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f  ...if (ppFunctio
27040 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nList == NULL) {
27050 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27060 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
27070 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73  pFunctionList is
27080 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
27090 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
270a0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75  S_BAD);..}...pFu
270b0 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c  nctionList = mal
270c0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e  loc(sizeof(*pFun
270d0 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70  ctionList));...p
270e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
270f0 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28  rsion.major = ((
27100 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
27110 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
27120 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46   16) & 0xff;..pF
27130 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
27140 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43  sion.minor = ((C
27150 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
27160 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
27170 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75  8) & 0xff;...pFu
27180 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
27190 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69  itialize = C_Ini
271a0 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74  tialize;..pFunct
271b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c  ionList->C_Final
271c0 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65  ize = C_Finalize
271d0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
271e0 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f  ->C_GetInfo = C_
271f0 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  GetInfo;..pFunct
27200 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
27210 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c  otList = C_GetSl
27220 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69  otList;..pFuncti
27230 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
27240 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f  tInfo = C_GetSlo
27250 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  tInfo;..pFunctio
27260 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65  nList->C_GetToke
27270 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b  nInfo = C_GetTok
27280 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  enInfo;..pFuncti
27290 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f  onList->C_WaitFo
272a0 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57  rSlotEvent = C_W
272b0 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b  aitForSlotEvent;
272c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
272d0 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c  >C_GetMechanismL
272e0 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61  ist = C_GetMecha
272f0 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63  nismList;..pFunc
27300 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d  tionList->C_GetM
27310 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43  echanismInfo = C
27320 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
27330 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
27340 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d  t->C_InitToken =
27350 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70   C_InitToken;..p
27360 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
27370 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74  InitPIN = C_Init
27380 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  PIN;..pFunctionL
27390 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20  ist->C_SetPIN = 
273a0 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63  C_SetPIN;..pFunc
273b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e  tionList->C_Open
273c0 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e  Session = C_Open
273d0 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
273e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
273f0 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73  Session = C_Clos
27400 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  eSession;..pFunc
27410 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
27420 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43  eAllSessions = C
27430 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
27440 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
27450 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49  t->C_GetSessionI
27460 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69  nfo = C_GetSessi
27470 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  onInfo;..pFuncti
27480 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65  onList->C_GetOpe
27490 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f  rationState = C_
274a0 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
274b0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
274c0 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f  t->C_SetOperatio
274d0 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70  nState = C_SetOp
274e0 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70  erationState;..p
274f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
27500 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b  Login = C_Login;
27510 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27520 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f  >C_Logout = C_Lo
27530 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  gout;..pFunction
27540 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62  List->C_CreateOb
27550 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f  ject = C_CreateO
27560 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f  bject;..pFunctio
27570 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a  nList->C_CopyObj
27580 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65  ect = C_CopyObje
27590 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
275a0 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a  st->C_DestroyObj
275b0 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f  ect = C_DestroyO
275c0 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f  bject;..pFunctio
275d0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65  nList->C_GetObje
275e0 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62  ctSize = C_GetOb
275f0 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63  jectSize;..pFunc
27600 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41  tionList->C_GetA
27610 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20  ttributeValue = 
27620 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
27630 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  lue;..pFunctionL
27640 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62  ist->C_SetAttrib
27650 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74  uteValue = C_Set
27660 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a  AttributeValue;.
27670 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27680 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
27690 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  t = C_FindObject
276a0 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  sInit;..pFunctio
276b0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
276c0 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a  ects = C_FindObj
276d0 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ects;..pFunction
276e0 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
276f0 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e  ctsFinal = C_Fin
27700 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09  dObjectsFinal;..
27710 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27720 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43  _EncryptInit = C
27730 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70  _EncryptInit;..p
27740 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
27750 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72  Encrypt = C_Encr
27760 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ypt;..pFunctionL
27770 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70  ist->C_EncryptUp
27780 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74  date = C_Encrypt
27790 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
277a0 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
277b0 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79  tFinal = C_Encry
277c0 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  ptFinal;..pFunct
277d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
277e0 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79  ptInit = C_Decry
277f0 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  ptInit;..pFuncti
27800 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
27810 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09  t = C_Decrypt;..
27820 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27830 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d  _DecryptUpdate =
27840 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
27850 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27860 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  ->C_DecryptFinal
27870 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61   = C_DecryptFina
27880 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
27890 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20  t->C_DigestInit 
278a0 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a  = C_DigestInit;.
278b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
278c0 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67  C_Digest = C_Dig
278d0 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  est;..pFunctionL
278e0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64  ist->C_DigestUpd
278f0 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70  ate = C_DigestUp
27900 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
27910 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65  List->C_DigestKe
27920 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b  y = C_DigestKey;
27930 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27940 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d  >C_DigestFinal =
27950 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a   C_DigestFinal;.
27960 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27970 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53  C_SignInit = C_S
27980 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ignInit;..pFunct
27990 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20  ionList->C_Sign 
279a0 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63  = C_Sign;..pFunc
279b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
279c0 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55  Update = C_SignU
279d0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
279e0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e  nList->C_SignFin
279f0 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  al = C_SignFinal
27a00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27a10 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  ->C_SignRecoverI
27a20 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  nit = C_SignReco
27a30 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  verInit;..pFunct
27a40 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52  ionList->C_SignR
27a50 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52  ecover = C_SignR
27a60 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69  ecover;..pFuncti
27a70 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
27a80 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49  Init = C_VerifyI
27a90 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
27aa0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20  ist->C_Verify = 
27ab0 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63  C_Verify;..pFunc
27ac0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
27ad0 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72  fyUpdate = C_Ver
27ae0 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ifyUpdate;..pFun
27af0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
27b00 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72  ifyFinal = C_Ver
27b10 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ifyFinal;..pFunc
27b20 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
27b30 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20  fyRecoverInit = 
27b40 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
27b50 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
27b60 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63  ist->C_VerifyRec
27b70 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52  over = C_VerifyR
27b80 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69  ecover;..pFuncti
27b90 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
27ba0 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
27bb0 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55  C_DigestEncryptU
27bc0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
27bd0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
27be0 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43  DigestUpdate = C
27bf0 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
27c00 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
27c10 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72  List->C_SignEncr
27c20 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69  yptUpdate = C_Si
27c30 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  gnEncryptUpdate;
27c40 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27c50 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79  >C_DecryptVerify
27c60 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
27c70 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a  ptVerifyUpdate;.
27c80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27c90 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20  C_GenerateKey = 
27ca0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09  C_GenerateKey;..
27cb0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27cc0 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
27cd0 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79   = C_GenerateKey
27ce0 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Pair;..pFunction
27cf0 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20  List->C_WrapKey 
27d00 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46  = C_WrapKey;..pF
27d10 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55  unctionList->C_U
27d20 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77  nwrapKey = C_Unw
27d30 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  rapKey;..pFuncti
27d40 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65  onList->C_Derive
27d50 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65  Key = C_DeriveKe
27d60 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
27d70 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20  t->C_SeedRandom 
27d80 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a  = C_SeedRandom;.
27d90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27da0 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
27db0 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e   = C_GenerateRan
27dc0 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  dom;..pFunctionL
27dd0 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69  ist->C_GetFuncti
27de0 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74  onStatus = C_Get
27df0 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a  FunctionStatus;.
27e00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27e10 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
27e20 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74   = C_CancelFunct
27e30 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ion;..pFunctionL
27e40 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69  ist->C_GetFuncti
27e50 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75  onList = C_GetFu
27e60 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70  nctionList;...*p
27e70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
27e80 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
27e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27ea0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
27eb0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
27ec0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
27ed0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a              CKR_OK);.}..