Hex Artifact Content

Artifact ca30d967dadeb68241562b821228c493afcf53c5:


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 23 69 66 64 65 66 20 43 41 43 4b  x00..#ifdef CACK
1290: 45 59 5f 44 45 42 55 47 0a 0a 23 20 20 64 65 66  EY_DEBUG..#  def
12a0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
12b0: 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20  _PRINTF(x...) { 
12c0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
12d0: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66  "%s():%i: ", __f
12e0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
12f0: 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ; fprintf(stderr
1300: 2c 20 78 29 3b 20 66 70 72 69 6e 74 66 28 73 74  , x); fprintf(st
1310: 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c  derr, "\n"); ffl
1320: 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23  ush(stderr); }.#
1330: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
1340: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66  DEBUG_PRINTBUF(f
1350: 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67 6e  , x, y) { unsign
1360: 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46 3b  ed char *TMPBUF;
1370: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
1380: 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75 6e  dx; TMPBUF = (un
1390: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28  signed char *) (
13a0: 78 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65  x); fprintf(stde
13b0: 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 25 73  rr, "%s():%i: %s
13c0: 20 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32    (%s/%lu = {%02
13d0: 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f  x", __func__, __
13e0: 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28  LINE__, f, #x, (
13f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
1400: 79 29 2c 20 54 4d 50 42 55 46 5b 30 5d 29 3b 20  y), TMPBUF[0]); 
1410: 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64  for (idx = 1; id
1420: 78 20 3c 20 28 79 29 3b 20 69 64 78 2b 2b 29 20  x < (y); idx++) 
1430: 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  { fprintf(stderr
1440: 2c 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42  , ", %02x", TMPB
1450: 55 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72  UF[idx]); }; fpr
1460: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7d 29  intf(stderr, "})
1470: 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 73 74 64  \n"); fflush(std
1480: 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e  err); }.#  defin
1490: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
14a0: 45 52 52 4f 52 28 78 29 20 7b 20 66 70 72 69 6e  ERROR(x) { fprin
14b0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
14c0: 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f  :%i: ", __func__
14d0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 70 65 72  , __LINE__); per
14e0: 72 6f 72 28 78 29 3b 20 66 66 6c 75 73 68 28 73  ror(x); fflush(s
14f0: 74 64 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66  tderr); }.#  def
1500: 69 6e 65 20 66 72 65 65 28 78 29 20 7b 20 43 41  ine free(x) { CA
1510: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1520: 46 28 22 46 52 45 45 28 25 70 29 20 28 25 73 29  F("FREE(%p) (%s)
1530: 22 2c 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28  ", x, #x); free(
1540: 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 76 6f  x); }..static vo
1550: 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  id *CACKEY_DEBUG
1560: 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a  _FUNC_MALLOC(siz
1570: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
1580: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
1590: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
15a0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
15b0: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a  = malloc(size);.
15c0: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
15d0: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66  , "%s():%i: ", f
15e0: 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72  unc, line);..fpr
15f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4d 41  intf(stderr, "MA
1600: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
1610: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
1620: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 09  stderr, "\n");..
1630: 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 0a  fflush(stderr);.
1640: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
1650: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1660: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
1670: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64  UNC_REALLOC(void
1680: 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 73 69   *ptr, size_t si
1690: 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ze, const char *
16a0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
16b0: 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b  {..void *retval;
16c0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
16d0: 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a  loc(ptr, size);.
16e0: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
16f0: 70 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  ptr) {...fprintf
1700: 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25  (stderr, "%s():%
1710: 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65  i: ", func, line
1720: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64  );...fprintf(std
1730: 65 72 72 2c 20 22 52 45 41 4c 4c 4f 43 28 25 70  err, "REALLOC(%p
1740: 29 20 3d 20 25 70 22 2c 20 70 74 72 2c 20 72 65  ) = %p", ptr, re
1750: 74 76 61 6c 29 3b 0a 09 09 66 70 72 69 6e 74 66  tval);...fprintf
1760: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a  (stderr, "\n");.
1770: 09 09 66 66 6c 75 73 68 28 73 74 64 65 72 72 29  ..fflush(stderr)
1780: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
1790: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
17a0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
17b0: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28  BUG_FUNC_STRDUP(
17c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c  const char *ptr,
17d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e   const char *fun
17e0: 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09  c, int line) {..
17f0: 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  char *retval;...
1800: 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28  retval = strdup(
1810: 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ptr);...fprintf(
1820: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
1830: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
1840: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
1850: 72 2c 20 22 53 54 52 44 55 50 5f 4d 41 4c 4c 4f  r, "STRDUP_MALLO
1860: 43 28 29 20 3d 20 25 70 22 2c 20 72 65 74 76 61  C() = %p", retva
1870: 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64  l);..fprintf(std
1880: 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c  err, "\n");..ffl
1890: 75 73 68 28 73 74 64 65 72 72 29 3b 0a 0a 09 72  ush(stderr);...r
18a0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
18b0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
18c0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
18d0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
18e0: 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  R(unsigned char 
18f0: 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28  tag) {..switch (
1900: 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53  tag) {...case GS
1910: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a  CIS_TAG_CARDID:.
1920: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1930: 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09  _TAG_CARDID");..
1940: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1950: 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCC_VER:....retu
1960: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
1970: 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  C_VER");...case 
1980: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
1990: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
19a0: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22  CIS_TAG_CCG_VER"
19b0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
19c0: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09  TAG_CARDURL:....
19d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
19e0: 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63  G_CARDURL");...c
19f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
1a00: 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  CS15:....return(
1a10: 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31  "GSCIS_TAG_PKCS1
1a20: 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  5");...case GSCI
1a30: 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d  S_TAG_REG_DATA_M
1a40: 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ODEL:....return(
1a50: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44  "GSCIS_TAG_REG_D
1a60: 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63  ATA_MODEL");...c
1a70: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
1a80: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  R_TABLE:....retu
1a90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43  rn("GSCIS_TAG_AC
1aa0: 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  R_TABLE");...cas
1ab0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
1ac0: 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e  _APDU:....return
1ad0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
1ae0: 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20  _APDU");...case 
1af0: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
1b00: 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  CTION:....return
1b10: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  ("GSCIS_TAG_REDI
1b20: 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  RECTION");...cas
1b30: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a  e GSCIS_TAG_CT:.
1b40: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1b50: 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73  _TAG_CT");...cas
1b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a  e GSCIS_TAG_ST:.
1b70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1b80: 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73  _TAG_ST");...cas
1b90: 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  e GSCIS_TAG_NEXT
1ba0: 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  CCC:....return("
1bb0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
1bc0: 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  C");...case GSCI
1bd0: 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09  S_TAG_FNAME:....
1be0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1bf0: 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73  G_FNAME");...cas
1c00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d  e GSCIS_TAG_MNAM
1c10: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1c20: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b  CIS_TAG_MNAME");
1c30: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c40: 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_LNAME:....retu
1c50: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e  rn("GSCIS_TAG_LN
1c60: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
1c70: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a  CIS_TAG_SUFFIX:.
1c80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1c90: 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09  _TAG_SUFFIX");..
1ca0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1cb0: 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09  GOVT_AGENCY:....
1cc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1cd0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b  G_GOVT_AGENCY");
1ce0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1cf0: 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74  G_BUREAU:....ret
1d00: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
1d10: 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20  UREAU");...case 
1d20: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
1d30: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
1d40: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  ("GSCIS_TAG_BURE
1d50: 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  AU_CODE");...cas
1d60: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  e GSCIS_TAG_DEPT
1d70: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
1d80: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  ("GSCIS_TAG_DEPT
1d90: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
1da0: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a  GSCIS_TAG_TITLE:
1db0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1dc0: 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09  S_TAG_TITLE");..
1dd0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1de0: 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74  BUILDING:....ret
1df0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
1e00: 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73  UILDING");...cas
1e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1e20: 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74  CE_ADDR1:....ret
1e30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1e40: 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09  FFICE_ADDR1");..
1e50: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1e60: 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09  OFFICE_ADDR2:...
1e70: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
1e80: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22  AG_OFFICE_ADDR2"
1e90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1ea0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a  TAG_OFFICE_CITY:
1eb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1ec0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
1ed0: 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  Y");...case GSCI
1ee0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41  S_TAG_OFFICE_STA
1ef0: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
1f00: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1f10: 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  STATE");...case 
1f20: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
1f30: 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28  _ZIP:....return(
1f40: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1f50: 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20  E_ZIP");...case 
1f60: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
1f70: 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74  _COUNTRY:....ret
1f80: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1f90: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b  FFICE_COUNTRY");
1fa0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1fb0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a  G_OFFICE_PHONE:.
1fc0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1fd0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e  _TAG_OFFICE_PHON
1fe0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1ff0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2000: 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72  NE_EXT:....retur
2010: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2020: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b  ICE_PHONE_EXT");
2030: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2040: 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09  G_OFFICE_FAX:...
2050: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2060: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b  AG_OFFICE_FAX");
2070: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2080: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a  G_OFFICE_EMAIL:.
2090: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
20a0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49  _TAG_OFFICE_EMAI
20b0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  L");...case GSCI
20c0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
20d0: 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  M:....return("GS
20e0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
20f0: 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53  OOM");...case GS
2100: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2110: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e  GENCY:....return
2120: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47  ("GSCIS_TAG_NONG
2130: 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  OV_AGENCY");...c
2140: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53  ase GSCIS_TAG_SS
2150: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09  N_DESIGNATOR:...
2160: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2170: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
2180: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2190: 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65  S_TAG_SSN:....re
21a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
21b0: 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  SSN");...case GS
21c0: 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09  CIS_TAG_DOB:....
21d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
21e0: 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20  G_DOB");...case 
21f0: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52  GSCIS_TAG_GENDER
2200: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2210: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b  IS_TAG_GENDER");
2220: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2230: 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74  G_USERID:....ret
2240: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55  urn("GSCIS_TAG_U
2250: 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  SERID");...case 
2260: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
2270: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2280: 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b  IS_TAG_DOMAIN");
2290: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22a0: 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72  G_PASSWORD:....r
22b0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
22c0: 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63  _PASSWORD");...c
22d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
22e0: 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  SUERID:....retur
22f0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2300: 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  UERID");...case 
2310: 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a  GSCIS_TAG_SERNO:
2320: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2330: 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09  S_TAG_SERNO");..
2340: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2350: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72  ISSUE_DATE:....r
2360: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2370: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
2380: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2390: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
23a0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
23b0: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b  G_EXPIRE_DATE");
23c0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
23d0: 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09  G_CARD_TYPE:....
23e0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
23f0: 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09  G_CARD_TYPE");..
2400: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2410: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09  SECURITY_CODE:..
2420: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2430: 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44  TAG_SECURITY_COD
2440: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2450: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44  S_TAG_CARDID_AID
2460: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2470: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49  IS_TAG_CARDID_AI
2480: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2490: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
24a0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
24b0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
24c0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
24d0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53  CIS_TAG_CERT_ISS
24e0: 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  UE_DATE:....retu
24f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
2500: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  RT_ISSUE_DATE");
2510: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2520: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
2530: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
2540: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58  SCIS_TAG_CERT_EX
2550: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a  PIRE_DATE");..}.
2560: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
2570: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
2580: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
2590: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
25a0: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e  RDERR_TO_STR(LON
25b0: 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77  G retcode) {..sw
25c0: 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b  itch (retcode) {
25d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f  ...case SCARD_S_
25e0: 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75  SUCCESS:....retu
25f0: 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43  rn("SCARD_S_SUCC
2600: 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ESS");...case SC
2610: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a  ARD_E_CANCELLED:
2620: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2630: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  D_E_CANCELLED");
2640: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2650: 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09  CANT_DISPOSE:...
2660: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2670: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b  _CANT_DISPOSE");
2680: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2690: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46  INSUFFICIENT_BUF
26a0: 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FER:....return("
26b0: 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43  SCARD_E_INSUFFIC
26c0: 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09  IENT_BUFFER");..
26d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
26e0: 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65  VALID_ATR:....re
26f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
2700: 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63  VALID_ATR");...c
2710: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2720: 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72  LID_HANDLE:....r
2730: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
2740: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b  NVALID_HANDLE");
2750: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2760: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45  INVALID_PARAMETE
2770: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
2780: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
2790: 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73  RAMETER");...cas
27a0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
27b0: 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74  D_TARGET:....ret
27c0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
27d0: 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09  ALID_TARGET");..
27e0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
27f0: 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09  VALID_VALUE:....
2800: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2810: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b  INVALID_VALUE");
2820: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2830: 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65  NO_MEMORY:....re
2840: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
2850: 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73  _MEMORY");...cas
2860: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
2870: 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74  N_READER:....ret
2880: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
2890: 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09  NOWN_READER");..
28a0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49  .case SCARD_E_TI
28b0: 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e  MEOUT:....return
28c0: 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  ("SCARD_E_TIMEOU
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 53 48 41 52 49 4e 47 5f 56 49 4f 4c  D_E_SHARING_VIOL
28f0: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  ATION:....return
2900: 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  ("SCARD_E_SHARIN
2910: 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09  G_VIOLATION");..
2920: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
2930: 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72  _SMARTCARD:....r
2940: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
2950: 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09  O_SMARTCARD");..
2960: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e  .case SCARD_E_UN
2970: 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72  KNOWN_CARD:....r
2980: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
2990: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09  NKNOWN_CARD");..
29a0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52  .case SCARD_E_PR
29b0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09  OTO_MISMATCH:...
29c0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
29d0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22  _PROTO_MISMATCH"
29e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
29f0: 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09  E_NOT_READY:....
2a00: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2a10: 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63  NOT_READY");...c
2a20: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54  ase SCARD_E_SYST
2a30: 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09  EM_CANCELLED:...
2a40: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2a50: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45  _SYSTEM_CANCELLE
2a60: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2a70: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54  D_E_NOT_TRANSACT
2a80: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2a90: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53  CARD_E_NOT_TRANS
2aa0: 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20  ACTED");...case 
2ab0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
2ac0: 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72  NAVAILABLE:....r
2ad0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
2ae0: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c  EADER_UNAVAILABL
2af0: 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  E");...case SCAR
2b00: 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_W_UNSUPPORTED_
2b10: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2b20: 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f  "SCARD_W_UNSUPPO
2b30: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  RTED_CARD");...c
2b40: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45  ase SCARD_W_UNRE
2b50: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09  SPONSIVE_CARD:..
2b60: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2b70: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
2b80: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
2b90: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
2ba0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2bb0: 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52  "SCARD_W_UNPOWER
2bc0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
2bd0: 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  e SCARD_W_RESET_
2be0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2bf0: 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43  "SCARD_W_RESET_C
2c00: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
2c10: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41  ARD_W_REMOVED_CA
2c20: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
2c30: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43  CARD_W_REMOVED_C
2c40: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
2c50: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
2c60: 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ALL:....return("
2c70: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
2c80: 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20  SMALL");...case 
2c90: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
2ca0: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
2cb0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
2cc0: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45  EADER_UNSUPPORTE
2cd0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2ce0: 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45  D_E_DUPLICATE_RE
2cf0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
2d00: 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41  "SCARD_E_DUPLICA
2d10: 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  TE_READER");...c
2d20: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44  ase SCARD_E_CARD
2d30: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
2d40: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2d50: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45  _CARD_UNSUPPORTE
2d60: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2d70: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a  D_E_NO_SERVICE:.
2d80: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2d90: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b  _E_NO_SERVICE");
2da0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2db0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a  SERVICE_STOPPED:
2dc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2dd0: 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50  D_E_SERVICE_STOP
2de0: 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  PED");...case SC
2df0: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
2e00: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
2e10: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
2e20: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2e30: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52  SCARD_E_UNSUPPOR
2e40: 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09  TED_FEATURE:....
2e50: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2e60: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54  UNSUPPORTED_FEAT
2e70: 55 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43  URE");.#ifdef SC
2e80: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53  ARD_E_NO_READERS
2e90: 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73  _AVAILABLE...cas
2ea0: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  e SCARD_E_NO_REA
2eb0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a  DERS_AVAILABLE:.
2ec0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2ed0: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
2ee0: 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69  AILABLE");.#endi
2ef0: 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  f..}...return("U
2f00: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
2f10: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2f20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2f30: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75  C_OBJID_TO_STR(u
2f40: 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b  int16_t objid) {
2f50: 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29  ..switch (objid)
2f60: 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30 30   {...case 0x2000
2f70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
2f80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45  KEY_TLV_OBJID_GE
2f90: 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  NERALINFO");...c
2fa0: 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72  ase 0x2100:....r
2fb0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
2fc0: 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f  V_OBJID_PROPERSO
2fd0: 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  NALINFO");...cas
2fe0: 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74  e 0x3000:....ret
2ff0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3000: 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54  OBJID_ACCESSCONT
3010: 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ROL");...case 0x
3020: 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  4000:....return(
3030: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3040: 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73  D_LOGIN");...cas
3050: 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74  e 0x5000:....ret
3060: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3070: 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29  OBJID_CARDINFO")
3080: 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 30 3a  ;...case 0x6000:
3090: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
30a0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
30b0: 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73  METRICS");...cas
30c0: 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74  e 0x7000:....ret
30d0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
30e0: 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47  OBJID_DIGITALSIG
30f0: 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30  CERT");...case 0
3100: 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x0200:....return
3110: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3120: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b  ID_CAC_PERSON");
3130: 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a  ...case 0x0202:.
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 43 41 43 5f  Y_TLV_OBJID_CAC_
3160: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
3170: 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65  se 0x0203:....re
3180: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3190: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
31a0: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
31b0: 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65  se 0x0201:....re
31c0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
31d0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
31e0: 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30  NNEL");...case 0
31f0: 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e  x02FE:....return
3200: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3210: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29  ID_CAC_PKICERT")
3220: 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22  ;..}....return("
3230: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
3240: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3250: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
3260: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
3270: 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70  R(uint8_t apptyp
3280: 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70  e) {..switch (ap
3290: 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  ptype) {...case 
32a0: 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x00:....return(
32b0: 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20  "NONE");...case 
32c0: 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x01:....return(
32d0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
32e0: 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73  GENERIC");...cas
32f0: 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72  e 0x02:....retur
3300: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3310: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_SKI");...case 
3320: 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x03:....return(
3330: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3340: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
3350: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3360: 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09  ..case 0x04:....
3370: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3380: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3390: 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65  case 0x05:....re
33a0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
33b0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
33c0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
33d0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36  I");...case 0x06
33e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
33f0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
3400: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
3410: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
3420: 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x07:....return("
3430: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
3440: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
3450: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41  TLV_APP_SKI | CA
3460: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
3470: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
3480: 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 23  "INVALID");.}..#
3490: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28    define malloc(
34a0: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
34b0: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f  FUNC_MALLOC(x, _
34c0: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
34d0: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61  _).#  define rea
34e0: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45  lloc(x, y) CACKE
34f0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
3500: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e  LLOC(x, y, __fun
3510: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
3520: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23    ifdef strdup.#
3530: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70      undef strdup
3540: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66  .#  endif.#  def
3550: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41  ine strdup(x) CA
3560: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3570: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63  STRDUP(x, __func
3580: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65  __, __LINE__).#e
3590: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41  lse.#  define CA
35a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
35b0: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  F(x...) /**/.#  
35c0: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
35d0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20  BUG_PRINTBUF(f, 
35e0: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x, y) /**/.#  de
35f0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
3600: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f  G_PERROR(x) /**/
3610: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
3620: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
3630: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
3640: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
3650: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
3660: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
3670: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
3680: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
3690: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
36a0: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
36b0: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
36c0: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
36d0: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
36e0: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
36f0: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
3700: 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a  SABLED".#endif..
3710: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
3720: 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 75  sc_identity {..u
3730: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 70  nsigned char app
3740: 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f  let[7];..uint16_
3750: 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f 74  t file;...size_t
3760: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
3770: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
3780: 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a   *certificate;..
3790: 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65  .ssize_t keysize
37a0: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
37b0: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  key_identity {..
37c0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
37d0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
37e0: 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b  c_identity;...CK
37f0: 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72  _ATTRIBUTE *attr
3800: 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e  ibutes;..CK_ULON
3810: 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  G attributes_cou
3820: 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  nt;.};..struct c
3830: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a  ackey_session {.
3840: 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43  .int active;...C
3850: 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
3860: 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61  ;...CK_STATE sta
3870: 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c  te;..CK_FLAGS fl
3880: 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  ags;..CK_ULONG u
3890: 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43  lDeviceError;..C
38a0: 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
38b0: 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54  ication;..CK_NOT
38c0: 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74  IFY Notify;...st
38d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
38e0: 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
38f0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
3900: 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
3910: 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f  t;...int search_
3920: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52  active;..CK_ATTR
3930: 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68  IBUTE_PTR search
3940: 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e  _query;..CK_ULON
3950: 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  G search_query_c
3960: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
3970: 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72  long search_curr
3980: 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f  _id;...int sign_
3990: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
39a0: 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f  ANISM_TYPE sign_
39b0: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42  mechanism;..CK_B
39c0: 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66  YTE_PTR sign_buf
39d0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
39e0: 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75   sign_buflen;..u
39f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67  nsigned long sig
3a00: 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75  n_bufused;..stru
3a10: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
3a20: 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74  ty *sign_identit
3a30: 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74  y;...int decrypt
3a40: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
3a50: 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72  HANISM_TYPE decr
3a60: 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ypt_mechanism;..
3a70: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72  CK_VOID_PTR decr
3a80: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09  ypt_mech_parm;..
3a90: 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74  CK_ULONG decrypt
3aa0: 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09  _mech_parmlen;..
3ab0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
3ac0: 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f  entity *decrypt_
3ad0: 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74  identity;.};..st
3ae0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
3af0: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
3b00: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
3b10: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f  der;...int pcsc_
3b20: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a  card_connected;.
3b30: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73  .SCARDHANDLE pcs
3b40: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72  c_card;...int tr
3b50: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b  ansaction_depth;
3b60: 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65  ...int slot_rese
3b70: 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f  t;...CK_FLAGS to
3b80: 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73  ken_flags;...uns
3b90: 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65  igned char *labe
3ba0: 6c 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65  l;.};..typedef e
3bb0: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
3bc0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20  V_APP_GENERIC = 
3bd0: 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x01,..CACKEY_TL
3be0: 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20  V_APP_SKI     = 
3bf0: 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x02,..CACKEY_TL
3c00: 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20  V_APP_PKI     = 
3c10: 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  0x04.} cackey_tl
3c20: 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65  v_apptype;..type
3c30: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
3c40: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e  EY_TLV_OBJID_GEN
3c50: 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d  ERALINFO       =
3c60: 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x2000,..CACKEY
3c70: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45  _TLV_OBJID_PROPE
3c80: 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30  RSONALINFO   = 0
3c90: 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2100,..CACKEY_T
3ca0: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43  LV_OBJID_ACCESSC
3cb0: 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33  ONTROL     = 0x3
3cc0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
3cd0: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20  _OBJID_LOGIN    
3ce0: 20 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30           = 0x400
3cf0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
3d00: 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20  BJID_CARDINFO   
3d10: 20 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c         = 0x5000,
3d20: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3d30: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20  ID_BIOMETRICS   
3d40: 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09       = 0x6000,..
3d50: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3d60: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20  _DIGITALSIGCERT 
3d70: 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41     = 0x7000,..CA
3d80: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
3d90: 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20  AC_PERSON       
3da0: 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b   = 0x0200,..CACK
3db0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3dc0: 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d  _BENEFITS      =
3dd0: 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59   0x0202,..CACKEY
3de0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
3df0: 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30  THERBENEFITS = 0
3e00: 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54  x0203,..CACKEY_T
3e10: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3e20: 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30  SONNEL     = 0x0
3e30: 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  201,..CACKEY_TLV
3e40: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
3e50: 52 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46  RT       = 0x02F
3e60: 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f  E.} cackey_tlv_o
3e70: 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65  bjectid;..typede
3e80: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
3e90: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
3ea0: 53 45 4e 54 20 20 20 20 3d 20 32 2c 0a 09 43 41  SENT    = 2,..CA
3eb0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
3ec0: 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 31 2c  NABSENT     = 1,
3ed0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  ..CACKEY_PCSC_S_
3ee0: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OK              
3ef0: 3d 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53  = 0,..CACKEY_PCS
3f00: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20  C_E_GENERIC     
3f10: 20 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45      = -1,..CACKE
3f20: 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20  Y_PCSC_E_BADPIN 
3f30: 20 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09           = -2,..
3f40: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
3f50: 43 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20  CKED          = 
3f60: 2d 33 2c 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74  -3,.} cackey_ret
3f70: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
3f80: 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09  _tlv_cardurl {..
3f90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20  unsigned char   
3fa0: 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61       rid[5];..ca
3fb0: 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65  ckey_tlv_apptype
3fc0: 20 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63     apptype;..cac
3fd0: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
3fe0: 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63    objectid;..cac
3ff0: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
4000: 20 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e    appid;..unsign
4010: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 70  ed char        p
4020: 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  inid;.};..struct
4030: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
4040: 74 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65  ty;.struct cacke
4050: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09  y_tlv_entity {..
4060: 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69  uint8_t tag;..si
4070: 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75  ze_t length;...u
4080: 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76  nion {...void *v
4090: 61 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63  alue;...struct c
40a0: 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72  ackey_tlv_cardur
40b0: 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  l *value_cardurl
40c0: 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75  ;...uint8_t valu
40d0: 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74  e_byte;..};...st
40e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
40f0: 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d  entity *_next;.}
4100: 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f  ;../* CACKEY Glo
4110: 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73  bal Handles */.s
4120: 74 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b  tatic void *cack
4130: 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c  ey_biglock = NUL
4140: 4c 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  L;.static struct
4150: 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20   cackey_session 
4160: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
4170: 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72  128];.static str
4180: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
4190: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38  cackey_slots[128
41a0: 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  ];.static int ca
41b0: 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
41c0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
41d0: 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f   cackey_biglock_
41e0: 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49  init = 0;.CK_C_I
41f0: 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63  NITIALIZE_ARGS c
4200: 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20  ackey_args;../* 
4210: 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64  PCSC Global Hand
4220: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50  les */.static LP
4230: 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63  SCARDCONTEXT cac
4240: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
4250: 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20  = NULL;..static 
4260: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61  unsigned long ca
4270: 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
4280: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
4290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65  unsigned long re
42a0: 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73  tval = 255;..uns
42b0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72  igned long major
42c0: 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20   = 0;..unsigned 
42d0: 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a  long minor = 0;.
42e0: 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72  .char *major_str
42f0: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
4300: 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c  minor_str = NULL
4310: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
4320: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
4330: 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ");...if (retval
4340: 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43   != 255) {...CAC
4350: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4360: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c  ("Returning 0x%l
4370: 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65  x (cached).", re
4380: 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e  tval);....return
4390: 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72  (retval);..}...r
43a0: 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64  etval = 0;..#ifd
43b0: 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ef PACKAGE_VERSI
43c0: 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  ON.        major
43d0: 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56  _str = PACKAGE_V
43e0: 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a  ERSION;..if (maj
43f0: 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20  or_str) {..     
4400: 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f     major = strto
4410: 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d  ul(major_str, &m
4420: 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a  inor_str, 10);..
4430: 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29  ..if (minor_str)
4440: 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74   {....minor = st
4450: 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20  rtoul(minor_str 
4460: 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a  + 1, NULL, 10);.
4470: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20  ..}..}...retval 
4480: 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20  = (major << 16) 
4490: 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a  | (minor << 8);.
44a0: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
44b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
44c0: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20  turning 0x%lx", 
44d0: 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
44e0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a  n(retval);.}../*
44f0: 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46   PC/SC Related F
4500: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20  unctions */./*. 
4510: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
4520: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c    void cackey_sl
4530: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
4540: 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ll(void);. *. * 
4550: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
4560: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
4570: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
4580: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
4590: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
45a0: 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74  ction disconnect
45b0: 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73  s from all cards
45c0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
45d0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74  void cackey_slot
45e0: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
45f0: 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32  (void) {..uint32
4600: 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  _t idx;...CACKEY
4610: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
4620: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20  alled.");...for 
4630: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
4640: 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
4650: 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
4660: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
4670: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
4680: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
4690: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
46a0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43  nected) {....CAC
46b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
46c0: 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ("SCardDisconnec
46d0: 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20  t(%lu) called", 
46e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
46f0: 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44  idx);.....SCardD
4700: 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79  isconnect(cackey
4710: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
4720: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
4730: 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09  VE_CARD);...}...
4740: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
4750: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a  s[idx].label) {.
4760: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
4770: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
4780: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
4790: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
47a0: 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
47b0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
47c0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
47d0: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ed = 0;...cackey
47e0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
47f0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
4800: 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  0;....if (cackey
4810: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
4820: 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ve) {....CACKEY_
4830: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
4840: 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f  rking active slo
4850: 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72  t %lu as being r
4860: 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64  eset", (unsigned
4870: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d   long) idx);...}
4880: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
4890: 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  [idx].slot_reset
48a0: 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45   = 1;..}...CACKE
48b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
48c0: 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72  Returning");...r
48d0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
48e0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
48f0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
4900: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76  y_pcsc_connect(v
4910: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
4920: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
4930: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
4940: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
4950: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
4960: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
4970: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
4980: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
4990: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
49a0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
49b0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63   function connec
49c0: 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ts to the PC/SC 
49d0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
49e0: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74  er and updates t
49f0: 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c  he. *     global
4a00: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
4a10: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
4a20: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
4a30: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c  nnect(void) {..L
4a40: 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ONG scard_est_co
4a50: 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65  ntext_ret;.#ifde
4a60: 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41  f HAVE_SCARDISVA
4a70: 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47  LIDCONTEXT..LONG
4a80: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
4a90: 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  et;.#endif...CAC
4aa0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4ab0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
4ac0: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
4ad0: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
4ae0: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
4af0: 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73  andle = malloc(s
4b00: 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63  izeof(*cackey_pc
4b10: 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69  sc_handle));...i
4b20: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
4b30: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
4b40: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
4b50: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
4b60: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
4b70: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
4b80: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61  ailure");.....ca
4b90: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
4ba0: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
4bb0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
4bc0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
4bd0: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
4be0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
4bf0: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
4c00: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09  t() called");...
4c10: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
4c20: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74  t_ret = SCardEst
4c30: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43  ablishContext(SC
4c40: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d  ARD_SCOPE_SYSTEM
4c50: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61  , NULL, NULL, ca
4c60: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4c70: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65  );...if (scard_e
4c80: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  st_context_ret !
4c90: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
4ca0: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
4cb0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
4cc0: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c  l to SCardEstabl
4cd0: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65  ishContext faile
4ce0: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25  d (returned %s/%
4cf0: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  li), returning i
4d00: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b  n failure", CACK
4d10: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
4d20: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
4d30: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4d40: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
4d50: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4d60: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61  et);.....free(ca
4d70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4d80: 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
4d90: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
4da0: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
4db0: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
4dc0: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
4dd0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
4de0: 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  ERIC);...}..}..#
4df0: 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44  ifdef HAVE_SCARD
4e00: 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09  ISVALIDCONTEXT..
4e10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4e20: 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69  NTF("SCardIsVali
4e30: 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65  dContext() calle
4e40: 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61  d");..scard_isva
4e50: 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49  lid_ret = SCardI
4e60: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63  sValidContext(*c
4e70: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
4e80: 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69  e);..if (scard_i
4e90: 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43  svalid_ret != SC
4ea0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
4eb0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4ec0: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
4ed0: 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  as become invali
4ee0: 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43  d (SCardIsValidC
4ef0: 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29  ontext = %s/%li)
4f00: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65  , trying to re-e
4f10: 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41  stablish...", CA
4f20: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4f30: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
4f40: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
4f50: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
4f60: 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a  _isvalid_ret);..
4f70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4f80: 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61  RINTF("SCardEsta
4f90: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63  blishContext() c
4fa0: 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64  alled");...scard
4fb0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4fc0: 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73   = SCardEstablis
4fd0: 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53  hContext(SCARD_S
4fe0: 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c  COPE_SYSTEM, NUL
4ff0: 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f  L, NULL, cackey_
5000: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
5010: 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  if (scard_est_co
5020: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
5030: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
5040: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5050: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20  PRINTF("Call to 
5060: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
5070: 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65  ntext failed (re
5080: 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20  turned %s/%li), 
5090: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
50a0: 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45  lure", CACKEY_DE
50b0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
50c0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65  R_TO_STR(scard_e
50d0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c  st_context_ret),
50e0: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73   (long) scard_es
50f0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a  t_context_ret);.
5100: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
5110: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
5120: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
5130: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  dle = NULL;.....
5140: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
5150: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
5160: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5170: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5180: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
5190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
51a0: 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  ndle has been re
51b0: 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a  -established");.
51c0: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  .}.#endif...CACK
51d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
51e0: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  "Sucessfully con
51f0: 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c  nected to PC/SC,
5200: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75   returning in su
5210: 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72  ccess");...retur
5220: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
5230: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
5240: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
5250: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
5260: 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
5270: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
5280: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5290: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
52a0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
52b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
52c0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
52d0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
52e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
52f0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
5300: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
5310: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
5320: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20  nnects from the 
5330: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
5340: 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64   manager and upd
5350: 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20  ates. *     the 
5360: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20  global handle.. 
5370: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
5380: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
5390: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76  csc_disconnect(v
53a0: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  oid) {..LONG sca
53b0: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
53c0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
53d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
53e0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
53f0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
5400: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
5410: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
5420: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  _OK);..}...scard
5430: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _rel_context_ret
5440: 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43   = SCardReleaseC
5450: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70  ontext(*cackey_p
5460: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69  csc_handle);...i
5470: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
5480: 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28  andle) {...free(
5490: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
54a0: 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f  le);.....cackey_
54b0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
54c0: 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  LL;..}...if (sca
54d0: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
54e0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
54f0: 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72  CCESS) {...retur
5500: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
5510: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72  GENERIC);..}...r
5520: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5530: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
5540: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
5550: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
5560: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
5570: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
5580: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
5590: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
55a0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
55b0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
55c0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
55d0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
55e0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
55f0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
5600: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
5610: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
5620: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
5630: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
5640: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
5650: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
5660: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
5670: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
5680: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
5690: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
56a0: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
56b0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
56c0: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a  DWORD protocol;.
56d0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
56e0: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
56f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
5700: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
5710: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
5720: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
5730: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
5740: 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  fied, returning 
5750: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
5760: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5770: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
5780: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
5790: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
57a0: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
57b0: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
57c0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
57d0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
57e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
57f0: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
5800: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72   PC/SC failed, r
5810: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
5820: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
5830: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
5840: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
5850: 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64   Connect to read
5860: 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  er, if needed */
5870: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
5880: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
5890: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
58a0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
58b0: 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c  Connect(%s) call
58c0: 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  ed", slot->pcsc_
58d0: 72 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64  reader);...scard
58e0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
58f0: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
5900: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
5910: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
5920: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
5930: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
5940: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
5950: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
5960: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
5970: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53  rd_conn_ret != S
5980: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
5990: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
59a0: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
59b0: 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69  tion to card fai
59c0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
59d0: 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64  n failure (SCard
59e0: 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25  Connect() = %s/%
59f0: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
5a00: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
5a10: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f  _TO_STR(scard_co
5a20: 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  nn_ret), (long) 
5a30: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
5a40: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
5a50: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5a60: 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d  C);...}....slot-
5a70: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
5a80: 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74  cted = 1;...slot
5a90: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
5aa0: 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65  pth = 0;..}...re
5ab0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5ac0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
5ad0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5ae0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5af0: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
5b00: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
5b10: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
5b20: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
5b30: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
5b40: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
5b50: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
5b60: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
5b70: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
5b80: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
5b90: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5ba0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
5bb0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
5bc0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
5bd0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
5be0: 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73   *     The trans
5bf0: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
5c00: 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e   terminated usin
5c10: 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  g "cackey_end_tr
5c20: 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a  ansaction". *. *
5c30: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5c40: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
5c50: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
5c60: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
5c70: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
5c80: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
5c90: 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _ret;..LONG scar
5ca0: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43  d_trans_ret;...C
5cb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5cc0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5cd0: 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  .cackey_conn_ret
5ce0: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
5cf0: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
5d00: 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  f (cackey_conn_r
5d10: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
5d20: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
5d30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5d40: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
5d50: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
5d60: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
5d70: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
5d80: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5d90: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
5da0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
5db0: 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ++;...if (slot->
5dc0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
5dd0: 68 20 3e 20 31 29 20 7b 0a 09 09 43 41 43 4b 45  h > 1) {...CACKE
5de0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5df0: 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61  Already in a tra
5e00: 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72  nsaction, perfor
5e10: 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28  ming no action (
5e20: 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22  new depth = %i)"
5e30: 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  , slot->transact
5e40: 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72  ion_depth);....r
5e50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5e60: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63  C_S_OK);..}...sc
5e70: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20  ard_trans_ret = 
5e80: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61  SCardBeginTransa
5e90: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
5ea0: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61  _card);..if (sca
5eb0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20  rd_trans_ret != 
5ec0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
5ed0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
5ee0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
5ef0: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61   to begin transa
5f00: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
5f10: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
5f20: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5f30: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
5f40: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
5f50: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
5f60: 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73  ully began trans
5f70: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
5f80: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
5f90: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
5fa0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
5fb0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
5fc0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
5fd0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
5fe0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
5ff0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
6000: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
6010: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6020: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
6030: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
6040: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
6050: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
6060: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
6070: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
6080: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
6090: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
60a0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
60b0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
60c0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
60d0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
60e0: 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65   requires "cacke
60f0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
6100: 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65  ion" to be calle
6110: 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73  d first. *. */.s
6120: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
6130: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
6140: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
6150: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6160: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
6170: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
6180: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6190: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
61a0: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  f (!slot->pcsc_c
61b0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
61c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
61d0: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
61e0: 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75  not connected, u
61f0: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
6200: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a 09 09 72  nsaction");....r
6210: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6220: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
6230: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
6240: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
6250: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
6260: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
6270: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
6280: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
6290: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
62a0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
62b0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
62c0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
62d0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
62e0: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
62f0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
6300: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
6310: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
6320: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
6330: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
6340: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
6350: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
6360: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
6370: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
6380: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
6390: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
63a0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
63b0: 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74  C);..}...scard_t
63c0: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64  rans_ret = SCard
63d0: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  EndTransaction(s
63e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
63f0: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
6400: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72  );..if (scard_tr
6410: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ans_ret != SCARD
6420: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
6430: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6440: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65  NTF("Unable to e
6450: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nd transaction, 
6460: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
6470: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
6480: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6490: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
64a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
64b0: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65  ("Sucessfully te
64c0: 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63  rminated transac
64d0: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73  tion on slot (%s
64e0: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  )", slot->pcsc_r
64f0: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e  eader);...return
6500: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
6510: 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52  K);.}../* APDU R
6520: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
6530: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
6540: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
6550: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
6560: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
6570: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
6580: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
6590: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
65a0: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
65b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
65c0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
65d0: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
65e0: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
65f0: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
6600: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
6610: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
6620: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6630: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
6640: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b   *respdata_len);
6650: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6660: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
6670: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
6680: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
6690: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
66a0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
66b0: 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20   char class. *  
66c0: 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73         APDU Clas
66d0: 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  s (GSCIS_CLASS_I
66e0: 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f  SO7816 or GSCIS_
66f0: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
6700: 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20  TFORM. *        
6710: 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29   usually), (CLA)
6720: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
6730: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
6740: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  tion. *         
6750: 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e  APDU Instruction
6760: 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20   (INS). *. *    
6770: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
6780: 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  1. *         APD
6790: 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50  U Parameter 1 (P
67a0: 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  1). *. *     uns
67b0: 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a  igned char p2. *
67c0: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
67d0: 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20  rameter 2 (P2). 
67e0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
67f0: 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20  d char lc. *    
6800: 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68       APDU Length
6810: 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29   of Content (Lc)
6820: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
6830: 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22  length of "data"
6840: 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61  . *         para
6850: 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61  meter.  If "data
6860: 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  " is specified a
6870: 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72  s NULL, this par
6880: 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20  ameter will. *  
6890: 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65         be ignore
68a0: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
68b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
68c0: 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e  . *         Poin
68d0: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f  ter to buffer to
68e0: 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c   send.  It shoul
68f0: 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20  d be "Lc" bytes 
6900: 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20  long.  If. *    
6910: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
6920: 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c  s NULL, "Lc" wil
6930: 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61  l not be sent, a
6940: 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77  nd this buffer w
6950: 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20  ill be. *       
6960: 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a    ignored.. *. *
6970: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6980: 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20  ar le. *        
6990: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
69a0: 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29  Expectation (Le)
69b0: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
69c0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a  length of the. *
69d0: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65           expecte
69e0: 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69  d reply.  If thi
69f0: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
6a00: 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  s 0 then it will
6a10: 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20   not. *         
6a20: 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20  be sent.. *. *  
6a30: 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73     uint16_t *res
6a40: 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20  pcode. *        
6a50: 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74   [OUT] Pointer t
6a60: 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44  o storage of APD
6a70: 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e  U response code.
6a80: 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20    If this is. * 
6a90: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
6aa0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  d as NULL, the r
6ab0: 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c  esponse code wil
6ac0: 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  l be discarded..
6ad0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
6ae0: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
6af0: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  a. *         [OU
6b00: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
6b10: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
6b20: 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66  sponse data.  If
6b30: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
6b40: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
6b50: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
6b60: 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65  nse data will be
6b70: 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a   discarded.  If.
6b80: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22   *         the "
6b90: 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61  respdata_len" pa
6ba0: 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69  rameter is speci
6bb0: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
6bc0: 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20  is buffer. *    
6bd0: 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65       will not be
6be0: 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20   updated.. *. * 
6bf0: 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70      size_t *resp
6c00: 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20  data_len. *     
6c10: 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f      [IN, OUT] Po
6c20: 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67  inter initialing
6c30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6c40: 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73  size of the "res
6c50: 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20  pdata". *       
6c60: 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72    buffer.  Befor
6c70: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65  e returning, the
6c80: 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75   pointed to valu
6c90: 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  e is updated to 
6ca0: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e  the. *         n
6cb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
6cc0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75  ritten to the bu
6cd0: 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69  ffer.  If this i
6ce0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20  s specified as. 
6cf0: 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20  *         NULL, 
6d00: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  it will not be u
6d10: 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73  pdated, and "res
6d20: 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69  pdata" will be i
6d30: 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20  gnored causing. 
6d40: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65  *         the re
6d50: 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62  sponse data to b
6d60: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
6d70: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6d80: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6d90: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
6da0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
6db0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6dc0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
6dd0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
6de0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
6df0: 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63  tion will connec
6e00: 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43  t to the PC/SC C
6e10: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65  onnection Manage
6e20: 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63  r via. *     cac
6e30: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6e40: 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a  () if needed.. *
6e50: 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20  . *     It will 
6e60: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63  connect to the c
6e70: 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65  ard in the reade
6e80: 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  r attached to th
6e90: 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70  e slot. *     sp
6ea0: 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c  ecified.  It wil
6eb0: 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74  l reconnect to t
6ec0: 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63  he card if the c
6ed0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20  onnection. *    
6ee0: 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20   goes away.. *. 
6ef0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
6f00: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
6f10: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
6f20: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
6f30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
6f40: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
6f50: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
6f60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
6f70: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6f80: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
6f90: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
6fa0: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
6fb0: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
6fc0: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
6fd0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6fe0: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
6ff0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   *respdata_len) 
7000: 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72  {..uint8_t major
7010: 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  _rc, minor_rc;..
7020: 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f  size_t bytes_to_
7030: 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61  copy, tmp_respda
7040: 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52 44 20 70  ta_len;..DWORD p
7050: 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20  rotocol;..DWORD 
7060: 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c  xmit_len, recv_l
7070: 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
7080: 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f  xmit_ret, scard_
7090: 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54  reconn_ret;..BYT
70a0: 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d  E xmit_buf[1024]
70b0: 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d  , recv_buf[1024]
70c0: 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
70d0: 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65  ect_ret, pcsc_ge
70e0: 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20  tresp_ret;..int 
70f0: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
7100: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
7110: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
7120: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
7130: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
7140: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
7150: 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ied.");....retur
7160: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7170: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70  GENERIC);..}...p
7180: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
7190: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
71a0: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
71b0: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
71c0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
71d0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
71e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
71f0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
7200: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
7210: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7220: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
7230: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7240: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72  RIC);..}.../* Tr
7250: 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f  ansmit */..xmit_
7260: 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62  len = 0;..xmit_b
7270: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
7280: 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75   class;..xmit_bu
7290: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
72a0: 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d  instruction;..xm
72b0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
72c0: 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62  +] = p1;..xmit_b
72d0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
72e0: 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20   p2;..if (data) 
72f0: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  {...xmit_buf[xmi
7300: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09  t_len++] = lc;..
7310: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
7320: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20  dx < lc; idx++) 
7330: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
7340: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61  it_len++] = data
7350: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  [idx];...}..}...
7360: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20  if (le != 0x00) 
7370: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  {...xmit_buf[xmi
7380: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09  t_len++] = le;..
7390: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61  }.../* Begin Sma
73a0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
73b0: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
73c0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
73d0: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61  slot);...if (cla
73e0: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53  ss == GSCIS_CLAS
73f0: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73  S_ISO7816 && ins
7400: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49  truction == GSCI
7410: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26  S_INSTR_VERIFY &
7420: 26 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20  & p1 == 0x00 && 
7430: 70 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  p2 == 0x00) {...
7440: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7450: 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  NTF("Sending APD
7460: 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22  U: <<censored>>"
7470: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
7480: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7490: 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50  TBUF("Sending AP
74a0: 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20  DU:", xmit_buf, 
74b0: 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  xmit_len);..}...
74c0: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  recv_len = sizeo
74d0: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63  f(recv_buf);..sc
74e0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
74f0: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
7500: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7510: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74  ARD_PCI_T0, xmit
7520: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
7530: 53 43 41 52 44 5f 50 43 49 5f 54 31 2c 20 72 65  SCARD_PCI_T1, re
7540: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
7550: 6e 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78  n);..if (scard_x
7560: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
7570: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7580: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7590: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
75a0: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
75b0: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
75c0: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41  ) = %s/%lx)", CA
75d0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
75e0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
75f0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
7600: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
7610: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
7620: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
7630: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
7640: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
7650: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 0a 09  been reset");...
7660: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
7670: 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
7680: 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74  slot->slot_reset
7690: 20 3d 20 31 3b 0a 0a 09 09 69 66 20 28 73 63 61   = 1;....if (sca
76a0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53  rd_xmit_ret == S
76b0: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
76c0: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
76d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
76e0: 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65  et required, ple
76f0: 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a  ase hold...");..
7700: 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  ...scard_reconn_
7710: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
7720: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7730: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
7740: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
7750: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41  PROTOCOL_T0, SCA
7760: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26  RD_RESET_CARD, &
7770: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66  protocol);....if
7780: 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72   (scard_reconn_r
7790: 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
77a0: 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20  CCESS) {...../* 
77b0: 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
77c0: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
77d0: 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
77e0: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
77f0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
7800: 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
7810: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
7820: 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65  th--;......cacke
7830: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
7840: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
7850: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
7860: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
7870: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
7880: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 09  ransmitting");..
7890: 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  ...scard_xmit_re
78a0: 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69  t = SCardTransmi
78b0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
78c0: 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c  d, SCARD_PCI_T0,
78d0: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
78e0: 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54  len, SCARD_PCI_T
78f0: 30 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  0, recv_buf, &re
7900: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  cv_len);......if
7910: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
7920: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
7930: 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ESS) {......CACK
7940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7950: 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c  "Retransmit fail
7960: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
7970: 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20 64   failure after d
7980: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65  isconnecting the
7990: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
79a0: 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c  smit = %s/%li)",
79b0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
79c0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
79d0: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
79e0: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
79f0: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09  _xmit_ret);.....
7a00: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
7a10: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
7a20: 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  d, SCARD_RESET_C
7a30: 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  ARD);......slot-
7a40: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7a50: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09  cted = 0;.......
7a60: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
7a70: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
7a80: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
7a90: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
7aa0: 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e  ;......cackey_en
7ab0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
7ac0: 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  ot);.......retur
7ad0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7ae0: 47 45 4e 45 52 49 43 29 3b 0a 09 09 09 09 7d 0a  GENERIC);.....}.
7af0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
7b00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7b10: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
7b20: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09  ng card");......
7b30: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
7b40: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7b50: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7b60: 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63  D);.....slot->pc
7b70: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
7b80: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45  d = 0;....../* E
7b90: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
7ba0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  nsaction */.....
7bb0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7bc0: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
7bd0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
7be0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
7bf0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7c00: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
7c10: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
7c20: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
7c30: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7c40: 43 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  C);....}...} els
7c50: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
7c60: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
7c70: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
7c80: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
7c90: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7ca0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53  _card, SCARD_RES
7cb0: 45 54 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  ET_CARD);....slo
7cc0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7cd0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
7ce0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
7cf0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
7d00: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7d10: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
7d20: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
7d30: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
7d40: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7d50: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
7d60: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
7d70: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
7d80: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7d90: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  C);...}..}...CAC
7da0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
7db0: 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c  UF("Returned Val
7dc0: 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20  ue:", recv_buf, 
7dd0: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  recv_len);...if 
7de0: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b  (recv_len < 2) {
7df0: 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65  .../* Minimal re
7e00: 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73  sponse length is
7e10: 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e   2 bytes, return
7e20: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  ing in failure *
7e30: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
7e40: 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
7e50: 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74  e too small, ret
7e60: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7e70: 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c  e (recv_len = %l
7e80: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
7e90: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
7ea0: 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7eb0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7ec0: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
7ed0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
7ee0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7ef0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7f00: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
7f10: 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f  ermine result co
7f20: 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20  de */..major_rc 
7f30: 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f  = recv_buf[recv_
7f40: 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72  len - 2];..minor
7f50: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
7f60: 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69  ecv_len - 1];..i
7f70: 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09  f (respcode) {..
7f80: 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61  .*respcode = (ma
7f90: 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d  jor_rc << 8) | m
7fa0: 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a  inor_rc;..}.../*
7fb0: 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20   Adjust message 
7fc0: 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f  buffer */..recv_
7fd0: 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41  len -= 2;.../* A
7fe0: 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75  dd bytes to retu
7ff0: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70  rn value */..tmp
8000: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  _respdata_len = 
8010: 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61  0;..if (respdata
8020: 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e   && respdata_len
8030: 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61  ) {...tmp_respda
8040: 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61  ta_len = *respda
8050: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73  ta_len;....bytes
8060: 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70  _to_copy = *resp
8070: 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20  data_len;....if 
8080: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65  (recv_len < byte
8090: 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09  s_to_copy) {....
80a0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
80b0: 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  recv_len;...}...
80c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
80d0: 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c  INTF("Copying %l
80e0: 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62  u bytes to the b
80f0: 75 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c  uffer (recv'd %l
8100: 75 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c  u bytes, but onl
8110: 79 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74  y %lu bytes left
8120: 20 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22   in our buffer)"
8130: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
8140: 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c  ) bytes_to_copy,
8150: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
8160: 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69   recv_len, (unsi
8170: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70  gned long) *resp
8180: 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65  data_len);....me
8190: 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72  mcpy(respdata, r
81a0: 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74  ecv_buf, bytes_t
81b0: 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64  o_copy);...respd
81c0: 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  ata += bytes_to_
81d0: 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61  copy;....*respda
81e0: 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74  ta_len = bytes_t
81f0: 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65  o_copy;...tmp_re
8200: 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79  spdata_len -= by
8210: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20  tes_to_copy;..} 
8220: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63  else {...if (rec
8230: 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  v_len != 0) {...
8240: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8250: 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61  INTF("Throwing a
8260: 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e  way %lu bytes, n
8270: 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68  owhere to put th
8280: 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  em!", (unsigned 
8290: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
82a0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61  ...}..}...if (ma
82b0: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20  jor_rc == 0x61) 
82c0: 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74  {.../* We need t
82d0: 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b  o READ */...CACK
82e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
82f0: 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71  "Buffer read req
8300: 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28  uired");....if (
8310: 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30  minor_rc == 0x00
8320: 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20  ) {....minor_rc 
8330: 3d 20 32 35 33 3b 0a 09 09 7d 0a 0a 09 09 70 63  = 253;...}....pc
8340: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
8350: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
8360: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
8370: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
8380: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53  IS_INSTR_GET_RES
8390: 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30  PONSE, 0x00, 0x0
83a0: 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f  0, 0, NULL, mino
83b0: 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20  r_rc, respcode, 
83c0: 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72  respdata, &tmp_r
83d0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 09 09  espdata_len);...
83e0: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70  if (pcsc_getresp
83f0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
8400: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
8410: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8420: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
8430: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69  failed!  Returni
8440: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
8450: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
8460: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
8470: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
8480: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
8490: 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  lot);.....return
84a0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
84b0: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
84c0: 69 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e  if (respdata_len
84d0: 29 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61  ) {....*respdata
84e0: 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70  _len += tmp_resp
84f0: 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  data_len;...}...
8500: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
8510: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
8520: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
8530: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
8540: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8550: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
8560: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 62  ng in success (b
8570: 75 66 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c  uffer read compl
8580: 65 74 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e  ete)");...return
8590: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
85a0: 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20  K);..}.../* End 
85b0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
85c0: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
85d0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
85e0: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61  (slot);...if (ma
85f0: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20  jor_rc == 0x90) 
8600: 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a  {.../* Success *
8610: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
8620: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
8630: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d  ng in success (m
8640: 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22  ajor_rc = 0x90)"
8650: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
8660: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
8670: 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
8680: 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20  UG_PRINTF("APDU 
8690: 52 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  Returned an erro
86a0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
86b0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74  failure");...ret
86c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
86d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 2f  E_GENERIC);.}../
86e0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
86f0: 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63       ssize_t cac
8700: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
8710: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8720: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
8730: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
8740: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75   size_t count, u
8750: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
8760: 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74  r_v, size_t init
8770: 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a  ial_offset);. *.
8780: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
8790: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
87a0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
87b0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
87c0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
87d0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
87e0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
87f0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
8800: 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20  ] Buffer. *. *  
8810: 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a     size_t count.
8820: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
8830: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74  r of bytes to at
8840: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a  tempt to read. *
8850: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
8860: 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20   char t_or_v. * 
8870: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74          Select t
8880: 68 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29  he T-buffer (01)
8890: 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32   or V-buffer (02
88a0: 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20  ) to read from. 
88b0: 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65   . *. *     size
88c0: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
88d0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65  t. *         Spe
88e0: 63 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20  cify the offset 
88f0: 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61  to begin the rea
8900: 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20  d from. *. *. * 
8910: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
8920: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
8930: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
8940: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
8950: 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20  tually read, or 
8960: 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a  -1 on error.. *.
8970: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
8980: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  None. *. */.stat
8990: 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65  ic ssize_t cacke
89a0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74  y_read_buffer(st
89b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
89c0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
89d0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
89e0: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73  ize_t count, uns
89f0: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
8a00: 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61  v, size_t initia
8a10: 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 73 69 7a  l_offset) {..siz
8a20: 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20  e_t offset = 0, 
8a30: 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f  max_offset, max_
8a40: 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64  count;..unsigned
8a50: 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75   char cmd[2];..u
8a60: 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
8a70: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
8a80: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8a90: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
8aa0: 29 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20  );...max_offset 
8ab0: 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f  = count;..max_co
8ac0: 75 6e 74 20 3d 20 32 35 32 3b 0a 0a 09 69 66 20  unt = 252;...if 
8ad0: 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20  (t_or_v != 1 && 
8ae0: 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09  t_or_v != 2) {..
8af0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8b00: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20  INTF("Invalid T 
8b10: 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20 73  or V parameter s
8b20: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
8b30: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8b40: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
8b50: 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74  ..}...cmd[0] = t
8b60: 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28  _or_v;...while (
8b70: 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65  1) {...if (offse
8b80: 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29  t >= max_offset)
8b90: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8ba0: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
8bb0: 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74  r too small, ret
8bc0: 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67  urning what we g
8bd0: 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65  ot...");.....bre
8be0: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74  ak;...}....count
8bf0: 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20   = max_offset - 
8c00: 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f  offset;...if (co
8c10: 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29  unt > max_count)
8c20: 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61   {....count = ma
8c30: 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09  x_count;...}....
8c40: 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a  cmd[1] = count;.
8c50: 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
8c60: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
8c70: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
8c80: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
8c90: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45  , GSCIS_INSTR_RE
8ca0: 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69  AD_BUFFER, ((ini
8cb0: 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66  tial_offset + of
8cc0: 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78  fset) >> 8) & 0x
8cd0: 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66  ff, (initial_off
8ce0: 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20  set + offset) & 
8cf0: 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64  0xff, sizeof(cmd
8d00: 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72  ), cmd, 0x00, &r
8d10: 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20  espcode, buffer 
8d20: 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74  + offset, &count
8d30: 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
8d40: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
8d50: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28  _S_OK) {....if (
8d60: 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41  respcode == 0x6A
8d70: 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61  86) {.....if (ma
8d80: 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a  x_count == 1) {.
8d90: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
8da0: 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74  }......max_count
8db0: 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32   = max_count / 2
8dc0: 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
8dd0: 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
8de0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
8df0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
8e00: 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  ) failed, return
8e10: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8e20: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
8e30: 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20  ;...}....offset 
8e40: 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20  += count;....if 
8e50: 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75  (count < max_cou
8e60: 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  nt) {....CACKEY_
8e70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68  DEBUG_PRINTF("Sh
8e80: 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e  ort read -- coun
8e90: 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d  t = %i, cmd[1] =
8ea0: 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e   %i", (int) coun
8eb0: 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29  t, (int) cmd[1])
8ec0: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
8ed0: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
8ee0: 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
8ef0: 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
8f00: 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65  E_MAX..if (offse
8f10: 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  t > _POSIX_SSIZE
8f20: 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
8f30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
8f40: 66 66 73 65 74 20 65 78 63 65 65 64 73 20 6d 61  ffset exceeds ma
8f50: 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
8f60: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
8f70: 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
8f80: 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  ffset = %lu)", (
8f90: 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
8fa0: 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
8fb0: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
8fc0: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
8fd0: 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .}.#  endif.#end
8fe0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
8ff0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
9000: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
9010: 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c  read %lu bytes",
9020: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
9030: 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75   offset);...retu
9040: 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  rn(offset);.}../
9050: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
9060: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
9070: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
9080: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
9090: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
90a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
90b0: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65  d, size_t aid_le
90c0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
90d0: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
90e0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
90f0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
9100: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
9110: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
9120: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9130: 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20  *aid. *         
9140: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
9150: 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73  g Applet ID to s
9160: 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20  elect. *. *     
9170: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20  size_t aid_len. 
9180: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
9190: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
91a0: 20 22 61 69 64 22 20 28 41 70 70 6c 65 74 20 49   "aid" (Applet I
91b0: 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a  D) parameter. *.
91c0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
91d0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
91e0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
91f0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
9200: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
9210: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
9220: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
9230: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
9240: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
9250: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65  _ret cackey_sele
9260: 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74  ct_applet(struct
9270: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9280: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
9290: 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61  r *aid, size_t a
92a0: 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73  id_len) {..int s
92b0: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
92c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
92d0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
92e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
92f0: 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70  UF("Selecting ap
9300: 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64  plet:", aid, aid
9310: 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65  _len);...send_re
9320: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
9330: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
9340: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
9350: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
9360: 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  CT, GSCIS_PARAM_
9370: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30  SELECT_APPLET, 0
9380: 78 30 43 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69  x0C, aid_len, ai
9390: 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e  d, 0x00, NULL, N
93a0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
93b0: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
93c0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
93d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
93e0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
93f0: 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72  o open applet, r
9400: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
9410: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
9420: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9430: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
9440: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9450: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
9460: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
9470: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9480: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
9490: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
94a0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
94b0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
94c0: 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65  ile(struct cacke
94d0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69  y_slot *slot, ui
94e0: 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20  nt16_t ef);. *. 
94f0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
9500: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
9510: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
9520: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
9530: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
9540: 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36   *. *     uint16
9550: 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20  _t ef. *        
9560: 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20   Elemental File 
9570: 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20  to select. *. * 
9580: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
9590: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
95a0: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
95b0: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
95c0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
95d0: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
95e0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
95f0: 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 74 73      This selects
9600: 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46   an Elementary F
9610: 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20 74  ile (EF) under t
9620: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c  he currently sel
9630: 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64  ected. *     Ded
9640: 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 46 29  icated File (DF)
9650: 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63  . *. *     Typic
9660: 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c  ally this is cal
9670: 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 63 74  led after select
9680: 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20  ing the correct 
9690: 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a  Applet (using. *
96a0: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65       cackey_sele
96b0: 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56  ct_applet) for V
96c0: 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73  M cards. *. */.s
96d0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
96e0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
96f0: 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65  ile(struct cacke
9700: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69  y_slot *slot, ui
9710: 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e  nt16_t ef) {..un
9720: 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f  signed char fid_
9730: 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e  buf[2];..int sen
9740: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
9750: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
9760: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70  lled.");.../* Op
9770: 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72  en the elementar
9780: 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62  y file */..fid_b
9790: 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38  uf[0] = (ef >> 8
97a0: 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62  ) & 0xff;..fid_b
97b0: 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66  uf[1] = ef & 0xf
97c0: 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  f;...CACKEY_DEBU
97d0: 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74  G_PRINTF("Select
97e0: 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22  ing file: %04lx"
97f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
9800: 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65  ) ef);...send_re
9810: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
9820: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
9830: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
9840: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
9850: 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20  CT, 0x02, 0x0C, 
9860: 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c  sizeof(fid_buf),
9870: 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20   fid_buf, 0x00, 
9880: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
9890: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
98a0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
98b0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
98c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
98d0: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69  ailed to open fi
98e0: 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  le, returning in
98f0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
9900: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9910: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9920: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9930: 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66  PRINTF("Successf
9940: 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69  ully selected fi
9950: 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  le");...return(C
9960: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
9970: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
9980: 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20  SIS. *     void 
9990: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
99a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
99b0: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b  v_entity *root);
99c0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
99d0: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
99e0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
99f0: 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20   *root. *       
9a00: 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c    Root of the TL
9a10: 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20  V list to start 
9a20: 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45  freeing. *. * RE
9a30: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
9a40: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54    None. *. * NOT
9a50: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
9a60: 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68  unction frees th
9a70: 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73  e TLV linked lis
9a80: 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f  ted returned fro
9a90: 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79  m. *     "cackey
9aa0: 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a  _read_tlv". *. *
9ab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
9ac0: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
9ad0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
9ae0: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a  entity *root) {.
9af0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
9b00: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c  lv_entity *curr,
9b10: 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f   *next;...if (ro
9b20: 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
9b30: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
9b40: 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63   (curr = root; c
9b50: 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74  urr; curr = next
9b60: 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72  ) {...next = cur
9b70: 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69  r->_next;....swi
9b80: 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20  tch (curr->tag) 
9b90: 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  {....case GSCIS_
9ba0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
9bb0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
9bc0: 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09  _CERTIFICATE:...
9bd0: 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75  ..if (curr->valu
9be0: 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
9bf0: 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09  urr->value);....
9c00: 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
9c10: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
9c20: 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20  CARDURL:.....if 
9c30: 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  (curr->value_car
9c40: 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65  durl) {......fre
9c50: 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  e(curr->value_ca
9c60: 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09  rdurl);.....}...
9c70: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
9c80: 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a  free(curr);..}..
9c90: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
9ca0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
9cb0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
9cc0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
9cd0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
9ce0: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
9cf0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
9d00: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
9d10: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
9d20: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61  y_tlv_entity *ca
9d30: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74  ckey_read_tlv(st
9d40: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9d50: 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63   *slot) {..struc
9d60: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
9d70: 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79  ity *curr_entity
9d80: 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20  , *root = NULL, 
9d90: 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75  *last = NULL;..u
9da0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65  nsigned char tle
9db0: 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62  n_buf[2], tval_b
9dc0: 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b  uf[1024], *tval;
9dd0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
9de0: 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61  vlen_buf[2], vva
9df0: 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76  l_buf[8192], *vv
9e00: 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  al;..unsigned ch
9e10: 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 73 73 69  ar *tmpbuf;..ssi
9e20: 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b  ze_t tlen, vlen;
9e30: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
9e40: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73  et;..size_t offs
9e50: 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74  et_t = 0, offset
9e60: 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  _v = 0;..unsigne
9e70: 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a  d char tag;..siz
9e80: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64  e_t length;.#ifd
9e90: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 75 4c  ef HAVE_LIBZ..uL
9ea0: 6f 6e 67 66 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  ongf tmpbuflen;.
9eb0: 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
9ec0: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
9ed0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9ee0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
9ef0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
9f00: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
9f10: 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, tlen_buf, si
9f20: 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20  zeof(tlen_buf), 
9f30: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69  1, offset_t);..i
9f40: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
9f50: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29  izeof(tlen_buf))
9f60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
9f70: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
9f80: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
9f90: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
9fa0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
9fb0: 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65  .}...tlen = (tle
9fc0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
9fd0: 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   tlen_buf[0];...
9fe0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
9ff0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
a000: 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, vlen_buf, si
a010: 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20  zeof(vlen_buf), 
a020: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69  2, offset_v);..i
a030: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
a040: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29  izeof(vlen_buf))
a050: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
a060: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
a070: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
a080: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
a090: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
a0a0: 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65  .}...vlen = (vle
a0b0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
a0c0: 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   vlen_buf[0];...
a0d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a0e0: 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20  NTF("Tag Length 
a0f0: 3d 20 25 69 2c 20 56 61 6c 75 65 20 4c 65 6e 67  = %i, Value Leng
a100: 74 68 20 3d 20 25 69 22 2c 20 74 6c 65 6e 2c 20  th = %i", tlen, 
a110: 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f  vlen);...offset_
a120: 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f  t += 2;..offset_
a130: 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c  v += 2;...if (tl
a140: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c  en > sizeof(tval
a150: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
a160: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a170: 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f  Tag length is to
a180: 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69  o large, returni
a190: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
a1a0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
a1b0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20  ;..}...if (vlen 
a1c0: 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75  > sizeof(vval_bu
a1d0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
a1e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c  EBUG_PRINTF("Val
a1f0: 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ue length is too
a200: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
a210: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a220: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a230: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
a240: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
a250: 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62  fer(slot, tval_b
a260: 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66  uf, tlen, 1, off
a270: 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61  set_t);..if (rea
a280: 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b  d_ret != tlen) {
a290: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a2a0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
a2b0: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d  o read entire T-
a2c0: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
a2d0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a2e0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a2f0: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
a300: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
a310: 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62  fer(slot, vval_b
a320: 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66  uf, vlen, 2, off
a330: 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61  set_v);..if (rea
a340: 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b  d_ret != vlen) {
a350: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a360: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
a370: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d  o read entire V-
a380: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
a390: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a3a0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a3b0: 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61  ..}...tval = tva
a3c0: 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76  l_buf;..vval = v
a3d0: 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20  val_buf;..while 
a3e0: 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65  (tlen > 0 && vle
a3f0: 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d  n > 0) {...tag =
a400: 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b   *tval;...tval++
a410: 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69  ;...tlen--;....i
a420: 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66  f (*tval == 0xff
a430: 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  ) {....length = 
a440: 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c  (tval[2] << 8) |
a450: 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61   tval[1];....tva
a460: 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20  l += 3;....tlen 
a470: 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  -= 3;...} else {
a480: 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76  ....length = *tv
a490: 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09  al;....tval++;..
a4a0: 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09  ..tlen--;...}...
a4b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a4c0: 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25  INTF("Tag: %s (%
a4d0: 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  02x)", CACKEY_DE
a4e0: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
a4f0: 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67  STR(tag), (unsig
a500: 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09  ned int) tag);..
a510: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a520: 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c  INTBUF("Value:",
a530: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
a540: 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
a550: 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20   NULL;...switch 
a560: 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  (tag) {....case 
a570: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
a580: 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  L:.....curr_enti
a590: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
a5a0: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
a5b0: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
a5c0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a5d0: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
a5e0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  f(*curr_entity->
a5f0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b  value_cardurl));
a600: 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ......memcpy(cur
a610: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
a620: 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76  cardurl->rid, vv
a630: 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72  al, 5);.....curr
a640: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
a650: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20  ardurl->apptype 
a660: 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63  = vval[5];.....c
a670: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
a680: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
a690: 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c  tid = (vval[6] <
a6a0: 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a  < 8) | vval[7];.
a6b0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a6c0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
a6d0: 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d  appid = (vval[8]
a6e0: 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d   << 8) | vval[9]
a6f0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
a700: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
a710: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a720: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
a730: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
a740: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
a750: 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f  TABLE:.....curr_
a760: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
a770: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
a780: 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75  ity));.....tmpbu
a790: 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74  f = malloc(lengt
a7a0: 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  h);......memcpy(
a7b0: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
a7c0: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72  ngth);......curr
a7d0: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
a7e0: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
a7f0: 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65  ity->length = le
a800: 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65  ngth;.....curr_e
a810: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74  ntity->value = t
a820: 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f  mpbuf;.....curr_
a830: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
a840: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
a850: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
a860: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
a870: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a880: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
a890: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
a8a0: 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
a8b0: 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09  = length * 2;...
a8c0: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
a8d0: 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 23  c(tmpbuflen);..#
a8e0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
a8f0: 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72  ....uncompress_r
a900: 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28  et = uncompress(
a910: 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c  tmpbuf, &tmpbufl
a920: 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  en, vval, length
a930: 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  );.....if (uncom
a940: 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f  press_ret != Z_O
a950: 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  K) {......CACKEY
a960: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
a970: 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72  ailed to decompr
a980: 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28  ess, uncompress(
a990: 29 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d  ) returned %i --
a9a0: 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69   resorting to di
a9b0: 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f  rect copy", unco
a9c0: 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09  mpress_ret);....
a9d0: 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c  ...tmpbuflen = l
a9e0: 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63  ength;......memc
a9f0: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
aa00: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a   length);.....}.
aa10: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
aa20: 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f  G_PRINTBUF("Deco
aa30: 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74  mpressed to:", t
aa40: 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
aa50: 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43  );.#else.....CAC
aa60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
aa70: 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53  ("Missing ZLIB S
aa80: 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72  upport, this cer
aa90: 74 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65  tificate is like
aaa0: 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b  ly useless...");
aab0: 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
aac0: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65  = length;.....me
aad0: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
aae0: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64  l, length);.#end
aaf0: 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  if......curr_ent
ab00: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
ab10: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
ab20: 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66  >length = tmpbuf
ab30: 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  len;.....curr_en
ab40: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
ab50: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
ab60: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
ab70: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
ab80: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
ab90: 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63  AG_PKCS15:.....c
aba0: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
abb0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
abc0: 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  _entity));......
abd0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
abe0: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
abf0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62  _entity->value_b
ac00: 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09  yte = vval[0];..
ac10: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
ac20: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
ac30: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
ac40: 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b  .vval += length;
ac50: 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74  ...vlen -= lengt
ac60: 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65  h;....if (curr_e
ac70: 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b  ntity != NULL) {
ac80: 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ....if (root == 
ac90: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74  NULL) {.....root
aca0: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
acb0: 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73  ...}.....if (las
acc0: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t != NULL) {....
acd0: 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63  .last->_next = c
ace0: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d  urr_entity;....}
acf0: 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72  .....last = curr
ad00: 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a  _entity;...}..}.
ad10: 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a  ..return(root);.
ad20: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
ad30: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ad40: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
ad50: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
ad60: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
ad70: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
ad80: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ad90: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
ada0: 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
adb0: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
adc0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73  pcsc_identity *s
add0: 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75  tart, size_t cou
ade0: 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61  nt, int free_sta
adf0: 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64  rt) {..size_t id
ae00: 78 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  x;...for (idx = 
ae10: 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20  0; idx < count; 
ae20: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73  idx++) {...if (s
ae30: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
ae40: 69 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65  icate) {....free
ae50: 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74  (start[idx].cert
ae60: 69 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d  ificate);...}..}
ae70: 0a 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72  ...if (free_star
ae80: 74 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72  t) {...free(star
ae90: 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b  t);..}...return;
aea0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
aeb0: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
aec0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
aed0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
aee0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
aef0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
af00: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
af10: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  . */.static stru
af20: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
af30: 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  dentity *cackey_
af40: 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63  read_certs(struc
af50: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
af60: 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
af70: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
af80: 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65   *certs, unsigne
af90: 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b  d long *count) {
afa0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
afb0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
afc0: 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20  urr_id;..struct 
afd0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
afe0: 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63  y *ccc_tlv, *ccc
aff0: 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c  _curr, *app_tlv,
b000: 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73   *app_curr;..uns
b010: 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61  igned char ccc_a
b020: 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49  id[] = {GSCIS_AI
b030: 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65  D_CCC};..unsigne
b040: 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b  d char curr_aid[
b050: 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  7];..unsigned lo
b060: 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09  ng outidx = 0;..
b070: 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73  cackey_ret trans
b080: 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e 74  action_ret;..int
b090: 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65   certs_resizable
b0a0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c  ;..int send_ret,
b0b0: 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43   select_ret;...C
b0c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b0d0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
b0e0: 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55  .if (count == NU
b0f0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
b100: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75  EBUG_PRINTF("cou
b110: 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75  nt is NULL, retu
b120: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b130: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
b140: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65  LL);..}...if (ce
b150: 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts != NULL) {..
b160: 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30  .if (*count == 0
b170: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
b180: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
b190: 65 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20  ested we return 
b1a0: 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74  0 objects, short
b1b0: 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09  -circuit");.....
b1c0: 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09  return(certs);..
b1d0: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  .}..}.../* Begin
b1e0: 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 61   a SmartCard tra
b1f0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61  nsaction */..tra
b200: 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63  nsaction_ret = c
b210: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
b220: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09  saction(slot);..
b230: 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f  if (transaction_
b240: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
b250: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
b260: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b270: 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74  ("Unable begin t
b280: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
b290: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b2a0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
b2b0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65  LL);..}...if (ce
b2c0: 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
b2d0: 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28  .certs = malloc(
b2e0: 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
b2f0: 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20   5);...*count = 
b300: 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a  5;...certs_resiz
b310: 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73  able = 1;..} els
b320: 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69  e {...certs_resi
b330: 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  zable = 0;..}...
b340: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43 43  /* Select the CC
b350: 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e  C Applet */..sen
b360: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
b370: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
b380: 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65  t, ccc_aid, size
b390: 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69  of(ccc_aid));..i
b3a0: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
b3b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
b3c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
b3d0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
b3e0: 20 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41   to select CCC A
b3f0: 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67  pplet, returning
b400: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
b410: 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53  ../* Terminate S
b420: 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63  martCard Transac
b430: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
b440: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b450: 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72  (slot);....retur
b460: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
b470: 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70   Read all the ap
b480: 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43  plets from the C
b490: 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63 63  CC's TLV */..ccc
b4a0: 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65  _tlv = cackey_re
b4b0: 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09  ad_tlv(slot);...
b4c0: 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44  /* Look for CARD
b4d0: 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73  URLs that coores
b4e0: 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c  pond to PKI appl
b4f0: 65 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63 63  ets */..for (ccc
b500: 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b  _curr = ccc_tlv;
b510: 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63   ccc_curr; ccc_c
b520: 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e  urr = ccc_curr->
b530: 5f 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b 45  _next) {...CACKE
b540: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b550: 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e  Found tag: %s ..
b560: 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  . ", CACKEY_DEBU
b570: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
b580: 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29  R(ccc_curr->tag)
b590: 29 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63 75  );....if (ccc_cu
b5a0: 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
b5b0: 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a  _TAG_CARDURL) {.
b5c0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b5d0: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
b5e0: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
b5f0: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 41  ly care about CA
b600: 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 63  RDURLs)");.....c
b610: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
b620: 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76  if ((ccc_curr->v
b630: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
b640: 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54  ptype & CACKEY_T
b650: 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43  LV_APP_PKI) != C
b660: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
b670: 49 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  I) {....CACKEY_D
b680: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
b690: 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
b6a0: 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
b6b0: 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20  ut PKI applets, 
b6c0: 74 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70  this applet supp
b6d0: 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c  orts: %s/%02x)",
b6e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
b6f0: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
b700: 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  R(ccc_curr->valu
b710: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
b720: 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  pe), (unsigned i
b730: 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  nt) ccc_curr->va
b740: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b750: 74 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74 69  type);.....conti
b760: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  nue;...}....CACK
b770: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
b780: 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75  F("RID:", ccc_cu
b790: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b7a0: 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
b7b0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
b7c0: 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
b7d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b7e0: 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73  INTF("AppID = %s
b7f0: 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
b800: 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
b810: 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
b820: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
b830: 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e  >appid), (unsign
b840: 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
b850: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
b860: 2d 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43 4b  ->appid);...CACK
b870: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b880: 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25  "ObjectID = %s/%
b890: 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45  04lx", CACKEY_DE
b8a0: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
b8b0: 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
b8c0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
b8d0: 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67  bjectid), (unsig
b8e0: 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
b8f0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b900: 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09  l->objectid);...
b910: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64  .memcpy(curr_aid
b920: 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
b930: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
b940: 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
b950: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
b960: 72 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61 69  rid));...curr_ai
b970: 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
b980: 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63  d) - 2] = (ccc_c
b990: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
b9a0: 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20  rl->appid >> 8) 
b9b0: 26 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f 61  & 0xff;...curr_a
b9c0: 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
b9d0: 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63  id) - 1] = ccc_c
b9e0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
b9f0: 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66  rl->appid & 0xff
ba00: 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 66  ;..../* Select f
ba10: 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20  ound applet ... 
ba20: 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20  */...select_ret 
ba30: 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  = cackey_select_
ba40: 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72  applet(slot, cur
ba50: 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75  r_aid, sizeof(cu
ba60: 72 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28  rr_aid));...if (
ba70: 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41  select_ret != CA
ba80: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
ba90: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
baa0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
bab0: 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65   to select apple
bac0: 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63  t, skipping proc
bad0: 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  essing of this o
bae0: 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e  bject");.....con
baf0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  tinue;...}..../*
bb00: 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20   ... and object 
bb10: 28 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c 65  (file) */...sele
bb20: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
bb30: 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74  select_file(slot
bb40: 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
bb50: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
bb60: 74 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c 65  tid);...if (sele
bb70: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
bb80: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
bb90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bba0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
bbb0: 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69  select file, ski
bbc0: 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67  pping processing
bbd0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22   of this object"
bbe0: 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
bbf0: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63 65  ...}..../* Proce
bc00: 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54  ss this file's T
bc10: 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63  LV looking for c
bc20: 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
bc30: 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65  .app_tlv = cacke
bc40: 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29  y_read_tlv(slot)
bc50: 3b 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63 75  ;....for (app_cu
bc60: 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70  rr = app_tlv; ap
bc70: 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72  p_curr; app_curr
bc80: 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65   = app_curr->_ne
bc90: 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  xt) {....CACKEY_
bca0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
bcb0: 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41  und tag: %s", CA
bcc0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
bcd0: 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63  TAG_TO_STR(app_c
bce0: 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 69  urr->tag));....i
bcf0: 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  f (app_curr->tag
bd00: 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45   != GSCIS_TAG_CE
bd10: 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
bd20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bd30: 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
bd40: 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
bd50: 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54   care about CERT
bd60: 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09  IFICATEs)");....
bd70: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
bd80: 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26  .....curr_id = &
bd90: 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09  certs[outidx];..
bda0: 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09  ..outidx++;.....
bdb0: 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
bdc0: 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64  applet, curr_aid
bdd0: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  , sizeof(curr_id
bde0: 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 63  ->applet));....c
bdf0: 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20 63  urr_id->file = c
be00: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
be10: 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
be20: 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65  ;....curr_id->ke
be30: 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09  ysize = -1;.....
be40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
be50: 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72  NTF("Filling cur
be60: 72 5f 69 64 2d 3e 61 70 70 6c 65 74 20 28 25 70  r_id->applet (%p
be70: 29 20 77 69 74 68 20 25 6c 75 20 62 79 74 65 73  ) with %lu bytes
be80: 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 70  :", curr_id->app
be90: 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  let, (unsigned l
bea0: 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72  ong) sizeof(curr
beb0: 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09  _id->applet));..
bec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bed0: 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20  RINTBUF("VAL:", 
bee0: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c  curr_id->applet,
bef0: 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
bf00: 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 63  >applet));.....c
bf10: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
bf20: 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75  ate_len = app_cu
bf30: 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09  rr->length;.....
bf40: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
bf50: 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
bf60: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
bf70: 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  te_len);....memc
bf80: 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  py(curr_id->cert
bf90: 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72  ificate, app_cur
bfa0: 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69  r->value, curr_i
bfb0: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
bfc0: 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74  en);.....if (out
bfd0: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
bfe0: 0a 09 09 09 09 69 66 20 28 63 65 72 74 73 5f 72  .....if (certs_r
bff0: 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09  esizable) {.....
c000: 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09  .*count *= 2;...
c010: 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
c020: 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
c030: 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
c040: 6e 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  nt));.....} else
c050: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
c060: 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ...}....}...}...
c070: 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
c080: 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 69 66  (app_tlv);....if
c090: 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75   (outidx >= *cou
c0a0: 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a  nt) {....break;.
c0b0: 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
c0c0: 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76  free_tlv(ccc_tlv
c0d0: 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75  );...*count = ou
c0e0: 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74  tidx;...if (cert
c0f0: 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09  s_resizable) {..
c100: 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63  .certs = realloc
c110: 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a  (certs, sizeof(*
c120: 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74  certs) * (*count
c130: 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d  ));..}.../* Term
c140: 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20  inate SmartCard 
c150: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
c160: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
c170: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
c180: 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d  return(certs);.}
c190: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
c1a0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
c1b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
c1c0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
c1d0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
c1e0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
c1f0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
c200: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
c210: 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  t cackey_signdec
c220: 72 79 70 74 28 73 74 72 75 63 74 20 63 61 63 6b  rypt(struct cack
c230: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73  ey_slot *slot, s
c240: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
c250: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
c260: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c270: 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c  buf, size_t bufl
c280: 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  en, unsigned cha
c290: 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f  r *outbuf, size_
c2a0: 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74  t outbuflen, int
c2b0: 20 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75   padInput, int u
c2c0: 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 75  npadOutput) {..u
c2d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
c2e0: 70 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c  pbuf, *tmpbuf_s,
c2f0: 20 2a 6f 75 74 62 75 66 5f 73 3b 0a 09 75 6e 73   *outbuf_s;..uns
c300: 69 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73  igned char bytes
c310: 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 75  _to_send, p1;..u
c320: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f  nsigned char blo
c330: 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  cktype;..cackey_
c340: 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75  ret send_ret;..u
c350: 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
c360: 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61  ;..ssize_t retva
c370: 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73  l = 0, unpadoffs
c380: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62  et;..size_t tmpb
c390: 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74  uflen, padlen, t
c3a0: 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e  mpoutbuflen;..in
c3b0: 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  t free_tmpbuf = 
c3c0: 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41  0;..int le;...CA
c3d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c3e0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
c3f0: 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c  if (slot == NULL
c400: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c410: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
c420: 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22  .  slot is NULL"
c430: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c440: 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d  ;..}...if (buf =
c450: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
c460: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c470: 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20  "Error.  buf is 
c480: 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
c490: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
c4a0: 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  outbuf == NULL) 
c4b0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c4c0: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
c4d0: 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22   outbuf is NULL"
c4e0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c4f0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74  ;..}...if (ident
c500: 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
c510: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c520: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
c530: 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29  entity is NULL")
c540: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
c550: 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  ..}...if (identi
c560: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
c570: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
c580: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c590: 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
c5a0: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
c5b0: 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
c5c0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c5d0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
c5e0: 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a  identity Key siz
c5f0: 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  e */..if (identi
c600: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
c610: 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20  y->keysize < 0) 
c620: 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63  {...identity->pc
c630: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
c640: 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b  size = x509_to_k
c650: 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d  eysize(identity-
c660: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
c670: 63 65 72 74 69 66 69 63 61 74 65 2c 20 69 64 65  certificate, ide
c680: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
c690: 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
c6a0: 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  e_len);..}.../* 
c6b0: 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b  Pad message to k
c6c0: 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28  ey size */..if (
c6d0: 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66  padInput) {...if
c6e0: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
c6f0: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
c700: 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20  ze > 0) {....if 
c710: 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74  (buflen != ident
c720: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
c730: 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09  ty->keysize) {..
c740: 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20  ...if (buflen > 
c750: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
c760: 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
c770: 65 20 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43  e + 3)) {......C
c780: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c790: 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73  TF("Error.  Mess
c7a0: 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
c7b0: 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74   to sign/decrypt
c7c0: 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  ");.......return
c7d0: 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  (-1);.....}.....
c7e0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65  .tmpbuflen = ide
c7f0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
c800: 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09  tity->keysize;..
c810: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
c820: 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09  oc(tmpbuflen);..
c830: 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
c840: 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20   1;......padlen 
c850: 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75  = tmpbuflen - bu
c860: 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f  flen - 3;....../
c870: 2a 20 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53  * RSA PKCS#1 EMS
c880: 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64  A-PKCS1-v1_5 Pad
c890: 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62  ding */.....tmpb
c8a0: 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09  uf[0] = 0x00;...
c8b0: 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78  ..tmpbuf[1] = 0x
c8c0: 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26  01;.....memset(&
c8d0: 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c  tmpbuf[2], 0xFF,
c8e0: 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d   padlen);.....tm
c8f0: 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d  pbuf[padlen + 2]
c900: 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63  = 0x00;.....memc
c910: 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65  py(&tmpbuf[padle
c920: 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66  n + 3], buf, buf
c930: 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  len);......CACKE
c940: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
c950: 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75  ("Unpadded:", bu
c960: 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
c970: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c980: 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c  NTBUF("Padded:",
c990: 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
c9a0: 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  en);....} else {
c9b0: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75  .....tmpbuf = bu
c9c0: 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  f;.....tmpbuflen
c9d0: 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66   = buflen;.....f
c9e0: 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
c9f0: 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ....padlen = 0;.
ca00: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
ca10: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ca20: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
ca30: 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20  o determine key 
ca40: 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65  size, hoping the
ca50: 20 6d 65 73 73 61 67 65 20 69 73 20 70 72 6f 70   message is prop
ca60: 65 72 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a  erly padded!");.
ca70: 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  ....tmpbuf = buf
ca80: 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  ;....tmpbuflen =
ca90: 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65   buflen;....free
caa0: 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09  _tmpbuf = 0;....
cab0: 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a  padlen = 0;...}.
cac0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62  .} else {...tmpb
cad0: 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62  uf = buf;...tmpb
cae0: 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
caf0: 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
cb00: 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  0;...padlen = 0;
cb10: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74  ..}.../* Begin t
cb20: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
cb30: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
cb40: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
cb50: 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65  ./* Select corre
cb60: 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41  ct applet */..CA
cb70: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cb80: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70  F("Selecting app
cb90: 6c 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20  let found at %p 
cba0: 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e  ...", identity->
cbb0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61  pcsc_identity->a
cbc0: 70 70 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f  pplet);..cackey_
cbd0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
cbe0: 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
cbf0: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
cc00: 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e  let, sizeof(iden
cc10: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
cc20: 69 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a  ity->applet));..
cc30: 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65  ./* Select corre
cc40: 63 74 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b  ct file */..cack
cc50: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
cc60: 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
cc70: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69  csc_identity->fi
cc80: 6c 65 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20  le);...tmpbuf_s 
cc90: 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75  = tmpbuf;..outbu
cca0: 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77  f_s = outbuf;..w
ccb0: 68 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29  hile (tmpbuflen)
ccc0: 20 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c   {...if (tmpbufl
ccd0: 65 6e 20 3e 20 32 34 35 29 20 7b 0a 09 09 09 62  en > 245) {....b
cce0: 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 32  ytes_to_send = 2
ccf0: 34 35 3b 0a 09 09 09 70 31 20 3d 20 30 78 38 30  45;....p1 = 0x80
cd00: 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  ;....le = 0x00;.
cd10: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79  ..} else {....by
cd20: 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d  tes_to_send = tm
cd30: 70 62 75 66 6c 65 6e 3b 0a 09 09 09 70 31 20 3d  pbuflen;....p1 =
cd40: 20 30 78 30 30 3b 0a 09 09 09 6c 65 20 3d 20 30   0x00;....le = 0
cd50: 78 30 30 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 6f  x00;...}....tmpo
cd60: 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75  utbuflen = outbu
cd70: 66 6c 65 6e 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  flen;....send_re
cd80: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
cd90: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
cda0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
cdb0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
cdc0: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c  STR_SIGNDECRYPT,
cdd0: 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73   p1, 0x00, bytes
cde0: 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66  _to_send, tmpbuf
cdf0: 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c  , le, &respcode,
ce00: 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74   outbuf, &tmpout
ce10: 62 75 66 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73  buflen);...if (s
ce20: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
ce30: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
ce40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ce50: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
ce60: 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
ce70: 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
ce80: 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73  .");.....if (res
ce90: 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 29  pcode == 0x6982)
cea0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
ceb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75  BUG_PRINTF("Secu
cec0: 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20  rity status not 
ced0: 73 61 74 69 73 69 66 69 65 64 2e 22 29 3b 0a 09  satisified.");..
cee0: 09 09 7d 0a 0a 09 09 09 69 66 20 28 66 72 65 65  ..}.....if (free
cef0: 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69  _tmpbuf) {.....i
cf00: 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09  f (tmpbuf_s) {..
cf10: 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f  ....free(tmpbuf_
cf20: 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  s);.....}....}..
cf30: 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61  .../* End transa
cf40: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ction */....cack
cf50: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
cf60: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65  on(slot);.....re
cf70: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
cf80: 09 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73  .tmpbuf += bytes
cf90: 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62  _to_send;...tmpb
cfa0: 75 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74  uflen -= bytes_t
cfb0: 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75  o_send;....outbu
cfc0: 66 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  f += tmpoutbufle
cfd0: 6e 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d  n;...outbuflen -
cfe0: 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a  = tmpoutbuflen;.
cff0: 09 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f  ..retval += tmpo
d000: 75 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69  utbuflen;..}...i
d010: 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20  f (free_tmpbuf) 
d020: 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73  {...if (tmpbuf_s
d030: 29 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62  ) {....free(tmpb
d040: 75 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  uf_s);...}..}...
d050: 6f 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f  outbuf = outbuf_
d060: 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e  s;.../* End tran
d070: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b  saction */..cack
d080: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
d090: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65  on(slot);..#ifde
d0a0: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
d0b0: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
d0c0: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
d0d0: 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f  (outbuflen > _PO
d0e0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
d0f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d100: 50 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65  PRINTF("Outbufle
d110: 6e 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  n exceeds maximu
d120: 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
d130: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
d140: 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75  max = %li, outbu
d150: 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c  flen = %lu)", (l
d160: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
d170: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
d180: 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e   long) outbuflen
d190: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
d1a0: 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
d1b0: 6e 64 69 66 0a 0a 09 2f 2a 20 55 6e 70 61 64 20  ndif.../* Unpad 
d1c0: 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e  reply */..if (un
d1d0: 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69  padOutput) {...i
d1e0: 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b  f (retval < 3) {
d1f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d200: 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69  _PRINTF("Reply i
d210: 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20  s too small, we 
d220: 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20  are not able to 
d230: 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67  unpad -- passing
d240: 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67   back and hoping
d250: 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29   for the best!")
d260: 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
d270: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
d280: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
d290: 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
d2a0: 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
d2b0: 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72  etval);....retur
d2c0: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a  n(retval);...}..
d2d0: 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20  ..if (outbuf[0] 
d2e0: 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41  != 0x00) {....CA
d2f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d300: 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20  F("Unrecognized 
d310: 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d  padding scheme -
d320: 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
d330: 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
d340: 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
d350: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d360: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
d370: 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
d380: 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
d390: 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
d3a0: 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
d3b0: 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b  l);...}....block
d3c0: 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d  type = outbuf[1]
d3d0: 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20  ;...unpadoffset 
d3e0: 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  = 0;....switch (
d3f0: 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09  blocktype) {....
d400: 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f  case 0x00:...../
d410: 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
d420: 20 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f   1, the first no
d430: 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74  n-zero byte is t
d440: 68 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61  he start of data
d450: 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70   */.....for (unp
d460: 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e  adoffset = 2; un
d470: 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76  padoffset < retv
d480: 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b  al; unpadoffset+
d490: 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75  +) {......if (ou
d4a0: 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
d4b0: 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] != 0x00) {....
d4c0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
d4d0: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
d4e0: 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a  ;....case 0x01:.
d4f0: 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53  ..../* Padding S
d500: 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74  cheme 2, pad byt
d510: 65 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c  es are 0xFF foll
d520: 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a  owed by 0x00 */.
d530: 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
d540: 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
d550: 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
d560: 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
d570: 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
d580: 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
d590: 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69   0xFF) {.......i
d5a0: 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
d5b0: 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20  ffset] == 0x00) 
d5c0: 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66  {........unpadof
d5d0: 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09  fset++;.........
d5e0: 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65  break;.......} e
d5f0: 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43  lse {........CAC
d600: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d610: 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
d620: 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
d630: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
d640: 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
d650: 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20  been 0x00 found 
d660: 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
d670: 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
d680: 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
d690: 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
d6a0: 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
d6b0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41   else {.......CA
d6c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d6d0: 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69  F("Invalid paddi
d6e0: 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72  ng data found, r
d6f0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d700: 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65  ure, should have
d710: 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64   been 0xFF found
d720: 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67   0x%02x", (unsig
d730: 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b  ned int) outbuf[
d740: 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a  unpadoffset]);..
d750: 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
d760: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
d770: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
d780: 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50  e 0x02:...../* P
d790: 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c  adding Scheme 3,
d7a0: 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e   pad bytes are n
d7b0: 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65  on-zero first ze
d7c0: 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73  ro byte found is
d7d0: 20 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62   the seperator b
d7e0: 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  yte */.....for (
d7f0: 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
d800: 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
d810: 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
d820: 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
d830: 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
d840: 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
d850: 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65  ......unpadoffse
d860: 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  t++;........brea
d870: 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
d880: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
d890: 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65  ..if (unpadoffse
d8a0: 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09  t > retval) {...
d8b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d8c0: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65  INTF("Offset gre
d8d0: 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20  ater than reply 
d8e0: 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20  size, aborting. 
d8f0: 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
d900: 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  %lu, retval = %l
d910: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
d920: 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74  ong) unpadoffset
d930: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
d940: 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  ) retval);.....r
d950: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
d960: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d970: 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
d980: 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
d990: 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d  l);....retval -=
d9a0: 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09   unpadoffset;...
d9b0: 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20  memmove(outbuf, 
d9c0: 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66  outbuf + unpadof
d9d0: 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  fset, retval);..
d9e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d9f0: 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65  RINTBUF("Unpadde
da00: 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74  d:", outbuf, ret
da10: 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b  val);..}....CACK
da20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
da30: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
da40: 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
da50: 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
da60: 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ong) retval);...
da70: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
da80: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
da90: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
daa0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
dab0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
dac0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
dad0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
dae0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
daf0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
db00: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67  y_ret cackey_log
db10: 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  in(struct cackey
db20: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
db30: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c  igned char *pin,
db40: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70   unsigned long p
db50: 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69  in_len, int *tri
db60: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
db70: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
db80: 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30   cac_pin[8] = {0
db90: 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
dba0: 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
dbb0: 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a  F, 0xFF, 0xFF};.
dbc0: 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e  .uint16_t respon
dbd0: 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72  se_code;..int tr
dbe0: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09  ies_remaining;..
dbf0: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
dc00: 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  /* Indicate that
dc10: 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   we do not know 
dc20: 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74  about how many t
dc30: 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69  ries are remaini
dc40: 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73  ng */..if (tries
dc50: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
dc60: 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ..*tries_remaini
dc70: 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09  ng_p = -1;..}...
dc80: 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43  /* Apparently, C
dc90: 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41  AC PINs are *EXA
dca0: 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f  CTLY* 8 bytes lo
dcb0: 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30  ng -- pad with 0
dcc0: 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74  xFF if too short
dcd0: 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e   */..if (pin_len
dce0: 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70   >= 8) {...memcp
dcf0: 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20  y(cac_pin, pin, 
dd00: 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  8);..} else {...
dd10: 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20  memcpy(cac_pin, 
dd20: 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09  pin, pin_len);..
dd30: 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e  }.../* Issue PIN
dd40: 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64   Verify */..send
dd50: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
dd60: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
dd70: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
dd80: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  6, GSCIS_INSTR_V
dd90: 45 52 49 46 59 2c 20 30 78 30 30 2c 20 30 78 30  ERIFY, 0x00, 0x0
dda0: 30 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69  0, sizeof(cac_pi
ddb0: 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30  n), cac_pin, 0x0
ddc0: 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64  0, &response_cod
ddd0: 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  e, NULL, NULL);.
dde0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
ddf0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
de00: 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70  K) {...if ((resp
de10: 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33  onse_code & 0x63
de20: 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b  C0) == 0x63C0) {
de30: 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e  ....tries_remain
de40: 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f  ing = (response_
de50: 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09  code & 0xF);....
de60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
de70: 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69  INTF("PIN Verifi
de80: 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25  cation failed, %
de90: 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e  i tries remainin
dea0: 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  g", tries_remain
deb0: 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72  ing);.....if (tr
dec0: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
ded0: 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65   {.....*tries_re
dee0: 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65  maining_p = trie
def0: 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09  s_remaining;....
df00: 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  }.....return(CAC
df10: 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
df20: 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72  N);...}....if (r
df30: 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20  esponse_code == 
df40: 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43  0x6983) {....CAC
df50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
df60: 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
df70: 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63  on failed, devic
df80: 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a  e is locked");..
df90: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
dfa0: 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b  _PCSC_E_LOCKED);
dfb0: 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43  ...}....return(C
dfc0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
dfd0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
dfe0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
dff0: 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f  "PIN Verificatio
e000: 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a  n succeeded");..
e010: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
e020: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
e030: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
e040: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
e050: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
e060: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
e070: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
e080: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
e090: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
e0a0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
e0b0: 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72   cackey_token_pr
e0c0: 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61 63  esent(struct cac
e0d0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
e0e0: 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63  {..cackey_ret pc
e0f0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a  sc_connect_ret;.
e100: 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65  .DWORD reader_le
e110: 6e 2c 20 73 74 61 74 65 2c 20 70 72 6f 74 6f 63  n, state, protoc
e120: 6f 6c 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59  ol, atr_len;..BY
e130: 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53  TE atr[MAX_ATR_S
e140: 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74  IZE];..LONG stat
e150: 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65  us_ret, scard_re
e160: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
e170: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e180: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 70 63  "Called.");...pc
e190: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
e1a0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
e1b0: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
e1c0: 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
e1d0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
e1e0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
e1f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e200: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
e210: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
e220: 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
e230: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  t");....return(C
e240: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
e250: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  ENABSENT);..}...
e260: 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  atr_len = sizeof
e270: 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72  (atr);..status_r
e280: 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
e290: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
e2a0: 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
e2b0: 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
e2c0: 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
e2d0: 72 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 74 61  r_len);..if (sta
e2e0: 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  tus_ret != SCARD
e2f0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
e300: 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74  slot->slot_reset
e310: 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 6f   = 1;...slot->to
e320: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
e330: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
e340: 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
e350: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
e360: 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
e370: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e380: 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
e390: 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
e3a0: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
e3b0: 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  econn_ret = SCar
e3c0: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
e3d0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
e3e0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
e3f0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
e400: 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  0, SCARD_RESET_C
e410: 41 52 44 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ARD, &protocol);
e420: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
e430: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
e440: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
e450: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69  .../* Re-establi
e460: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  sh transaction, 
e470: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e  if it was presen
e480: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f  t */.....if (slo
e490: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
e4a0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
e4b0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
e4c0: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09  on_depth--;.....
e4d0: 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
e4e0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
e4f0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
e500: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e510: 22 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75  "Reset successfu
e520: 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b  l, requerying");
e530: 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65 74 20  .....status_ret 
e540: 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
e550: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e  ot->pcsc_card, N
e560: 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e  ULL, &reader_len
e570: 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f  , &state, &proto
e580: 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c  col, atr, &atr_l
e590: 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61  en);.....if (sta
e5a0: 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  tus_ret != SCARD
e5b0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
e5c0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e5d0: 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e  PRINTF("Still un
e5e0: 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61  able to query ca
e5f0: 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72  rd status, retur
e600: 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
e610: 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28  t.  SCardStatus(
e620: 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ) = %s", CACKEY_
e630: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
e640: 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75  ERR_TO_STR(statu
e650: 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72  s_ret));.......r
e660: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
e670: 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_S_TOKENABSENT)
e680: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
e690: 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
e6a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
e6b0: 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74  ble to reconnect
e6c0: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
e6d0: 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
e6e0: 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  .  SCardReconnec
e6f0: 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  t() = %s", CACKE
e700: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
e710: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
e720: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b  rd_reconn_ret));
e730: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
e740: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
e750: 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09  ABSENT);....}...
e760: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
e770: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e780: 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79  "Unable to query
e790: 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
e7a0: 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
e7b0: 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
e7c0: 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
e7d0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
e7e0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
e7f0: 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
e800: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
e810: 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_S_TOKENABSENT
e820: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
e830: 28 73 74 61 74 65 20 26 20 53 43 41 52 44 5f 41  (state & SCARD_A
e840: 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f  BSENT) == SCARD_
e850: 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  ABSENT) {...CACK
e860: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e870: 22 43 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c  "Card is absent,
e880: 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
e890: 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65   absent");....re
e8a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e8b0: 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _S_TOKENABSENT);
e8c0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
e8d0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
e8e0: 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65  ning token prese
e8f0: 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  nt.");...return(
e900: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
e910: 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a  KENPRESENT);.}..
e920: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
e930: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
e940: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
e950: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
e960: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
e970: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
e980: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
e990: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
e9a0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
e9b0: 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74  tity_to_label(st
e9c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
e9d0: 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
e9e0: 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
e9f0: 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75  ar *label_buf, u
ea00: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62  nsigned long lab
ea10: 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75  el_buf_len) {..u
ea20: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
ea30: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63  tificate_len;..c
ea40: 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b  har *label_asn1;
ea50: 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63  ..void *certific
ea60: 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72  ate;..int x509_r
ea70: 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69  ead_ret;...certi
ea80: 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
ea90: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
eaa0: 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
eab0: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
eac0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
ead0: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
eae0: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  len < 0) {...ret
eaf0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35  urn(-1);..}...x5
eb00: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
eb10: 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
eb20: 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
eb30: 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69  ficate_len, (voi
eb40: 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e  d **) &label_asn
eb50: 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  1);..if (x509_re
eb60: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
eb70: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
eb80: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
eb90: 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
eba0: 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
ebb0: 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
ebc0: 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
ebd0: 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
ebe0: 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30   "CN");..if (x50
ebf0: 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
ec00: 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72   {...x509_read_r
ec10: 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
ec20: 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
ec30: 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
ec40: 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
ec50: 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
ec60: 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69  len, NULL);....i
ec70: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
ec80: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   <= 0) {....retu
ec90: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
eca0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
ecb0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
ecc0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
ecd0: 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
ece0: 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  ret > _POSIX_SSI
ecf0: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
ed00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ed10: 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65  "x509_read_ret e
ed20: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
ed30: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
ed40: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
ed50: 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61   = %li, x509_rea
ed60: 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  d_ret = %lu)", (
ed70: 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
ed80: 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
ed90: 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61  d long) x509_rea
eda0: 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  d_ret);....retur
edb0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
edc0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  if.#endif...retu
edd0: 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  rn(x509_read_ret
ede0: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
edf0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
ee00: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
ee10: 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
ee20: 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a  void **mutex) {.
ee30: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
ee40: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
ee50: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
ee60: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
ee70: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
ee80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ee90: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
eea0: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
eeb0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
eec0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
eed0: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
eee0: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
eef0: 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tex = malloc(siz
ef00: 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74  eof(*pthread_mut
ef10: 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68  ex));...if (!pth
ef20: 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09  read_mutex) {...
ef30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ef40: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
ef50: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e  allocate memory.
ef60: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
ef70: 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65  1);...}....pthre
ef80: 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
ef90: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70  ead_mutex_init(p
efa0: 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55  thread_mutex, NU
efb0: 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  LL);...if (pthre
efc0: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
efd0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
efe0: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
eff0: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72  d_mutex_init() r
f000: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
f010: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
f020: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
f030: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d  n(-1);...}....*m
f040: 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d  utex = pthread_m
f050: 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  utex;..} else {.
f060: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
f070: 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b  s.CreateMutex) {
f080: 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
f090: 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
f0a0: 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65  CreateMutex(mute
f0b0: 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
f0c0: 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
f0d0: 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
f0e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f0f0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
f100: 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  teMutex() return
f110: 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
f120: 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
f130: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
f140: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
f150: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
f160: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
f170: 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
f180: 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
f190: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
f1a0: 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
f1b0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
f1c0: 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
f1d0: 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
f1e0: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
f1f0: 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
f200: 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
f210: 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
f220: 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
f230: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f240: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
f250: 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
f260: 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
f270: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
f280: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
f290: 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
f2a0: 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
f2b0: 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
f2c0: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
f2d0: 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74  lock(pthread_mut
f2e0: 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  ex);...if (pthre
f2f0: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
f300: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
f310: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
f320: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72  d_mutex_lock() r
f330: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
f340: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
f350: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
f360: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n(-1);...}..} el
f370: 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
f380: 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
f390: 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
f3a0: 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
f3b0: 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  gs.LockMutex(mut
f3c0: 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
f3d0: 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
f3e0: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
f3f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f400: 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  "cackey_args.Loc
f410: 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
f420: 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
f430: 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
f440: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
f450: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
f460: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
f470: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
f480: 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
f490: 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
f4a0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
f4b0: 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
f4c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
f4d0: 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
f4e0: 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
f4f0: 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
f500: 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
f510: 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
f520: 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
f530: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
f540: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f550: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
f560: 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
f570: 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
f580: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
f590: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
f5a0: 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
f5b0: 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
f5c0: 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
f5d0: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
f5e0: 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  _unlock(pthread_
f5f0: 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
f600: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
f610: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
f620: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
f630: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
f640: 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
f650: 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
f660: 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
f670: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
f680: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
f690: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
f6a0: 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
f6b0: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
f6c0: 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
f6d0: 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
f6e0: 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
f6f0: 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
f700: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f710: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
f720: 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
f730: 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
f740: 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
f750: 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
f760: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
f770: 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
f780: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f790: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
f7a0: 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
f7b0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
f7c0: 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54  .}..static CK_AT
f7d0: 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b  TRIBUTE_PTR cack
f7e0: 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
f7f0: 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  s(CK_OBJECT_CLAS
f800: 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73  S objectclass, s
f810: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
f820: 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
f830: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c  tity, unsigned l
f840: 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ong identity_num
f850: 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
f860: 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74  ulCount) {..stat
f870: 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74  ic CK_BBOOL ck_t
f880: 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63  rue = 1;..static
f890: 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c   CK_BBOOL ck_fal
f8a0: 73 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e  se = 0;..CK_ULON
f8b0: 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20  G numattrs = 0, 
f8c0: 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43  retval_count;..C
f8d0: 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
f8e0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
f8f0: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63  ..CK_ATTRIBUTE c
f900: 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61  urr_attr, *retva
f910: 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  l;..CK_VOID_PTR 
f920: 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
f930: 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43  G ulValueLen;..C
f940: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63  K_OBJECT_CLASS c
f950: 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
f960: 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  .CK_CERTIFICATE_
f970: 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63  TYPE ck_certific
f980: 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45  ate_type;..CK_KE
f990: 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79  Y_TYPE ck_key_ty
f9a0: 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52  pe;..CK_UTF8CHAR
f9b0: 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b   ucTmpBuf[1024];
f9c0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
f9d0: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73  *certificate;..s
f9e0: 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
f9f0: 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30  te_len = -1, x50
fa00: 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74  9_read_ret;..int
fa10: 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09   pValue_free;...
fa20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
fa30: 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a  NTF("Called (obj
fa40: 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20  ectClass = %lu, 
fa50: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25  identity_num = %
fa60: 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
fa70: 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61   long) objectcla
fa80: 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ss, identity_num
fa90: 29 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63  );...if (objectc
faa0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
fab0: 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
fac0: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
fad0: 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65  BLIC_KEY && obje
fae0: 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
faf0: 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
fb00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
fb10: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
fb20: 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
fb30: 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20   invalid object 
fb40: 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75  class");....retu
fb50: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
fb60: 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69  * Get Cert */..i
fb70: 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
fb80: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
fb90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
fba0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
fbb0: 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
fbc0: 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64  d identiy provid
fbd0: 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ed");....return(
fbe0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74  NULL);..}...cert
fbf0: 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
fc00: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
fc10: 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
fc20: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
fc30: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
fc40: 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
fc50: 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65  _len == -1 || ce
fc60: 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c  rtificate == NUL
fc70: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
fc80: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
fc90: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
fca0: 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65  (NULL), this ide
fcb0: 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68  ntity does not h
fcc0: 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72  ave an X.509 cer
fcd0: 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
fce0: 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20  ted with it and 
fcf0: 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b  will not work");
fd00: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
fd10: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
fd20: 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74   that certificat
fd30: 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64  e is ASN.1 encod
fd40: 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  ed X.509 certifi
fd50: 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30  cate */..if (x50
fd60: 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
fd70: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
fd80: 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20  cate_len, NULL) 
fd90: 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 0) {...CACKEY_
fda0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
fdb0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
fdc0: 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e  s (NULL), the X.
fdd0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
fde0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
fdf0: 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73  this identity is
fe00: 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09   not valid");...
fe10: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
fe20: 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74  }...retval_count
fe30: 20 3d 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d   = 16;..retval =
fe40: 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63   malloc(retval_c
fe50: 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
fe60: 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28  etval));...for (
fe70: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
fe80: 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79   0; curr_attr_ty
fe90: 70 65 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b  pe < 0xce53635f;
fea0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b   curr_attr_type+
feb0: 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f  +) {...if (curr_
fec0: 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38  attr_type == 0x8
fed0: 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74  00) {....curr_at
fee0: 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33  tr_type = 0xce53
fef0: 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61  6300;...}....pVa
ff00: 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09  lue_free = 0;...
ff10: 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
ff20: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
ff30: 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73  K_LONG) -1;....s
ff40: 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72  witch (curr_attr
ff50: 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
ff60: 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09   CKA_CLASS:.....
ff70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ff80: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
ff90: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c  attribute CKA_CL
ffa0: 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASS (0x%08lx) ..
ffb0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
ffc0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
ffd0: 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a  pe);......ck_obj
ffe0: 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65  ect_class = obje
fff0: 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56  ctclass;......pV
10000 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63  alue = &ck_objec
10010 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56  t_class;.....ulV
10020 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
10030 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  (ck_object_class
10040 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
10050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
10060 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
10070 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
10080 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
10090 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29  _OBJECT_CLASS *)
100a0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
100b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
100c0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
100d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
100e0 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
100f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10100 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
10110 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
10120 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20  TOKEN (0x%08lx) 
10130 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
10140 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
10150 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
10160 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
10170 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
10180 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
10190 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
101a0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
101b0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
101c0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
101d0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
101e0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
101f0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
10200 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
10210 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
10220 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
10230 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41  DIFIABLE:.....CA
10240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10250 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
10260 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49  tribute CKA_MODI
10270 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  FIABLE (0x%08lx)
10280 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
10290 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
102a0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
102b0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
102c0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
102d0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
102e0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
102f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
10300 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
10310 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
10320 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
10330 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
10340 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
10350 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
10360 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
10370 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
10380 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b  _LABEL:.....CACK
10390 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
103a0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
103b0 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20  ibute CKA_LABEL 
103c0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
103d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
103e0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
103f0 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65  ....../* XXX: De
10400 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a  termine name */.
10410 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
10420 20 73 6e 70 72 69 6e 74 66 28 75 63 54 6d 70 42   snprintf(ucTmpB
10430 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d 70  uf, sizeof(ucTmp
10440 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74 79 20  Buf), "Identity 
10450 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  #%lu", (unsigned
10460 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
10470 6e 75 6d 29 3b 0a 09 09 09 09 70 56 61 6c 75 65  num);.....pValue
10480 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09   = ucTmpBuf;....
10490 09 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e  ..if (ulValueLen
104a0 20 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70   >= sizeof(ucTmp
104b0 42 75 66 29 29 20 7b 0a 09 09 09 09 09 75 6c 56  Buf)) {......ulV
104c0 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09  alueLen = 0;....
104d0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
104e0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
104f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10500 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
10510 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
10520 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10530 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10540 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10550 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09  ase CKA_VALUE:..
10560 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10570 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
10580 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
10590 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29  _VALUE (0x%08lx)
105a0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
105b0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
105c0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69  _type);......swi
105d0 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  tch (objectclass
105e0 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ) {......case CK
105f0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09  O_PRIVATE_KEY:..
10600 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10610 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
10620 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
10630 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
10640 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22   a private key."
10650 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
10660 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
10670 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09  UBLIC_KEY:......
10680 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f  ./* XXX: TODO */
10690 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
106a0 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52  ....case CKO_CER
106b0 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09  TIFICATE:.......
106c0 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69  pValue = certifi
106d0 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61  cate;.......ulVa
106e0 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69  lueLen = certifi
106f0 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09  cate_len;.......
10700 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
10710 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10720 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
10730 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
10740 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
10750 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
10760 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
10770 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53  ....case CKA_ISS
10780 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  UER:.....CACKEY_
10790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
107a0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
107b0 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30  te CKA_ISSUER (0
107c0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
107d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
107e0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
107f0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
10800 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
10810 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
10820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10830 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
10840 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
10850 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
10860 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
10870 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
10880 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
10890 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
108a0 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
108b0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
108c0 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69  o_issuer(certifi
108d0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
108e0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
108f0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
10900 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
10910 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
10920 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
10930 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
10940 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
10950 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
10960 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10970 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
10980 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
10990 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
109a0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
109b0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
109c0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
109d0 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09  SERIAL_NUMBER:..
109e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
109f0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
10a00 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
10a10 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28  _SERIAL_NUMBER (
10a20 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
10a30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
10a40 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
10a50 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
10a60 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
10a70 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
10a80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10a90 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
10aa0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
10ab0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
10ac0 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29  a certificate.")
10ad0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
10ae0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
10af0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
10b00 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
10b10 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
10b20 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
10b30 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
10b40 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
10b50 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
10b60 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
10b70 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
10b80 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
10b90 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
10ba0 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
10bb0 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
10bc0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
10bd0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
10be0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
10bf0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
10c00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
10c10 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
10c20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10c30 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09  KA_SUBJECT:.....
10c40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10c50 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
10c60 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55  attribute CKA_SU
10c70 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20  BJECT (0x%08lx) 
10c80 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
10c90 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
10ca0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
10cb0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
10cc0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
10cd0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
10ce0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
10cf0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
10d00 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
10d10 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
10d20 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
10d30 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
10d40 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
10d50 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
10d60 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
10d70 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
10d80 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
10d90 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
10da0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
10db0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
10dc0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
10dd0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
10de0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
10df0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
10e00 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
10e10 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
10e20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10e30 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
10e40 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
10e50 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
10e60 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
10e70 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10e80 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09  case CKA_ID:....
10e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10ea0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
10eb0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
10ec0 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  D (0x%08lx) ..."
10ed0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10ee0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
10ef0 29 3b 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66  );......ucTmpBuf
10f00 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79  [0] = ((identity
10f10 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20  _num + 1) >> 8) 
10f20 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d  & 0xff;.....ucTm
10f30 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e  pBuf[1] =  (iden
10f40 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20  tity_num + 1) & 
10f50 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75  0xff;......pValu
10f60 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09  e = &ucTmpBuf;..
10f70 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
10f80 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  2;......CACKEY_D
10f90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
10fa0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
10fb0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
10fc0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
10fd0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
10fe0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
10ff0 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
11000 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PE:.....CACKEY_D
11010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
11020 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
11030 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
11040 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29  E_TYPE (0x%08lx)
11050 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
11060 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
11070 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
11080 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
11090 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
110a0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
110b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
110c0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
110d0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
110e0 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
110f0 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09  icate.");.......
11100 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
11110 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70  ../* We only sup
11120 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69  port one certifi
11130 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09  cate type */....
11140 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f  .ck_certificate_
11150 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39  type = CKC_X_509
11160 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
11170 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f  &ck_certificate_
11180 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  type;.....ulValu
11190 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
111a0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
111b0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
111c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
111d0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43  .. returning CKC
111e0 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70  _X_509 (%lu) (%p
111f0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
11200 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45  d long) *((CK_CE
11210 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a  RTIFICATE_TYPE *
11220 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
11230 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
11240 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
11250 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
11260 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ase CKA_KEY_TYPE
11270 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
11280 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
11290 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
112a0 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78  CKA_KEY_TYPE (0x
112b0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
112c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
112d0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
112e0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
112f0 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss != CKO_PRIVAT
11300 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63  E_KEY && objectc
11310 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c  lass != CKO_PUBL
11320 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43  IC_KEY) {......C
11330 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11340 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
11350 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
11360 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
11370 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62   key.");.......b
11380 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
11390 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  ./* We only supp
113a0 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65  ort one key type
113b0 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74   */.....ck_key_t
113c0 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a  ype = CKK_RSA;..
113d0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
113e0 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75  _key_type;.....u
113f0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
11400 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b  of(ck_key_type);
11410 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11420 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
11430 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53  returning CKK_RS
11440 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29  A (%lu) (%p/%lu)
11450 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
11460 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49  g) *((CK_CERTIFI
11470 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61  CATE_TYPE *) pVa
11480 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
11490 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
114a0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
114b0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
114c0 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43  KA_SIGN:.....CAC
114d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
114e0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
114f0 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20  ribute CKA_SIGN 
11500 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
11510 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11520 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
11530 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
11540 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
11550 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
11560 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
11570 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
11580 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
11590 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
115a0 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
115b0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
115c0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
115d0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
115e0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
115f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11600 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
11610 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
11620 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
11630 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
11640 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
11650 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
11660 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
11670 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
11680 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
11690 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
116a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
116b0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
116c0 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
116d0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
116e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
116f0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
11700 3b 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72  ;....../* We cur
11710 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70  rently only supp
11720 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41  ort "Sign with A
11730 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09  ppendix" */.....
11740 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
11750 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
11760 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
11770 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
11780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11790 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
117a0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
117b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
117c0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
117d0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
117e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
117f0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
11800 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
11810 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09  CKA_DECRYPT:....
11820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11830 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
11840 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44   attribute CKA_D
11850 45 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29  ECRYPT (0x%08lx)
11860 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
11870 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
11880 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
11890 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
118a0 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
118b0 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  || objectclass =
118c0 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
118d0 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
118e0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
118f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
11900 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
11910 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
11920 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
11930 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
11940 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
11950 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
11960 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11970 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
11980 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
11990 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
119a0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
119b0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
119c0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
119d0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
119e0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
119f0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53  ...case CKA_SENS
11a00 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45  ITIVE:.....CACKE
11a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11a20 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
11a30 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49  bute CKA_SENSITI
11a40 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  VE (0x%08lx) ...
11a50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
11a60 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
11a70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
11a80 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
11a90 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
11aa0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
11ab0 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
11ac0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
11ad0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
11ae0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
11af0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
11b00 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
11b10 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
11b20 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
11b30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11b40 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
11b50 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
11b60 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11b70 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
11b80 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
11b90 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11ba0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
11bb0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
11bc0 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  se CKA_EXTRACTAB
11bd0 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  LE:.....CACKEY_D
11be0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
11bf0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
11c00 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
11c10 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
11c20 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11c30 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
11c40 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
11c50 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
11c60 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
11c70 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
11c80 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
11c90 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
11ca0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
11cb0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
11cc0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
11cd0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
11ce0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
11cf0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
11d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11d10 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
11d20 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
11d30 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11d40 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
11d50 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
11d60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11d70 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
11d80 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
11d90 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
11da0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11db0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
11dc0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
11dd0 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c  _MODULUS (0x%08l
11de0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
11df0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
11e00 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
11e10 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
11e20 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
11e30 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
11e40 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28  x509_to_modulus(
11e50 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
11e60 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
11e70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
11e80 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
11e90 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
11ea0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
11eb0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
11ec0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
11ed0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
11ee0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
11ef0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11f00 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
11f10 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
11f20 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
11f30 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
11f40 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
11f50 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f  case CKA_PUBLIC_
11f60 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41  EXPONENT:.....CA
11f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11f80 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
11f90 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c  tribute CKA_PUBL
11fa0 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25  IC_EXPONENT (0x%
11fb0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
11fc0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
11fd0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
11fe0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
11ff0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
12000 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
12010 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e   = x509_to_expon
12020 65 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ent(certificate,
12030 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
12040 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
12050 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
12060 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
12070 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
12080 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
12090 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
120a0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
120b0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
120c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
120d0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
120e0 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
120f0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
12100 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
12110 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
12120 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
12130 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a  ST_SERVER_AUTH:.
12140 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12150 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
12160 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
12170 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41  A_TRUST_SERVER_A
12180 55 54 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  UTH (0x%08lx) ..
12190 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
121a0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
121b0 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
121c0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
121d0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
121e0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
121f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12200 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
12210 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
12220 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
12230 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
12240 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
12250 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
12260 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
12270 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
12280 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
12290 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09  T_CLIENT_AUTH:..
122a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
122b0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
122c0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
122d0 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
122e0 54 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  TH (0x%08lx) ...
122f0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
12300 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
12310 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
12320 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
12330 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
12340 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
12350 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12360 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
12370 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
12380 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
12390 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
123a0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
123b0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
123c0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
123d0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
123e0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
123f0 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09  _CODE_SIGNING:..
12400 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12410 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
12420 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
12430 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
12440 49 4e 47 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ING (0x%08lx) ..
12450 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
12460 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
12470 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
12480 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
12490 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
124a0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
124b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
124c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
124d0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
124e0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
124f0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
12500 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
12510 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
12520 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
12530 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
12540 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
12550 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49  T_EMAIL_PROTECTI
12560 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ON:.....CACKEY_D
12570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
12580 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
12590 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49  e CKA_TRUST_EMAI
125a0 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 28 30 78  L_PROTECTION (0x
125b0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
125c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
125d0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
125e0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
125f0 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
12600 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
12610 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
12620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12630 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
12640 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
12650 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12660 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
12670 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
12680 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12690 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
126a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61  ..break;....defa
126b0 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20  ult:.....pValue 
126c0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61  = NULL;.....ulVa
126d0 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
126e0 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b  G) -1;.....break
126f0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43  ;...}....if (((C
12700 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c  K_LONG) ulValueL
12710 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47  en) != ((CK_LONG
12720 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50  ) -1)) {..../* P
12730 75 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e  ush curr_attr on
12740 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a  to the stack */.
12750 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70  ...curr_attr.typ
12760 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79  e = curr_attr_ty
12770 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  pe;....curr_attr
12780 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c  .ulValueLen = ul
12790 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75  ValueLen;.....cu
127a0 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d  rr_attr.pValue =
127b0 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74   malloc(curr_att
127c0 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  r.ulValueLen);..
127d0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
127e0 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  tr.pValue, pValu
127f0 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  e, curr_attr.ulV
12800 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66  alueLen);.....if
12810 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26   (pValue_free &&
12820 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66   pValue) {.....f
12830 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09  ree(pValue);....
12840 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74  }.....if (numatt
12850 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75  rs >= retval_cou
12860 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c  nt) {.....retval
12870 5f 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09  _count *= 2;....
12880 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
12890 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c  c(retval, retval
128a0 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
128b0 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a  *retval));....}.
128c0 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76  ....memcpy(&retv
128d0 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63  al[numattrs], &c
128e0 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66  urr_attr, sizeof
128f0 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09  (curr_attr));...
12900 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d  .numattrs++;...}
12910 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74  ..}...if (numatt
12920 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  rs != 0) {...ret
12930 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61  val_count = numa
12940 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d  ttrs;...retval =
12950 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c   realloc(retval,
12960 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20   retval_count * 
12970 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
12980 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72  ;..} else {...fr
12990 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ee(retval);....r
129a0 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  etval = NULL;..}
129b0 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e  ...*pulCount = n
129c0 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45  umattrs;...CACKE
129d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
129e0 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62  Returning %lu ob
129f0 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75  jects (%p).", nu
12a00 6d 61 74 74 72 73 2c 20 72 65 74 76 61 6c 29 3b  mattrs, retval);
12a10 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
12a20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
12a30 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64  d cackey_free_id
12a40 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20  entities(struct 
12a50 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
12a60 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73  *identities, uns
12a70 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
12a80 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
12a90 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
12aa0 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e  rr_attr;..unsign
12ab0 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20  ed long id_idx, 
12ac0 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28  attr_idx;...if (
12ad0 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
12ae0 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73  LL || identities
12af0 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  _count == 0) {..
12b00 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
12b10 72 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69  r (id_idx = 0; i
12b20 64 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69  d_idx < identiti
12b30 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78  es_count; id_idx
12b40 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e  ++) {...if (iden
12b50 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
12b60 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09  ttributes) {....
12b70 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20  for (attr_idx = 
12b80 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64  0; attr_idx < id
12b90 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
12ba0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
12bb0 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  t; attr_idx++) {
12bc0 0a 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d  .....curr_attr =
12bd0 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
12be0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b  idx].attributes[
12bf0 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09  attr_idx];......
12c00 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
12c10 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72  Value) {......fr
12c20 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  ee(curr_attr->pV
12c30 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09  alue);.....}....
12c40 7d 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69  }.....if (identi
12c50 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
12c60 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66  ributes) {.....f
12c70 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69  ree(identities[i
12c80 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
12c90 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  s);....}.....cac
12ca0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69  key_free_certs(i
12cb0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
12cc0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c  ].pcsc_identity,
12cd0 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a   1, 1);...}..}..
12ce0 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73  .free(identities
12cf0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  );.}..static str
12d00 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
12d10 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
12d20 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
12d30 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
12d40 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c  slot, unsigned l
12d50 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20  ong *ids_found) 
12d60 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
12d70 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
12d80 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b  pcsc_identities;
12d90 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
12da0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
12db0 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
12dc0 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64  long num_ids, id
12dd0 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79  _idx, curr_id_ty
12de0 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  pe;..unsigned lo
12df0 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 63 65  ng num_certs, ce
12e00 72 74 5f 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  rt_idx;...CACKEY
12e10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
12e20 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
12e30 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c  ids_found == NUL
12e40 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
12e50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12e60 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73  r.  ids_found is
12e70 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
12e80 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 70  rn(NULL);..}...p
12e90 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d  csc_identities =
12ea0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72   cackey_read_cer
12eb0 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26  ts(slot, NULL, &
12ec0 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20  num_certs);..if 
12ed0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
12ee0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a   != NULL) {.../*
12ef0 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20   Convert number 
12f00 6f 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62  of Certs to numb
12f10 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f  er of objects */
12f20 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b  ...num_ids = (CK
12f30 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20  O_PRIVATE_KEY - 
12f40 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
12f50 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73  + 1) * num_certs
12f60 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20  ;....identities 
12f70 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
12f80 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
12f90 69 74 69 65 73 29 29 3b 0a 0a 09 09 69 64 5f 69  ities));....id_i
12fa0 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63  dx = 0;...for (c
12fb0 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72  ert_idx = 0; cer
12fc0 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74  t_idx < num_cert
12fd0 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
12fe0 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64  ....for (curr_id
12ff0 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54  _type = CKO_CERT
13000 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64  IFICATE; curr_id
13010 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49  _type <= CKO_PRI
13020 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69  VATE_KEY; curr_i
13030 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09  d_type++) {.....
13040 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
13050 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
13060 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
13070 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79  butes(curr_id_ty
13080 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  pe, &pcsc_identi
13090 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
130a0 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
130b0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
130c0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
130d0 0a 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69  ......if (identi
130e0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
130f0 72 69 62 75 74 65 73 20 3d 3d 20 4e 55 4c 4c 29  ributes == NULL)
13100 20 7b 0a 09 09 09 09 09 69 64 65 6e 74 69 74 69   {......identiti
13110 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
13120 62 75 74 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  butes_count = 0;
13130 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 64 65 6e  .....}......iden
13140 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
13150 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d  csc_identity = m
13160 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64  alloc(sizeof(*id
13170 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
13180 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
13190 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65  ;.....memcpy(ide
131a0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
131b0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26  pcsc_identity, &
131c0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
131d0 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f  cert_idx], sizeo
131e0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
131f0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
13200 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e  ity));......iden
13210 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
13220 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
13230 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
13240 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  oc(pcsc_identiti
13250 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
13260 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
13270 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69  ...memcpy(identi
13280 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
13290 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
132a0 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
132b0 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
132c0 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20  x].certificate, 
132d0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
132e0 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66  cert_idx].certif
132f0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
13300 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a  .id_idx++;....}.
13310 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
13320 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
13330 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
13340 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73  rts, 1);....*ids
13350 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
13360 3b 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74  ;...return(ident
13370 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64  ities);..}...*id
13380 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65  s_found = 0;..re
13390 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43  turn(NULL);.}..C
133a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
133b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69  N(CK_RV, C_Initi
133c0 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
133d0 54 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a  TR pInitArgs) {.
133e0 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45  .CK_C_INITIALIZE
133f0 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67  _ARGS CK_PTR arg
13400 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78  s;..uint32_t idx
13410 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69  ;..int mutex_ini
13420 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
13430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
13440 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
13450 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c  InitArgs != NULL
13460 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e  ) {...args = pIn
13470 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79  itArgs;...memcpy
13480 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61  (&cackey_args, a
13490 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b  rgs, sizeof(cack
134a0 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66  ey_args));....if
134b0 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
134c0 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
134d0 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
134e0 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
134f0 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  s->LockMutex == 
13500 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
13510 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  lockMutex == NUL
13520 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73  L) {....if (args
13530 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d  ->CreateMutex !=
13540 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44   NULL || args->D
13550 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e  estroyMutex != N
13560 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63  ULL || args->Loc
13570 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  kMutex != NULL |
13580 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75  | args->UnlockMu
13590 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tex != NULL) {..
135a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
135b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
135c0 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c  ome, but not All
135d0 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69   threading primi
135e0 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22  tives provided."
135f0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
13600 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
13610 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  );....}...}....i
13620 66 20 28 61 72 67 73 2d 3e 70 52 65 73 65 72 76  f (args->pReserv
13630 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
13640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13650 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
13660 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
13670 4c 4c 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  LL.");.....retur
13680 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
13690 42 41 44 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  BAD);...}..} els
136a0 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  e {...cackey_arg
136b0 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20  s.CreateMutex = 
136c0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
136d0 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78  rgs.DestroyMutex
136e0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
136f0 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
13700 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
13710 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
13720 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
13730 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d  key_args.flags =
13740 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63   0;..}...if (cac
13750 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
13760 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13770 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13780 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61    Already initia
13790 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
137a0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
137b0 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c  _ALREADY_INITIAL
137c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  IZED);..}...for 
137d0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
137e0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
137f0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
13800 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
13810 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
13820 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
13830 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
13840 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64   0;..}...for (id
13850 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
13860 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
13870 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
13880 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
13890 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79  dx++) {...cackey
138a0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
138b0 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ve = 0;...cackey
138c0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
138d0 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
138e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
138f0 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
13900 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
13910 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73  key_slots[idx].s
13920 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
13930 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
13940 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  x].token_flags =
13950 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
13960 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
13970 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
13980 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
13990 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  1;...if (!cackey
139a0 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b  _biglock_init) {
139b0 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  ...mutex_init_re
139c0 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  t = cackey_mutex
139d0 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f  _create(&cackey_
139e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20  biglock);....if 
139f0 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  (mutex_init_ret 
13a00 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
13a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13a20 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e  Error.  Mutex in
13a30 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
13a40 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  led.");.....retu
13a50 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b  rn(CKR_CANT_LOCK
13a60 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
13a70 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
13a80 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  1;..}...CACKEY_D
13a90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
13aa0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
13ab0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
13ac0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
13ad0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
13ae0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
13af0 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  inalize)(CK_VOID
13b00 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
13b10 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
13b20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13b30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
13b40 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
13b50 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
13b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
13b80 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
13b90 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
13ba0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
13bb0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
13bc0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
13bd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
13be0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
13bf0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
13c00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
13c10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
13c20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
13c30 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
13c40 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
13c50 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
13c60 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
13c70 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
13c80 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
13c90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
13ca0 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
13cb0 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
13cc0 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  (idx);...}..}...
13cd0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
13ce0 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
13cf0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
13d00 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
13d10 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
13d20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
13d30 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
13d40 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
13d50 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
13d60 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63  der) {....free(c
13d70 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
13d80 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
13d90 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70  .}..}...cackey_p
13da0 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
13db0 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69  ;...cackey_initi
13dc0 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41  alized = 0;...CA
13dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13de0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
13df0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
13e00 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
13e10 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
13e20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
13e30 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b  V, C_GetInfo)(CK
13e40 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
13e50 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
13e60 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
13e70 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
13e80 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
13e90 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
13ea0 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74   libraryDescript
13eb0 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22  ion[] = "CACKey"
13ec0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
13ed0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
13ee0 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
13ef0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
13f00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13f10 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
13f20 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
13f30 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
13f40 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
13f50 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
13f60 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
13f70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13f80 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
13f90 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
13fa0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
13fb0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
13fc0 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ED);..}...pInfo-
13fd0 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
13fe0 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45  .major = ((CACKE
13ff0 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
14000 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20  ON_CODE) >> 16) 
14010 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
14020 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e  cryptokiVersion.
14030 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  minor = ((CACKEY
14040 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
14050 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20  N_CODE) >> 8) & 
14060 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0xff;...memset(p
14070 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
14080 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
14090 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
140a0 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
140b0 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
140c0 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
140d0 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
140e0 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
140f0 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   - 1);...pInfo->
14100 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09  flags = 0x00;...
14110 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69  memset(pInfo->li
14120 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
14130 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
14140 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
14150 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
14160 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  py(pInfo->librar
14170 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69  yDescription, li
14180 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
14190 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79  , sizeof(library
141a0 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31  Description) - 1
141b0 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  );...pInfo->libr
141c0 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  aryVersion.major
141d0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
141e0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
141f0 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c   0xff;..pInfo->l
14200 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69  ibraryVersion.mi
14210 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
14220 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
14230 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
14240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14250 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
14260 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
14270 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
14280 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63  );.}../*. * Proc
14290 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ess list of read
142a0 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20  ers, and create 
142b0 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20  mapping between 
142c0 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20  reader name and 
142d0 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44  slot ID. */.CK_D
142e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
142f0 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c  K_RV, C_GetSlotL
14300 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f  ist)(CK_BBOOL to
14310 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53  kenPresent, CK_S
14320 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
14330 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  List, CK_ULONG_P
14340 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
14350 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
14360 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
14370 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f  ect_ret;..CK_ULO
14380 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  NG count, slot_c
14390 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c  ount = 0, currsl
143a0 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  ot;..char *pcsc_
143b0 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72  readers, *pcsc_r
143c0 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f  eaders_s, *pcsc_
143d0 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52  readers_e;..DWOR
143e0 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  D pcsc_readers_l
143f0 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
14400 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b  listreaders_ret;
14410 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65  ..size_t curr_re
14420 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b  ader_len;...CACK
14430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14440 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
14450 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55   (pulCount == NU
14460 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
14470 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14480 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20  or. pulCount is 
14490 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
144a0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
144b0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
144c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
144d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
144e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
144f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
14500 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
14510 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
14520 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
14530 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
14540 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
14550 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
14560 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
14570 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
14580 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14590 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
145a0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
145b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
145c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
145d0 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61  R);..}.../* Clea
145e0 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  r list of slots 
145f0 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  */..if (pSlotLis
14600 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
14610 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67  BUG_PRINTF("Purg
14620 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66  ing all slot inf
14630 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09  ormation.");....
14640 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
14650 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
14660 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
14670 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79  lly being supply
14680 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
14690 61 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ation */...cacke
146a0 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
146b0 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72  ct_all();....for
146c0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
146d0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
146e0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
146f0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
14700 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
14710 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66  rslot++) {....if
14720 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
14730 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
14740 61 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 65  ader) {.....free
14750 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
14760 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
14770 64 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  der);......cacke
14780 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
14790 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
147a0 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  NULL;....}.....i
147b0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
147c0 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29  currslot].label)
147d0 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b   {.....free(cack
147e0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
147f0 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09  t].label);......
14800 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
14810 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e  rslot].label = N
14820 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ULL;....}.....ca
14830 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
14840 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  lot].active = 0;
14850 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ...}..}.../* Det
14860 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72  ermine list of r
14870 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f  eaders */..pcsc_
14880 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
14890 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
148a0 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  t();..if (pcsc_c
148b0 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
148c0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
148d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
148e0 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
148f0 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69  ion to PC/SC fai
14900 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  led, assuming no
14910 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f   slots");....slo
14920 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20  t_count = 0;..} 
14930 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65  else {...pcsc_re
14940 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a  aders_len = 0;..
14950 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
14960 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
14970 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
14980 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
14990 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73  NULL, NULL, &pcs
149a0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
149b0 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
149c0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
149d0 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26  CARD_S_SUCCESS &
149e0 26 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  & pcsc_readers_l
149f0 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63  en != 0) {....pc
14a00 73 63 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c  sc_readers = mal
14a10 6c 6f 63 28 70 63 73 63 5f 72 65 61 64 65 72 73  loc(pcsc_readers
14a20 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72  _len);....pcsc_r
14a30 65 61 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f  eaders_s = pcsc_
14a40 72 65 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61  readers;.....sca
14a50 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
14a60 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
14a70 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
14a80 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
14a90 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26   pcsc_readers, &
14aa0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
14ab0 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
14ac0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
14ad0 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
14ae0 53 53 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72  SS) {.....pcsc_r
14af0 65 61 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f  eaders_e = pcsc_
14b00 72 65 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72  readers + pcsc_r
14b10 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09  eaders_len;.....
14b20 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53  ./* Start with S
14b30 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f  lot ID 1, to avo
14b40 69 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20  id a bug in GDM 
14b50 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f  on RHEL */...../
14b60 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74  * Bug 594911: ht
14b70 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72  tps://bugzilla.r
14b80 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62  edhat.com/show_b
14b90 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31  ug.cgi?id=594911
14ba0 20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74   */.....currslot
14bb0 20 3d 20 31 3b 0a 09 09 09 09 77 68 69 6c 65 20   = 1;.....while 
14bc0 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20  (pcsc_readers < 
14bd0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
14be0 7b 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64  {......curr_read
14bf0 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  er_len = strlen(
14c00 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a  pcsc_readers);..
14c10 09 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72  .....if ((pcsc_r
14c20 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65  eaders + curr_re
14c30 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63  ader_len) > pcsc
14c40 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09  _readers_e) {...
14c50 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
14c60 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72  }.......if (curr
14c70 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30  _reader_len == 0
14c80 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  ) {.......break;
14c90 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66  ......}.......if
14ca0 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73   (currslot >= (s
14cb0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
14cc0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
14cd0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
14ce0 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
14cf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
14d00 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20  nd more readers 
14d10 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61  than slots are a
14d20 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09  vailable!");....
14d30 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
14d40 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44  }.......CACKEY_D
14d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
14d60 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20  nd reader: %s", 
14d70 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a  pcsc_readers);..
14d80 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64  ...../* Only upd
14d90 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
14da0 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
14db0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61  actually being a
14dc0 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20  sked supply the 
14dd0 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
14de0 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c   */......if (pSl
14df0 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09  otList) {.......
14e00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
14e10 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
14e20 31 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  1;.......cackey_
14e30 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
14e40 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74  pcsc_reader = st
14e50 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72  rdup(pcsc_reader
14e60 73 29 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79  s);.......cackey
14e70 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
14e80 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
14e90 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09 09  cted = 0;.......
14ea0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
14eb0 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69  rslot].transacti
14ec0 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
14ed0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
14ee0 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f  [currslot].slot_
14ef0 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 09  reset = 1;......
14f00 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
14f10 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  rrslot].token_fl
14f20 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
14f30 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09  REQUIRED;.......
14f40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
14f50 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e  rslot].label = N
14f60 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ULL;......}.....
14f70 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09  .currslot++;....
14f80 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
14f90 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  += curr_reader_l
14fa0 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  en + 1;.....}...
14fb0 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
14fc0 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
14fd0 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
14fe0 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09  M on RHEL */....
14ff0 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
15000 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
15010 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
15020 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
15030 31 31 20 2a 2f 0a 09 09 09 09 69 66 20 28 63 75  11 */.....if (cu
15040 72 72 73 6c 6f 74 20 3e 20 31 29 20 7b 0a 09 09  rrslot > 1) {...
15050 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
15060 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
15070 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
15080 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09  M on RHEL */....
15090 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
150a0 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
150b0 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
150c0 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
150d0 39 31 31 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74  911 */......slot
150e0 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73 6c 6f  _count = currslo
150f0 74 20 2d 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09  t - 1;.....}....
15100 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
15110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15120 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f  ("Second call to
15130 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
15140 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
15150 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
15160 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
15170 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
15180 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
15190 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
151a0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
151b0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65  );....}.....free
151c0 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29  (pcsc_readers_s)
151d0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
151e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
151f0 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20  NTF("First call 
15200 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
15210 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
15220 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
15230 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
15240 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
15250 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
15260 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
15270 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
15280 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  et);...}..}...mu
15290 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
152a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
152b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
152c0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
152d0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
152e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
152f0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
15300 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
15310 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
15320 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
15330 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
15340 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
15350 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
15360 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ount;....CACKEY_
15370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15380 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
15390 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
153a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
153b0 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a  ;..}...count = *
153c0 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63  pulCount;..if (c
153d0 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e  ount < slot_coun
153e0 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
153f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15400 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65  r. User allocate
15410 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62  d %lu entries, b
15420 75 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65  ut we have %lu e
15430 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c  ntries.", count,
15440 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
15450 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46  .return(CKR_BUFF
15460 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a  ER_TOO_SMALL);..
15470 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c  .}...for (currsl
15480 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
15490 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63   < slot_count; c
154a0 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 2f  urrslot++) {.../
154b0 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f  * Start with Slo
154c0 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64  t ID 1, to avoid
154d0 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e   a bug in GDM on
154e0 20 52 48 45 4c 20 2a 2f 0a 09 09 2f 2a 20 42 75   RHEL */.../* Bu
154f0 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a  g 594911: https:
15500 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61  //bugzilla.redha
15510 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63  t.com/show_bug.c
15520 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a  gi?id=594911 */.
15530 09 09 70 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72  ..pSlotList[curr
15540 73 6c 6f 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74  slot] = currslot
15550 20 2b 20 31 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43   + 1;..}...*pulC
15560 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e  ount = slot_coun
15570 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
15580 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15590 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e  ing CKR_OK (%i).
155a0 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64    Found %lu read
155b0 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28  ers.", CKR_OK, (
155c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
155d0 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65  lot_count);...re
155e0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  turn(CKR_OK);...
155f0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20 74  tokenPresent = t
15600 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20  okenPresent; /* 
15610 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
15620 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
15630 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  */.}..CK_DEFINE_
15640 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
15650 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43  C_GetSlotInfo)(C
15660 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
15670 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50  , CK_SLOT_INFO_P
15680 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61  TR pInfo) {..sta
15690 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
156a0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 5b  slotDescription[
156b0 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f 74  ] = "CACKey Slot
156c0 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  ";..int mutex_re
156d0 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73  tval;..int bytes
156e0 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b  _to_copy;...CACK
156f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15700 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
15710 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
15720 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15730 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
15740 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
15750 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15760 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
15770 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
15780 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
15790 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
157a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
157b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
157c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
157d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
157e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
157f0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
15800 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
15810 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
15820 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
15830 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
15840 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15850 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15860 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
15870 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
15880 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
15890 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
158a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
158b0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
158c0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
158d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
158e0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
158f0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
15900 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
15910 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15920 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15930 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
15940 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15950 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
15960 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
15970 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
15980 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
15990 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
159a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
159b0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
159c0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
159d0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
159e0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
159f0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
15a00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
15a10 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
15a20 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
15a30 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  ALID);..}...pInf
15a40 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52  o->flags = CKF_R
15a50 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 20  EMOVABLE_DEVICE 
15a60 7c 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a  | CKF_HW_SLOT;..
15a70 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
15a80 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
15a90 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
15aa0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
15ab0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
15ac0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
15ad0 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52   |= CKF_TOKEN_PR
15ae0 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65  ESENT;..}...byte
15af0 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c  s_to_copy = strl
15b00 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  en(cackey_slots[
15b10 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61  slotID].pcsc_rea
15b20 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f  der);..if (sizeo
15b30 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
15b40 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73  turerID) < bytes
15b50 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79  _to_copy) {...by
15b60 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69  tes_to_copy = si
15b70 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
15b80 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a  facturerID);..}.
15b90 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
15ba0 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63  anufacturerID, c
15bb0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
15bc0 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c  ID].pcsc_reader,
15bd0 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b   bytes_to_copy);
15be0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
15bf0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
15c00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
15c10 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
15c20 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
15c30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15c40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15c50 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
15c60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
15c70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
15c80 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
15c90 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
15ca0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
15cb0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
15cc0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
15cd0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
15ce0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
15cf0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
15d00 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
15d10 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
15d20 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
15d30 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
15d40 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
15d50 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
15d60 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
15d70 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
15d80 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
15d90 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
15da0 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
15db0 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
15dc0 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
15dd0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
15de0 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
15df0 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
15e00 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
15e10 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
15e20 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
15e30 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0x00;...CACKEY_D
15e40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15e50 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
15e60 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
15e70 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
15e80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
15e90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
15ea0 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f  etTokenInfo)(CK_
15eb0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
15ec0 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54  CK_TOKEN_INFO_PT
15ed0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
15ee0 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
15ef0 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
15f00 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
15f10 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
15f20 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74  UTF8CHAR default
15f30 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f  Label[] = "Unkno
15f40 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74  wn Token";..stat
15f50 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
15f60 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f  odel[] = "CAC To
15f70 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61  ken";..struct ca
15f80 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
15f90 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
15fa0 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
15fb0 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
15fc0 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65  ssize_t label_re
15fd0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
15fe0 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64  tval;..int use_d
15ff0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09  efault_label;...
16000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16010 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
16020 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
16030 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
16040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16050 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
16060 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
16070 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
16080 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
16090 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
160a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
160b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
160c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
160d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
160e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
160f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
16100 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
16110 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
16120 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
16130 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
16140 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
16150 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
16160 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16170 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
16180 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
16190 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
161a0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
161b0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
161c0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
161d0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
161e0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
161f0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
16200 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
16210 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
16220 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
16230 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16240 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
16250 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
16260 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
16270 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
16280 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
16290 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
162a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
162b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
162c0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
162d0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
162e0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
162f0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
16300 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
16310 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
16320 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
16330 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
16340 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
16350 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
16360 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
16370 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
16380 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
16390 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
163a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
163b0 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e  PRINTF("No token
163c0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73   is present in s
163d0 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c  lotID = %lu", sl
163e0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
163f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
16400 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
16410 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
16420 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b  EN_NOT_PRESENT);
16430 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
16440 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
16450 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
16460 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
16470 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
16480 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16490 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
164a0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
164b0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
164c0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
164d0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  ROR);..}.../* De
164e0 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61  termine token la
164f0 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69  bel from certifi
16500 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74  cates */..memset
16510 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27  (pInfo->label, '
16520 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
16530 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f  ->label));..use_
16540 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20  default_label = 
16550 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  1;...if (cackey_
16560 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
16570 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel == NULL) {..
16580 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  .pcsc_identities
16590 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63   = cackey_read_c
165a0 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  erts(&cackey_slo
165b0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c  ts[slotID], NULL
165c0 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
165d0 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69  .if (pcsc_identi
165e0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
165f0 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73  ...if (num_certs
16600 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65   > 0) {.....labe
16610 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  l_ret = cackey_p
16620 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
16630 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74  label(pcsc_ident
16640 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61  ities, pInfo->la
16650 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
16660 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09  o->label));.....
16670 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20  if (label_ret > 
16680 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65  0) {......use_de
16690 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b  fault_label = 0;
166a0 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
166b0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
166c0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
166d0 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
166e0 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63  ;.......memcpy(c
166f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
16700 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f  ID].label, pInfo
16710 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ->label, sizeof(
16720 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
16730 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63  ....}....}.....c
16740 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
16750 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
16760 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
16770 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
16780 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
16790 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  abel, cackey_slo
167a0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
167b0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
167c0 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f  label));....use_
167d0 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20  default_label = 
167e0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f  0;..}...if (use_
167f0 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b  default_label) {
16800 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ...memcpy(pInfo-
16810 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c  >label, defaultL
16820 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66  abel, sizeof(def
16830 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b  aultLabel) - 1);
16840 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
16850 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
16860 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
16870 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
16880 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
16890 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
168a0 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
168b0 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
168c0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
168d0 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
168e0 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c  nfo->model, ' ',
168f0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
16900 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28  odel));..memcpy(
16910 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f  pInfo->model, mo
16920 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65  del, sizeof(mode
16930 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  l) - 1);...memse
16940 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  t(pInfo->serialN
16950 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65  umber, ' ', size
16960 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  of(pInfo->serial
16970 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73  Number));...mems
16980 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d  et(pInfo->utcTim
16990 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  e, ' ', sizeof(p
169a0 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b  Info->utcTime));
169b0 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
169c0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
169d0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
169e0 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
169f0 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
16a00 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
16a10 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
16a20 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
16a30 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
16a40 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
16a50 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
16a60 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
16a70 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
16a80 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0x00;...pInfo->f
16a90 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45  lags = CKF_WRITE
16aa0 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46  _PROTECTED | CKF
16ab0 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41  _USER_PIN_INITIA
16ac0 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45  LIZED | CKF_TOKE
16ad0 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
16ae0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
16af0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
16b00 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ;...pInfo->ulMax
16b10 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28  SessionCount = (
16b20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
16b30 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
16b40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
16b50 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66  [0])) - 1;..pInf
16b60 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e  o->ulSessionCoun
16b70 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
16b80 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
16b90 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53  .pInfo->ulMaxRwS
16ba0 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b  essionCount = 0;
16bb0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73  ..pInfo->ulRwSes
16bc0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
16bd0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
16be0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
16bf0 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32  ulMaxPinLen = 12
16c00 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e  8;..pInfo->ulMin
16c10 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e  PinLen = 0;..pIn
16c20 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69  fo->ulTotalPubli
16c30 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  cMemory = CK_UNA
16c40 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
16c50 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
16c60 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79  FreePublicMemory
16c70 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
16c80 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
16c90 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72  pInfo->ulTotalPr
16ca0 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b  ivateMemory = CK
16cb0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
16cc0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
16cd0 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d  ->ulFreePrivateM
16ce0 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
16cf0 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
16d00 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ON;...CACKEY_DEB
16d10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
16d20 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
16d30 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
16d40 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
16d50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
16d60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69  ION(CK_RV, C_Wai
16d70 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43  tForSlotEvent)(C
16d80 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
16d90 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53  K_SLOT_ID_PTR pS
16da0 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50  lotID, CK_VOID_P
16db0 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a  TR pReserved) {.
16dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16dd0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
16de0 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64  ...if (pReserved
16df0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
16e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16e10 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72  F("Error. pReser
16e20 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ved is not NULL.
16e30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
16e40 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
16e50 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
16e60 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
16e70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16e80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16e90 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
16ea0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
16eb0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
16ec0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
16ed0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16ee0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
16ef0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
16f00 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
16f10 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
16f20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
16f30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
16f40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
16f50 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
16f60 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
16f70 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  RV, C_GetMechani
16f80 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f  smList)(CK_SLOT_
16f90 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45  ID slotID, CK_ME
16fa0 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52  CHANISM_TYPE_PTR
16fb0 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c   pMechanismList,
16fc0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
16fd0 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45  lCount) {..CACKE
16fe0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16ff0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
17000 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
17010 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
17020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17030 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
17040 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
17050 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
17060 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
17070 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
17080 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
17090 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
170a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
170b0 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
170c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
170d0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
170e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
170f0 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55  hanismList == NU
17100 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e  LL) {...*pulCoun
17110 74 20 3d 20 33 3b 0a 0a 09 09 43 41 43 4b 45 59  t = 3;....CACKEY
17120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17130 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
17140 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
17150 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
17160 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c  );..}...if (*pul
17170 43 6f 75 6e 74 20 3c 20 33 29 20 7b 0a 09 09 43  Count < 3) {...C
17180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17190 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66  TF("Error.  Buff
171a0 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b  er too small.");
171b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
171c0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
171d0 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73  ;..}...pMechanis
171e0 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52  mList[0] = CKM_R
171f0 53 41 5f 50 4b 43 53 3b 0a 09 70 4d 65 63 68 61  SA_PKCS;..pMecha
17200 6e 69 73 6d 4c 69 73 74 5b 31 5d 20 3d 20 43 4b  nismList[1] = CK
17210 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3b  M_SHA1_RSA_PKCS;
17220 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 32 3b  ..*pulCount = 2;
17230 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17240 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
17250 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
17260 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
17270 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
17280 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
17290 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63  (CK_RV, C_GetMec
172a0 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53  hanismInfo)(CK_S
172b0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
172c0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45  K_MECHANISM_TYPE
172d0 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e   type, CK_MECHAN
172e0 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  ISM_INFO_PTR pIn
172f0 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  fo) {..int mutex
17300 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
17310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17320 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
17330 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
17340 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17350 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17360 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
17370 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17380 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
17390 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
173a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
173b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
173c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
173d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
173e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
173f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
17400 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
17410 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
17420 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
17430 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
17440 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
17450 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
17460 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17470 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
17480 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
17490 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
174a0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
174b0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
174c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
174d0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
174e0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
174f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
17500 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
17510 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
17520 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
17530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
17550 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
17560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17570 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
17580 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
17590 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
175a0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
175b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
175c0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
175d0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
175e0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
175f0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
17600 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
17610 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
17620 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
17630 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
17640 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
17650 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
17660 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
17670 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
17680 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
17690 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
176a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
176b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
176c0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
176d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
176e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
176f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
17700 2f 2a 20 58 58 58 3a 20 54 68 69 73 20 69 73 20  /* XXX: This is 
17710 75 6e 74 65 73 74 65 64 2c 20 61 6e 64 20 66 75  untested, and fu
17720 72 74 68 65 72 20 49 27 6d 20 6e 6f 74 20 72 65  rther I'm not re
17730 61 6c 6c 79 20 73 75 72 65 20 69 66 20 74 68 69  ally sure if thi
17740 73 20 69 73 20 63 6f 72 72 65 63 74 2e 20 2a 2f  s is correct. */
17750 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20  ..switch (type) 
17760 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
17770 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d  _PKCS:....pInfo-
17780 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20  >ulMinKeySize = 
17790 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  512;....pInfo->u
177a0 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31  lMaxKeySize = 81
177b0 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c  92;....pInfo->fl
177c0 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43  ags = CKF_HW | C
177d0 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46  KF_ENCRYPT | CKF
177e0 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53  _DECRYPT | CKF_S
177f0 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
17800 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
17810 73 65 20 43 4b 4d 5f 52 53 41 5f 58 5f 35 30 39  se CKM_RSA_X_509
17820 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69  :....pInfo->ulMi
17830 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a  nKeySize = 512;.
17840 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b  ...pInfo->ulMaxK
17850 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09  eySize = 8192;..
17860 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
17870 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e   CKF_HW | CKF_EN
17880 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52  CRYPT | CKF_DECR
17890 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c  YPT | CKF_SIGN |
178a0 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09   CKF_VERIFY;....
178b0 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b  break;...case CK
178c0 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a  M_SHA1_RSA_PKCS:
178d0 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e  ....pInfo->ulMin
178e0 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09  KeySize = 512;..
178f0 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65  ..pInfo->ulMaxKe
17900 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09  ySize = 8192;...
17910 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
17920 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 53 49 47  CKF_HW | CKF_SIG
17930 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a  N | CKF_VERIFY;.
17940 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43  ...break;..}...C
17950 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17960 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
17970 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
17980 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
17990 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20  R_OK);.}../* We 
179a0 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68  don't support th
179b0 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b  is method. */.CK
179c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
179d0 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f  (CK_RV, C_InitTo
179e0 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ken)(CK_SLOT_ID 
179f0 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43  slotID, CK_UTF8C
17a00 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
17a10 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c  _ULONG ulPinLen,
17a20 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
17a30 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b   pLabel) {..CACK
17a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17a50 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
17a60 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
17a70 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
17a80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17a90 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
17aa0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
17ab0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
17ac0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
17ad0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
17ae0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17af0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b  eturning CKR_TOK
17b00 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
17b10 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f  ED (%i)", CKR_TO
17b20 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
17b30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
17b40 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
17b50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  ROTECTED);.}../*
17b60 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72   We don't suppor
17b70 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a  t this method. *
17b80 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
17b90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
17ba0 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f  itPIN)(CK_SESSIO
17bb0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
17bc0 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
17bd0 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
17be0 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43  G ulPinLen) {..C
17bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17c00 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
17c10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
17c20 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
17c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17c40 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
17c50 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
17c60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
17c70 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
17c80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
17c90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17ca0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
17cb0 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
17cc0 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ECTED (%i)", CKR
17cd0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
17ce0 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  TECTED);...retur
17cf0 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  n(CKR_TOKEN_WRIT
17d00 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a  E_PROTECTED);.}.
17d10 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70  ./* We don't sup
17d20 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64  port this method
17d30 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
17d40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
17d50 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53  _SetPIN)(CK_SESS
17d60 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
17d70 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ion, CK_UTF8CHAR
17d80 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b  _PTR pOldPin, CK
17d90 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c  _ULONG ulOldPinL
17da0 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  en, CK_UTF8CHAR_
17db0 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f  PTR pNewPin, CK_
17dc0 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65  ULONG ulNewPinLe
17dd0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
17de0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
17df0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
17e00 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
17e10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
17e20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17e30 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
17e40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
17e50 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
17e60 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
17e70 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
17e80 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
17e90 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
17ea0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
17eb0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
17ec0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
17ed0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
17ee0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
17ef0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
17f00 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
17f10 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69  _RV, C_OpenSessi
17f20 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  on)(CK_SLOT_ID s
17f30 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20  lotID, CK_FLAGS 
17f40 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50  flags, CK_VOID_P
17f50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c  TR pApplication,
17f60 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66   CK_NOTIFY notif
17f70 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y, CK_SESSION_HA
17f80 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69  NDLE_PTR phSessi
17f90 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  on) {..unsigned 
17fa0 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d  long idx;..int m
17fb0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
17fc0 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20  t found_session 
17fd0 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 0;...CACKEY_DE
17fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
17ff0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c  ed.");...if ((fl
18000 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c  ags & CKF_SERIAL
18010 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46  _SESSION) != CKF
18020 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29  _SERIAL_SESSION)
18030 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f   {...return(CKR_
18040 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c  SESSION_PARALLEL
18050 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
18060 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
18070 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
18080 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18090 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
180a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
180b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
180c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
180d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
180e0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
180f0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
18100 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
18110 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
18120 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
18130 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18140 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18150 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
18160 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
18170 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
18180 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
18190 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
181a0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
181b0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
181c0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
181d0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
181e0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
181f0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
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 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
18230 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18240 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
18250 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
18260 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
18270 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
18280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18290 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
182a0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
182b0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
182c0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
182d0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
182e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
182f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
18300 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
18310 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
18320 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56  ALID);..}.../* V
18330 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
18340 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ard is actually 
18350 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a  in the slot. */.
18360 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74  ./* XXX: Check t
18370 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73  o make sure this
18380 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23   is in the PKCS#
18390 31 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  11 specification
183a0 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f   */..if (cackey_
183b0 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63  token_present(&c
183c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
183d0 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50  ID]) != CACKEY_P
183e0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
183f0 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  NT) {...CACKEY_D
18400 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18410 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72  or.  Card not pr
18420 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  esent.  Returnin
18430 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  g CKR_DEVICE_REM
18440 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65  OVED");....cacke
18450 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
18460 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
18470 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45  ...return(CKR_DE
18480 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09  VICE_REMOVED);..
18490 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31  }...for (idx = 1
184a0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
184b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
184c0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
184d0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
184e0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21  idx++) {...if (!
184f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18500 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
18510 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20  ..found_session 
18520 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73  = 1;.....*phSess
18530 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63  ion = idx;.....c
18540 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
18550 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a  dx].active = 1;.
18560 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
18570 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d  ns[idx].slotID =
18580 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b   slotID;....cack
18590 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
185a0 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
185b0 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a  PUBLIC_SESSION;.
185c0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
185d0 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20  ns[idx].flags = 
185e0 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79  flags;....cackey
185f0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75  _sessions[idx].u
18600 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30  lDeviceError = 0
18610 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
18620 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69  ions[idx].pAppli
18630 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63  cation = pApplic
18640 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79  ation;....cackey
18650 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e  _sessions[idx].N
18660 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a  otify = notify;.
18670 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
18680 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
18690 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63  ies = NULL;....c
186a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
186b0 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  dx].identities_c
186c0 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61  ount = 0;.....ca
186d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
186e0 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  x].search_active
186f0 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
18700 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
18710 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
18720 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
18730 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74  ons[idx].decrypt
18740 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
18750 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
18760 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
18770 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69   = cackey_read_i
18780 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65  dentities(&cacke
18790 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
187a0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
187b0 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65  s[idx].identitie
187c0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62  s_count);......b
187d0 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  reak;...}..}...m
187e0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
187f0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
18800 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18810 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
18820 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
18830 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18840 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
18850 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
18860 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
18870 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
18880 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73  }...if (!found_s
18890 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b  ession) {...CACK
188a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
188b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53  "Returning CKR_S
188c0 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69  ESSION_COUNT (%i
188d0 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  )", CKR_SESSION_
188e0 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72  COUNT);....retur
188f0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  n(CKR_SESSION_CO
18900 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  UNT);..}...CACKE
18910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18920 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
18930 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
18940 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
18950 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
18960 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
18970 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28  C_CloseSession)(
18980 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
18990 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69  E hSession) {..i
189a0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
189b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
189c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
189d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
189e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
189f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18a00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
18a10 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
18a20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18a30 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
18a40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
18a50 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
18a60 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
18a70 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
18a80 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
18a90 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
18aa0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
18ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18ac0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
18ad0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
18ae0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
18af0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
18b00 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
18b10 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
18b20 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
18b30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
18b40 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
18b50 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
18b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
18b80 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
18b90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
18ba0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
18bb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
18bc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18bd0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
18be0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
18bf0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18c00 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
18c10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18c20 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
18c30 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
18c40 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
18c50 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
18c60 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
18c70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18c80 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63  ].active = 0;..c
18c90 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74  ackey_free_ident
18ca0 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73  ities(cackey_ses
18cb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
18cc0 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b  identities, cack
18cd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
18ce0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
18cf0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78  _count);...mutex
18d00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
18d10 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
18d20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
18d30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
18d40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
18d50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18d60 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
18d70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
18d80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
18d90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
18da0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18db0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
18dc0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
18dd0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
18de0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
18df0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
18e00 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53  _RV, C_CloseAllS
18e10 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54  essions)(CK_SLOT
18e20 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75  _ID slotID) {..u
18e30 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e  int32_t idx;..in
18e40 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
18e50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18e60 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
18e70 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
18e80 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
18e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18ea0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
18eb0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
18ec0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18ed0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
18ee0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
18ef0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
18f00 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
18f10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
18f20 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
18f30 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
18f40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18f50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
18f60 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
18f70 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
18f80 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
18f90 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
18fa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
18fb0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
18fc0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
18fd0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
18fe0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
18ff0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
19000 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
19010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19020 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
19030 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
19040 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
19050 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
19060 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
19070 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
19080 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
19090 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
190a0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
190b0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
190c0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
190d0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
190e0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
190f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
19100 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
19110 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
19120 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
19130 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  ID);..}...for (i
19140 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
19150 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
19160 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
19170 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19180 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
19190 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
191a0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
191b0 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
191c0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
191d0 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44  slotID != slotID
191e0 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
191f0 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
19200 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
19210 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
19220 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
19230 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65  n(idx);....cacke
19240 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
19250 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
19260 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
19270 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
19280 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
19290 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
192a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
192b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
192c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
192d0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
192e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
192f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
19300 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
19310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19320 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
19330 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
19340 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
19350 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
19360 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
19370 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66   C_GetSessionInf
19380 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  o)(CK_SESSION_HA
19390 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
193a0 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50  K_SESSION_INFO_P
193b0 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74  TR pInfo) {..int
193c0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
193d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
193e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
193f0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
19400 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
19410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19420 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
19430 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
19440 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
19450 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
19460 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
19470 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
19480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19490 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
194a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
194b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
194c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
194d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
194e0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
194f0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
19500 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
19510 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
19520 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
19530 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19540 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19550 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
19560 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
19570 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
19580 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
19590 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
195a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
195b0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
195c0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
195d0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
195e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
195f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19600 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
19610 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19620 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
19630 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
19640 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19650 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
19660 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
19670 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
19680 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
19690 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
196a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
196b0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
196c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
196d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
196e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49  NVALID);..}...pI
196f0 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61  nfo->slotID = ca
19700 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19710 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
19720 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20  .pInfo->state = 
19730 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19740 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b  hSession].state;
19750 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
19760 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
19770 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73  [hSession].flags
19780 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69  ;..pInfo->ulDevi
19790 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79  ceError = cackey
197a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
197b0 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f  on].ulDeviceErro
197c0 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  r;...mutex_retva
197d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
197e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
197f0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
19800 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
19810 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19820 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19830 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
19840 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
19850 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
19860 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
19870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
19880 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
19890 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
198a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
198b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
198c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
198d0 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
198e0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
198f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
19900 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65  CK_BYTE_PTR pOpe
19910 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f  rationState, CK_
19920 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65  ULONG_PTR pulOpe
19930 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20  rationStateLen) 
19940 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
19950 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
19960 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
19970 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
19980 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19990 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
199a0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
199b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
199c0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
199d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
199e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
199f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
19a00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
19a10 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
19a20 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
19a30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
19a40 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
19a50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
19a60 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
19a70 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
19a80 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  , C_SetOperation
19a90 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  State)(CK_SESSIO
19aa0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
19ab0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
19ac0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20  OperationState, 
19ad0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61  CK_ULONG ulOpera
19ae0 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b  tionStateLen, CK
19af0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
19b00 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43  EncryptionKey, C
19b10 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
19b20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b  hAuthenticationK
19b30 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
19b40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
19b50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
19b60 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
19b70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19b80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19b90 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
19ba0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
19bb0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
19bc0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
19bd0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
19be0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
19bf0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
19c00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
19c10 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
19c20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
19c30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
19c40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
19c50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
19c60 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
19c70 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43  K_RV, C_Login)(C
19c80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
19c90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53   hSession, CK_US
19ca0 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65  ER_TYPE userType
19cb0 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
19cc0 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
19cd0 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 69 6e   ulPinLen) {..in
19ce0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
19cf0 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
19d00 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e  ning;..int login
19d10 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
19d20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
19d30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
19d40 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
19d50 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
19d60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19d70 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
19d80 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
19d90 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
19da0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
19db0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
19dc0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
19dd0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
19de0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
19df0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
19e00 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
19e10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19e20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19e30 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
19e40 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
19e50 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
19e60 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
19e70 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
19e80 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
19e90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19ea0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19eb0 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
19ec0 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
19ed0 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
19ee0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19ef0 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
19f00 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
19f10 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
19f20 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
19f30 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
19f40 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
19f50 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
19f60 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
19f70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19f80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
19f90 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
19fa0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19fb0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
19fc0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
19fd0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19fe0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
19ff0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1a000 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1a010 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1a020 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a030 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1a040 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1a050 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1a060 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1a070 49 44 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f  ID);..}...login_
1a080 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67  ret = cackey_log
1a090 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  in(&cackey_slots
1a0a0 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
1a0b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
1a0c0 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
1a0d0 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69  en, &tries_remai
1a0e0 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69  ning);..if (logi
1a0f0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
1a100 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63  PCSC_S_OK) {...c
1a110 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1a120 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1a130 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e  k);....if (login
1a140 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
1a150 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a  CSC_E_LOCKED) {.
1a160 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a170 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a180 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e  Token is locked.
1a190 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
1a1a0 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73  lots[cackey_sess
1a1b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1a1c0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
1a1d0 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50  gs |= CKF_USER_P
1a1e0 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72  IN_LOCKED;.....r
1a1f0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f  eturn(CKR_PIN_LO
1a200 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20  CKED);...} else 
1a210 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d  if (login_ret ==
1a220 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42   CACKEY_PCSC_E_B
1a230 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b  ADPIN) {....CACK
1a240 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a250 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64  "Error.  Invalid
1a260 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63   PIN.");.....cac
1a270 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79  key_slots[cackey
1a280 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a290 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  on].slotID].toke
1a2a0 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
1a2b0 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
1a2c0 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  W;.....if (tries
1a2d0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29  _remaining == 1)
1a2e0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
1a2f0 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69  ots[cackey_sessi
1a300 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
1a310 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
1a320 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
1a330 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09  N_FINAL_TRY;....
1a340 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  }.....return(CKR
1a350 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
1a360 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
1a370 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a380 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72  or.  Unknown err
1a390 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  or returned from
1a3a0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20   cackey_login() 
1a3b0 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74  (%i)", login_ret
1a3c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a3d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1a3e0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
1a3f0 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
1a400 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
1a410 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1a420 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50   &= ~(CKF_USER_P
1a430 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f  IN_LOCKED | CKF_
1a440 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
1a450 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  OW | CKF_LOGIN_R
1a460 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53  EQUIRED | CKF_US
1a470 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59  ER_PIN_FINAL_TRY
1a480 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  );...cackey_sess
1a490 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1a4a0 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53  tate = CKS_RO_US
1a4b0 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09  ER_FUNCTIONS;...
1a4c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1a4d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1a4e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1a4f0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1a500 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1a510 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a520 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1a530 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1a540 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1a550 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1a560 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1a570 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1a580 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1a590 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1a5a0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1a5b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1a5c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f  ON(CK_RV, C_Logo
1a5d0 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ut)(CK_SESSION_H
1a5e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
1a5f0 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
1a600 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1a610 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1a620 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1a630 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1a640 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a650 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a660 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1a670 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1a680 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1a690 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1a6a0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1a6b0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1a6c0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1a6d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1a6e0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1a6f0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1a700 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a710 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1a720 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1a730 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1a740 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1a750 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1a760 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1a770 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1a780 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1a790 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1a7a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1a7b0 7b 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 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1a7e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a7f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1a800 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1a810 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a820 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1a830 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1a840 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1a850 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1a860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a870 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1a880 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1a890 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1a8a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1a8b0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
1a8c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a8d0 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
1a8e0 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
1a8f0 49 4f 4e 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ION;...mutex_ret
1a900 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1a910 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1a920 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1a930 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1a940 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1a950 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a960 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1a970 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1a980 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1a990 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1a9a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a9b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1a9c0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1a9d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1a9e0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1a9f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1aa00 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29   C_CreateObject)
1aa10 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1aa20 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1aa30 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
1aa40 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
1aa50 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
1aa60 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
1aa70 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  phObject) {..CAC
1aa80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1aa90 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1aaa0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1aab0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1aac0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1aad0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1aae0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1aaf0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1ab00 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1ab10 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1ab20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ab30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1ab40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ab50 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1ab60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1ab70 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1ab80 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1ab90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1aba0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1abb0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f  TION(CK_RV, C_Co
1abc0 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  pyObject)(CK_SES
1abd0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1abe0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
1abf0 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
1ac00 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
1ac10 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
1ac20 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
1ac30 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
1ac40 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20  TR phNewObject) 
1ac50 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1ac60 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1ac70 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1ac80 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1ac90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1aca0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1acb0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1acc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1acd0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1ace0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1acf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ad00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ad10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ad20 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1ad30 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1ad40 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1ad50 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1ad60 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ad70 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1ad80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1ad90 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  , C_DestroyObjec
1ada0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1adb0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1adc0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1add0 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
1ade0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1adf0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1ae00 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1ae10 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1ae20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ae30 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1ae40 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1ae50 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1ae60 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1ae70 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1ae80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1ae90 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1aea0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1aeb0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1aec0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1aed0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1aee0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1aef0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1af00 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1af10 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1af20 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53  ObjectSize)(CK_S
1af30 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1af40 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
1af50 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
1af60 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1af70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45  ulSize) {..CACKE
1af80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1af90 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1afa0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1afb0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1afc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1afd0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1afe0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1aff0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1b000 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1b010 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1b020 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b030 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1b040 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1b050 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1b060 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1b070 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1b080 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1b090 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1b0a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b0b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41  ON(CK_RV, C_GetA
1b0c0 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
1b0d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1b0e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
1b0f0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
1b100 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
1b110 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
1b120 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
1b130 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
1b140 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
1b150 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
1b160 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
1b170 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1b180 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61   identity_idx, a
1b190 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
1b1a0 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b  tr_idx, num_ids;
1b1b0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1b1c0 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  al;..CK_RV retva
1b1d0 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f  l = CKR_OK;..CK_
1b1e0 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
1b1f0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
1b200 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ueLen;...CACKEY_
1b210 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1b220 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1b230 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1b240 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1b250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b260 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1b270 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1b280 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1b290 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1b2a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
1b2b0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
1b2c0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
1b2d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1b2e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1b2f0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
1b300 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b310 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b320 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
1b330 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
1b340 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1b350 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1b360 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a  );..}...if (hObj
1b370 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ect == 0) {...CA
1b380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b390 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
1b3a0 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
1b3b0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
1b3c0 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
1b3d0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1b3e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75  ;..}...if (ulCou
1b3f0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
1b400 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
1b410 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
1b420 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
1b430 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
1b440 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
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 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1b470 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
1b480 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
1b490 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
1b4a0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
1b4b0 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20  f (pTemplate == 
1b4c0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1b4d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b4e0 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65  rror.  pTemplate
1b4f0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1b500 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1b510 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1b520 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68  identity_idx = h
1b530 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75  Object - 1;...mu
1b540 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1b550 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1b560 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1b570 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1b580 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1b590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b5a0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1b5b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1b5c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1b5d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1b5e0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1b5f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1b600 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1b610 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1b620 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1b630 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b640 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1b650 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1b660 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1b670 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1b680 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1b690 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  }...num_ids = ca
1b6a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b6b0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1b6c0 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28  es_count;...if (
1b6d0 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20  identity_idx >= 
1b6e0 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63  num_ids) {...cac
1b6f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1b700 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b710 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1b720 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b730 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
1b740 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69  out of range.  i
1b750 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c  dentity_idx = %l
1b760 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75  u, num_ids = %lu
1b770 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1b780 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
1b790 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1b7a0 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72  ) num_ids);....r
1b7b0 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
1b7c0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1b7d0 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20  ;..}...identity 
1b7e0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
1b7f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1b800 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79  ntities[identity
1b810 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74  _idx];...for (at
1b820 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
1b830 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20  _idx < ulCount; 
1b840 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
1b850 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65  curr_attr = &pTe
1b860 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d  mplate[attr_idx]
1b870 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  ;....pValue = NU
1b880 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
1b890 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
1b8a0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b8b0 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67  _PRINTF("Looking
1b8c0 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30   for attribute 0
1b8d0 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79  x%08lx (identity
1b8e0 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  :%lu) ...", (uns
1b8f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1b900 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e  _attr->type, (un
1b910 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
1b920 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66  ntity_idx);....f
1b930 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
1b940 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
1b950 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d  _idx < identity-
1b960 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
1b970 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
1b980 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65  ++) {....if (ide
1b990 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
1b9a0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1b9b0 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74  .type == curr_at
1b9c0 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09  tr->type) {.....
1b9d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b9e0 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20  NTF(" ... found 
1b9f0 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c  it, pValue = %p,
1ba00 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c   ulValueLen = %l
1ba10 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  u", identity->at
1ba20 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1ba30 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
1ba40 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
1ba50 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1ba60 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
1ba70 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65  ..........pValue
1ba80 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
1ba90 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
1baa0 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09  r_idx].pValue;..
1bab0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1bac0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
1bad0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1bae0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  dx].ulValueLen;.
1baf0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1bb00 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1bb10 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
1bb20 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
1bb30 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75  >ulValueLen >= u
1bb40 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
1bb50 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
1bb60 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  r->pValue, pValu
1bb70 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  e, ulValueLen);.
1bb80 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1bb90 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1bba0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09  _LONG) -1;......
1bbb0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
1bbc0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
1bbd0 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f  ..}...}....curr_
1bbe0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
1bbf0 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09   = ulValueLen;..
1bc00 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1bc10 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1bc20 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1bc30 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1bc40 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1bc50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1bc60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bc70 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1bc80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1bc90 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1bca0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74  R);..}...if (ret
1bcb0 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49  val == CKR_ATTRI
1bcc0 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
1bcd0 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
1bce0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1bcf0 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42  rning CKR_ATTRIB
1bd00 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
1bd10 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
1bd20 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
1bd30 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
1bd40 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
1bd50 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1bd60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1bd70 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
1bd80 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22  _TOO_SMALL (%i)"
1bd90 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
1bda0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
1bdb0 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val == CKR_OK) {
1bdc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bdd0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1bde0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1bdf0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
1be00 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
1be10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1be20 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
1be30 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
1be40 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
1be50 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1be60 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1be70 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
1be80 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
1be90 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1bea0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1beb0 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
1bec0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
1bed0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
1bee0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
1bef0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bf00 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1bf10 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1bf20 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1bf30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bf40 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1bf50 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1bf60 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1bf70 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1bf80 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1bf90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1bfa0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1bfb0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1bfc0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1bfd0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1bfe0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1bff0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1c000 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1c010 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1c020 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
1c030 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b  dObjectsInit)(CK
1c040 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1c050 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
1c060 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
1c070 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
1c080 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74 20 6d  lCount) {..int m
1c090 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1c0a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c0b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c0c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c0d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c0e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c0f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c100 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c110 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c120 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c130 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1c140 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1c150 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1c160 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1c170 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1c180 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c190 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1c1a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c1b0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1c1c0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1c1d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1c1e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1c1f0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1c200 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1c210 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1c220 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1c230 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1c240 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1c250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c260 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1c270 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1c280 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1c290 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1c2a0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1c2b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1c2c0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1c2d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1c2e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1c2f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c300 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1c310 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1c320 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1c330 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1c340 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1c350 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1c360 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c370 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
1c380 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1c390 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1c3a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1c3b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c3c0 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
1c3d0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
1c3e0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1c3f0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
1c400 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  TIVE);..}...if (
1c410 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63  cackey_slots[cac
1c420 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1c430 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2e 73  ssion].slotID].s
1c440 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 43  lot_reset) {...C
1c450 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c460 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68 61 73  TF("The slot has
1c470 20 62 65 65 6e 20 72 65 73 65 74 20 73 69 6e 63   been reset sinc
1c480 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64  e we last looked
1c490 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65 73 20   for identities 
1c4a0 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b  -- rescanning");
1c4b0 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1c4c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c4d0 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  ].identities != 
1c4e0 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65  NULL) {....cacke
1c4f0 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
1c500 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s(cackey_session
1c510 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1c520 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73  tities, cackey_s
1c530 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c540 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1c550 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  nt);.....cackey_
1c560 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c570 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  n].identities = 
1c580 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f  NULL;....cackey_
1c590 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c5a0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
1c5b0 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09  unt = 0;...}....
1c5c0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1c5d0 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
1c5e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
1c5f0 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c  D].label != NULL
1c600 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
1c610 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f  ey_slots[cackey_
1c620 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c630 6e 5d 2e 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  n].slotID].label
1c640 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  );....cackey_slo
1c650 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
1c660 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
1c670 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  tID].label = NUL
1c680 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  L;...}....cackey
1c690 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65  _slots[cackey_se
1c6a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c6b0 2e 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65  .slotID].slot_re
1c6c0 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  set = 0;...cacke
1c6d0 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73  y_slots[cackey_s
1c6e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c6f0 5d 2e 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  ].slotID].token_
1c700 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
1c710 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 0a 0a  N_REQUIRED;..}..
1c720 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
1c730 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1c740 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
1c750 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  L) {...cackey_se
1c760 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c770 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
1c780 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
1c790 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
1c7a0 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
1c7b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
1c7c0 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65  tID], &cackey_se
1c7d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c7e0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
1c7f0 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  t);..}...if (pTe
1c800 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20  mplate != NULL) 
1c810 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
1c820 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
1c830 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1c840 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1c850 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e  y_count = ulCoun
1c860 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  t;....cackey_ses
1c870 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1c880 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d  search_query = m
1c890 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20  alloc(ulCount * 
1c8a0 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74  sizeof(*pTemplat
1c8b0 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28  e));.....memcpy(
1c8c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c8d0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1c8e0 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74  _query, pTemplat
1c8f0 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  e, ulCount * siz
1c900 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
1c910 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1c920 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c930 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1c940 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
1c950 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1c960 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1c970 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55  earch_query = NU
1c980 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  LL;...}..} else 
1c990 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
1c9a0 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
1c9b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1c9c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1c9d0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c9e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c9f0 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73 70   Search query sp
1ca00 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
1ca10 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71   but number of q
1ca20 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73  uery terms not s
1ca30 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 29  pecified as 0.")
1ca40 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
1ca50 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1ca60 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
1ca70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ca80 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1ca90 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  ount = 0;...cack
1caa0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1cab0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1cac0 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ry = NULL;..}...
1cad0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1cae0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1caf0 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61  _active = 1;..ca
1cb00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1cb10 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
1cb20 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75  urr_id = 0;...mu
1cb30 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1cb40 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1cb50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1cb60 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1cb70 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1cb80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cb90 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1cba0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1cbb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1cbc0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1cbd0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cbe0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1cbf0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1cc00 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1cc10 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1cc20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1cc30 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
1cc40 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f  jects)(CK_SESSIO
1cc50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1cc60 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
1cc70 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74  DLE_PTR phObject
1cc80 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78  , CK_ULONG ulMax
1cc90 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f  ObjectCount, CK_
1cca0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a  ULONG_PTR pulObj
1ccb0 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72  ectCount) {..str
1ccc0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
1ccd0 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43  ity *curr_id;..C
1cce0 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
1ccf0 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e  r_attr;..CK_ULON
1cd00 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63  G curr_id_idx, c
1cd10 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20  urr_out_id_idx, 
1cd20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73  curr_attr_idx, s
1cd30 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43  ess_attr_idx;..C
1cd40 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f  K_ULONG matched_
1cd50 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63  count, prev_matc
1cd60 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20  hed_count;..int 
1cd70 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
1cd80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cd90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1cda0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1cdb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1cdc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cdd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1cde0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1cdf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1ce00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1ce10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1ce20 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74   (pulObjectCount
1ce30 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1ce40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ce50 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62  F("Error.  pulOb
1ce60 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c  jectCount is NUL
1ce70 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1ce80 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1ce90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f  D);..}...if (phO
1cea0 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  bject == NULL &&
1ceb0 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
1cec0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  t == 0) {.../* S
1ced0 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66  hort circuit, if
1cee0 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65   zero objects we
1cef0 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74  re specified ret
1cf00 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69  urn zero items i
1cf10 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09  mmediately */...
1cf20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  *pulObjectCount 
1cf30 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  = 0;....CACKEY_D
1cf40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1cf50 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1cf60 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
1cf70 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
1cf80 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1cf90 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65  ..}...if (phObje
1cfa0 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ct == NULL) {...
1cfb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cfc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f  NTF("Error.  phO
1cfd0 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29  bject is NULL.")
1cfe0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1cff0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1d000 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62  .}...if (ulMaxOb
1d010 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
1d020 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d030 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d040 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
1d050 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69  of objects speci
1d060 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b  fied as zero.");
1d070 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1d080 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1d090 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
1d0a0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
1d0b0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
1d0c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1d0d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1d0e0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
1d0f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d100 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1d110 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1d120 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1d130 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1d140 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1d150 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1d160 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1d170 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1d180 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1d190 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1d1a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d1b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d1c0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1d1d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d1e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1d1f0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1d200 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1d210 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
1d220 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1d230 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1d240 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1d250 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d260 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
1d270 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1d280 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1d290 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1d2a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
1d2b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d2c0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1d2d0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
1d2e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1d2f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1d300 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1d310 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d320 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74    Search not act
1d330 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1d340 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
1d350 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
1d360 44 29 3b 0a 09 7d 0a 0a 09 63 75 72 72 5f 6f 75  D);..}...curr_ou
1d370 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66  t_id_idx = 0;..f
1d380 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20  or (curr_id_idx 
1d390 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1d3a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1d3b0 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72  ch_curr_id; curr
1d3c0 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  _id_idx < cackey
1d3d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d3e0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
1d3f0 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a  ount && ulMaxObj
1d400 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69  ectCount; curr_i
1d410 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  d_idx++) {...cur
1d420 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73  r_id = &cackey_s
1d430 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d440 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72  ].identities[cur
1d450 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41  r_id_idx];....CA
1d460 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d470 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64  F("Processing id
1d480 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e  entity:%lu", (un
1d490 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1d4a0 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61  r_id_idx);....ma
1d4b0 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b  tched_count = 0;
1d4c0 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ....for (curr_at
1d4d0 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72  tr_idx = 0; curr
1d4e0 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b  _attr_idx < cack
1d4f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d500 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1d510 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61  ry_count; curr_a
1d520 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
1d530 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
1d540 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  nt = matched_cou
1d550 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  nt;.....curr_att
1d560 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  r = &cackey_sess
1d570 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1d580 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72  earch_query[curr
1d590 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  _attr_idx];.....
1d5a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d5b0 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20  NTF("  Checking 
1d5c0 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78  for attribute 0x
1d5d0 25 30 38 6c 78 20 69 6e 20 69 64 65 6e 74 69 74  %08lx in identit
1d5e0 79 3a 25 69 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  y:%i...", (unsig
1d5f0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1d600 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29  ttr->type, (int)
1d610 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09   curr_id_idx);..
1d620 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d630 52 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c  RINTBUF("    Val
1d640 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22  ue looking for:"
1d650 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  , curr_attr->pVa
1d660 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e  lue, curr_attr->
1d670 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1d680 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
1d690 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
1d6a0 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64  tr_idx < curr_id
1d6b0 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
1d6c0 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
1d6d0 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63  x++) {.....if (c
1d6e0 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
1d6f0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1d700 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
1d710 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
1d720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d730 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66  RINTF("    ... f
1d740 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79  ound matching ty
1d750 70 65 20 2e 2e 2e 22 29 3b 0a 09 09 09 09 09 43  pe ...");......C
1d760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d770 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75  TBUF("    ... ou
1d780 72 20 76 61 6c 75 65 3a 22 2c 20 63 75 72 72 5f  r value:", curr_
1d790 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
1d7a0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
1d7b0 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61  alue, curr_id->a
1d7c0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1d7d0 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
1d7e0 4c 65 6e 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  Len);.......if (
1d7f0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1d800 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1d810 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d820 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
1d830 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72  .. found wildcar
1d840 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  d match");......
1d850 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
1d860 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
1d870 0a 09 09 09 09 09 7d 0a 0a 20 09 09 09 09 09 69  ......}.. .....i
1d880 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  f (curr_attr->ul
1d890 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 63 75 72 72  ValueLen == curr
1d8a0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1d8b0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
1d8c0 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d  lValueLen && mem
1d8d0 63 6d 70 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  cmp(curr_attr->p
1d8e0 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e  Value, curr_id->
1d8f0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1d900 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
1d910 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  , curr_id->attri
1d920 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1d930 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
1d940 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 43   == 0) {.......C
1d950 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d960 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
1d970 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68  ound exact match
1d980 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68  ");........match
1d990 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09  ed_count++;.....
1d9a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1d9b0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
1d9c0 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62  /* If the attrib
1d9d0 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ute could not be
1d9e0 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74   matched, do not
1d9f0 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64   try to match ad
1da00 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75  ditional attribu
1da10 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72  tes */....if (pr
1da20 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
1da30 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e   == matched_coun
1da40 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  t) {.....break;.
1da50 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1da60 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
1da70 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1da80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1da90 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b  h_query_count) {
1daa0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1dab0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41  _PRINTF("  ... A
1dac0 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73  ll %i attributes
1dad0 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
1dae0 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74  nd, adding ident
1daf0 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e  ity:%i to return
1db00 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20  ed list", (int) 
1db10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1db20 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1db30 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
1db40 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
1db50 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63  ;.....phObject[c
1db60 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20  urr_out_id_idx] 
1db70 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20  = curr_id_idx + 
1db80 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65  1;.....ulMaxObje
1db90 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63  ctCount--;.....c
1dba0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b  urr_out_id_idx++
1dbb0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1dbc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dbd0 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61  NTF("  ... Not a
1dbe0 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e  ll %i (only foun
1dbf0 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73  d %i) attributes
1dc00 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
1dc10 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69  nd, not adding i
1dc20 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e  dentity:%i", (in
1dc30 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  t) cackey_sessio
1dc40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1dc50 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c  rch_query_count,
1dc60 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63   (int) matched_c
1dc70 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
1dc80 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d  _id_idx);...}..}
1dc90 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1dca0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1dcb0 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72  ch_curr_id = cur
1dcc0 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f  r_id_idx;..*pulO
1dcd0 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72  bjectCount = cur
1dce0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 09  r_out_id_idx;...
1dcf0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1dd00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1dd10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1dd20 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1dd30 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1dd40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dd50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1dd60 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1dd70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1dd80 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1dd90 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1dda0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1ddb0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c  ing CKR_OK (%i),
1ddc0 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25   num objects = %
1ddd0 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75  lu", CKR_OK, *pu
1dde0 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a  lObjectCount);..
1ddf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1de00 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1de10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1de20 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
1de30 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1de40 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
1de50 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1de60 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1de70 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1de80 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1de90 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1dea0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1deb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dec0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1ded0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1dee0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1def0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1df00 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1df10 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1df20 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1df30 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1df40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1df50 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1df60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1df70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1df80 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1df90 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1dfa0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1dfb0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1dfc0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1dfd0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1dfe0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1dff0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1e000 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1e010 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e020 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1e030 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1e040 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e050 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1e060 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1e070 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e080 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1e090 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1e0a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1e0b0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1e0c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e0d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1e0e0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1e0f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1e100 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1e110 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
1e120 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e130 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1e140 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1e150 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1e160 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e170 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e180 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e190 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69   Search not acti
1e1a0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1e1b0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
1e1c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1e1d0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1e1e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e1f0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
1e200 3d 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79  = 0;..if (cackey
1e210 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e220 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1e230 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
1e240 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e250 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1e260 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  y);..}...mutex_r
1e270 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1e280 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e290 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e2a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e2b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e2c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e2d0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1e2e0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1e2f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1e300 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1e310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e320 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e330 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1e340 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1e350 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1e360 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1e370 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  V, C_EncryptInit
1e380 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1e390 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1e3a0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
1e3b0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
1e3c0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
1e3d0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1e3e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1e3f0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1e400 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1e410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e430 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1e440 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e450 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1e460 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1e470 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e480 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1e490 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1e4a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1e4b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1e4c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1e4d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1e4e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1e4f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1e500 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1e510 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43  RV, C_Encrypt)(C
1e520 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1e530 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1e540 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
1e550 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
1e560 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
1e570 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
1e580 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
1e590 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20  cryptedDataLen) 
1e5a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1e5b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1e5c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1e5d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1e5e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e5f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1e600 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1e610 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e620 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1e630 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1e640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e650 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e660 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1e670 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1e680 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1e690 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1e6a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1e6b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1e6c0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1e6d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1e6e0 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  , C_EncryptUpdat
1e6f0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1e700 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1e710 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
1e720 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
1e730 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
1e740 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
1e750 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1e760 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
1e770 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1e780 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e790 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e7a0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e7b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e7c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e7d0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e7e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e7f0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e800 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e810 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1e820 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e830 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1e840 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1e850 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1e860 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e870 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e880 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e890 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1e8a0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e8b0 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46  K_RV, C_EncryptF
1e8c0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
1e8d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1e8e0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
1e8f0 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74  astEncryptedPart
1e900 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1e910 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50  ulLastEncryptedP
1e920 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
1e930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e940 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1e950 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1e960 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1e970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e980 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1e990 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1e9a0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1e9b0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1e9c0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1e9d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1e9e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1e9f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ea00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1ea10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ea20 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1ea30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ea40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1ea50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1ea60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
1ea70 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
1ea80 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1ea90 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
1eaa0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
1eab0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1eac0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20  LE hKey) {..int 
1ead0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
1eae0 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59  hKey--;...CACKEY
1eaf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1eb00 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1eb10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1eb20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1eb30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1eb40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1eb50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1eb60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1eb70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1eb80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
1eb90 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20  hanism == NULL) 
1eba0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ebb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ebc0 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55  pMechanism is NU
1ebd0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1ebe0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1ebf0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
1ec00 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
1ec10 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50  ism != CKM_RSA_P
1ec20 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
1ec30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ec40 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
1ec50 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
1ec60 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
1ec70 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72  RSA_PKCS");....r
1ec80 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e  eturn(CKR_MECHAN
1ec90 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49  ISM_PARAM_INVALI
1eca0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1ecb0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1ecc0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1ecd0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1ece0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1ecf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1ed00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ed10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ed20 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1ed30 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1ed40 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1ed50 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1ed60 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1ed70 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1ed80 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1ed90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1eda0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1edb0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1edc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1edd0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1ede0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1edf0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1ee00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1ee10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ee20 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1ee30 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1ee40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ee50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1ee60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ee70 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1ee80 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1ee90 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1eea0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1eeb0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1eec0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1eed0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
1eee0 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
1eef0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1ef00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1ef10 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1ef20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ef30 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61  rror.  Decrypt a
1ef40 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
1ef50 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
1ef60 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
1ef70 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
1ef80 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
1ef90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1efa0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
1efb0 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
1efc0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1efd0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1efe0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1eff0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f000 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
1f010 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74  f range (request
1f020 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79  ed key %lu, only
1f030 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20   %lu identities 
1f040 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75  available).", (u
1f050 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
1f060 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ey, (unsigned lo
1f070 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ng) cackey_sessi
1f080 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1f090 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
1f0a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b  ....return(CKR_K
1f0b0 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  EY_HANDLE_INVALI
1f0c0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
1f0d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f0e0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
1f0f0 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f  e = 1;...cackey_
1f100 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f110 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61  n].decrypt_mecha
1f120 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  nism = pMechanis
1f130 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63  m->mechanism;..c
1f140 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1f150 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
1f160 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65  _mech_parm = pMe
1f170 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65  chanism->pParame
1f180 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ter;..cackey_ses
1f190 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1f1a0 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
1f1b0 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73  mlen = pMechanis
1f1c0 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65  m->ulParameterLe
1f1d0 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  n;..cackey_sessi
1f1e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
1f1f0 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d  crypt_identity =
1f200 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
1f210 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1f220 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09  tities[hKey];...
1f230 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1f240 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f250 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f260 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f270 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f290 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1f2a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1f2b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f2c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f2d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1f2e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f2f0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1f300 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1f310 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1f320 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1f330 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
1f340 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
1f350 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1f360 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
1f370 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
1f380 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
1f390 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  dDataLen, CK_BYT
1f3a0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
1f3b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
1f3c0 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e  aLen) {..CK_ULON
1f3d0 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  G datalen_update
1f3e0 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b  , datalen_final;
1f3f0 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f  ..CK_RV decrypt_
1f400 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
1f410 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1f420 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1f430 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1f440 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f450 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f460 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1f470 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f480 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1f490 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f4a0 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61  .}...if (pulData
1f4b0 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
1f4c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f4d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
1f4e0 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  DataLen is NULL.
1f4f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f500 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1f510 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75  ;..}...datalen_u
1f520 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61  pdate = *pulData
1f530 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  Len;...decrypt_r
1f540 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70  et = C_DecryptUp
1f550 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
1f560 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 75  EncryptedData, u
1f570 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
1f580 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c  n, pData, &datal
1f590 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20  en_update);..if 
1f5a0 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20  (decrypt_ret != 
1f5b0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
1f5c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f5d0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
1f5e0 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
1f5f0 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
1f600 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
1f610 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f  d long) decrypt_
1f620 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
1f630 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d  decrypt_ret);..}
1f640 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b 0a  ...if (pData) {.
1f650 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61 6c  ..pData += datal
1f660 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64  en_update;..}..d
1f670 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a  atalen_final = *
1f680 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61 74  pulDataLen - dat
1f690 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64  alen_update;...d
1f6a0 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44  ecrypt_ret = C_D
1f6b0 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65 73  ecryptFinal(hSes
1f6c0 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64 61  sion, pData, &da
1f6d0 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69  talen_final);..i
1f6e0 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
1f6f0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...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 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
1f720 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  ptFinal() return
1f730 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
1f740 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
1f750 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74  ed long) decrypt
1f760 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
1f770 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09  (decrypt_ret);..
1f780 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20  }...*pulDataLen 
1f790 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  = datalen_update
1f7a0 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c   + datalen_final
1f7b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1f7c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1f7d0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1f7e0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1f7f0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1f800 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1f810 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
1f820 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
1f830 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1f840 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1f850 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
1f860 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
1f870 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
1f880 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
1f890 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1f8a0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74  ulPartLen) {..st
1f8b0 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75 66  atic CK_BYTE buf
1f8c0 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f  [16384];..ssize_
1f8d0 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 52 56  t buflen;..CK_RV
1f8e0 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
1f8f0 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
1f900 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1f910 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f920 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1f930 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1f940 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1f950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f960 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1f970 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1f980 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f990 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1f9a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1f9b0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1f9c0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1f9d0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1f9e0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1f9f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1fa00 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1fa10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fa20 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1fa30 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1fa40 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1fa50 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1fa60 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1fa70 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
1fa80 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
1fa90 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
1faa0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  n == 0) {.../* S
1fab0 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20  hort circuit if 
1fac0 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20  we are asked to 
1fad0 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e  decrypt nothing.
1fae0 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
1faf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1fb00 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1fb10 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
1fb20 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
1fb30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1fb40 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
1fb50 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
1fb60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fb70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1fb80 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  . pEncryptedPart
1fb90 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
1fba0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1fbb0 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09   is not 0.");...
1fbc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1fbd0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1fbe0 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64  .if (ulEncrypted
1fbf0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
1fc00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fc10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
1fc20 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1fc30 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74   is 0, but pPart
1fc40 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
1fc50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1fc60 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1fc70 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c  }...if (pulPartL
1fc80 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
1fc90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fca0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50  NTF("Error. pulP
1fcb0 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
1fcc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fcd0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1fce0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1fcf0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1fd00 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1fd10 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1fd20 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1fd30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fd40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fd50 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1fd60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fd70 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1fd80 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1fd90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1fda0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1fdb0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1fdc0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1fdd0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1fde0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fdf0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1fe00 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1fe10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1fe20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1fe30 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1fe40 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1fe50 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
1fe60 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
1fe70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1fe80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1fe90 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1fea0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1feb0 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
1fec0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1fed0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
1fee0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
1fef0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  IZED);..}...swit
1ff00 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
1ff10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
1ff20 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29  crypt_mechanism)
1ff30 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
1ff40 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
1ff50 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70  k card to decryp
1ff60 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d  t */....buflen =
1ff70 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
1ff80 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
1ff90 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s[cackey_session
1ffa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
1ffb0 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ID], cackey_sess
1ffc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1ffd0 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c  ecrypt_identity,
1ffe0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
1fff0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
20000 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  Len, buf, sizeof
20010 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09  (buf), 0, 1);...
20020 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30  ..if (buflen < 0
20030 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
20040 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f  ption failed. */
20050 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
20060 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
20070 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28  ....} else if ((
20080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
20090 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61  buflen) > *pulPa
200a0 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20  rtLen && pPart) 
200b0 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74  {...../* Decrypt
200c0 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
200d0 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  e */.....retval 
200e0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
200f0 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73  _SMALL;....} els
20100 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72  e {.....if (pPar
20110 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  t) {......memcpy
20120 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66  (pPart, buf, buf
20130 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  len);.....}.....
20140 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62  .*pulPartLen = b
20150 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76  uflen;......retv
20160 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09  al = CKR_OK;....
20170 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
20180 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
20190 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
201a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
201b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
201c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
201d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
201e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
201f0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
20200 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20210 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
20220 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
20230 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20240 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
20250 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
20260 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
20270 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
20280 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
20290 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  ptFinal)(CK_SESS
202a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
202b0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
202c0 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55   pLastPart, CK_U
202d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
202e0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
202f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
20300 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  nt terminate_dec
20310 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  rypt = 1;...CACK
20320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20330 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
20340 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
20350 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
20360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20370 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
20380 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
20390 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
203a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
203b0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
203c0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
203d0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
203e0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
203f0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
20400 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
20410 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
20420 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20430 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
20440 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
20450 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
20460 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
20470 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
20480 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d  ulLastPartLen ==
20490 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
204a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
204b0 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61  Error. pulLastPa
204c0 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  rtLen is NULL.")
204d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
204e0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
204f0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
20500 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
20510 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
20520 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
20530 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
20540 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20550 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20560 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
20570 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20580 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
20590 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
205a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
205b0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
205c0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
205d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
205e0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
205f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20600 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
20610 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
20620 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
20630 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
20640 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
20650 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20660 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
20670 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
20680 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
20690 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
206a0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
206b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
206c0 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
206d0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
206e0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
206f0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
20700 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c  ZED);..}...*pulL
20710 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a  astPartLen = 0;.
20720 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74 20  ..if (pLastPart 
20730 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72  == NULL) {...ter
20740 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d  minate_decrypt =
20750 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72   0;..}...if (ter
20760 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20  minate_decrypt) 
20770 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
20780 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
20790 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30  crypt_active = 0
207a0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
207b0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
207c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
207d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
207e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
207f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20800 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20810 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
20820 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
20830 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
20840 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
20850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20860 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20870 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
20880 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
20890 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
208a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
208b0 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43   C_DigestInit)(C
208c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
208d0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
208e0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
208f0 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45  hanism) {..CACKE
20900 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20910 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20920 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20930 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20940 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20950 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20960 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20970 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20980 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20990 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
209a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
209b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
209c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
209d0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
209e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
209f0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20a00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20a10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
20a20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20a30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
20a40 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  st)(CK_SESSION_H
20a50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
20a60 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
20a70 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
20a80 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
20a90 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55  TR pDigest, CK_U
20aa0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65  LONG_PTR pulDige
20ab0 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  stLen) {..CACKEY
20ac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
20ad0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
20ae0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20af0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20b10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20b20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20b30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20b40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20b50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
20b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20b70 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
20b80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20b90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
20ba0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
20bb0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
20bc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20bd0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
20be0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
20bf0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
20c00 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
20c10 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
20c20 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
20c30 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
20c40 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43   ulPartLen) {..C
20c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20c60 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
20c70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
20c80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
20c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20ca0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20cb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20cc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20cd0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20ce0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
20cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20d00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20d10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
20d20 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
20d30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20d40 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
20d50 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
20d60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
20d70 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
20d80 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
20d90 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45  DigestKey)(CK_SE
20da0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
20db0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
20dc0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
20dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20de0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20df0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20e00 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20e20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20e30 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20e40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20e50 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20e60 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20e70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20e80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20e90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20ea0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
20eb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20ec0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
20ed0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
20ee0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20ef0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20f00 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
20f10 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43  C_DigestFinal)(C
20f20 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
20f30 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
20f40 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
20f50 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
20f60 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
20f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20f80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20f90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20fa0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20fc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20fd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20fe0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20ff0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21000 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
21010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21020 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
21030 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21040 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
21050 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21060 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21070 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21080 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21090 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
210a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
210b0 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  ignInit)(CK_SESS
210c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
210d0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
210e0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
210f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
21100 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20  LE hKey) {..int 
21110 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
21120 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59  hKey--;...CACKEY
21130 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21140 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21150 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
21160 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
21170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21180 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
21190 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
211a0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
211b0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
211c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
211d0 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20  hanism == NULL) 
211e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
211f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21200 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55  pMechanism is NU
21210 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
21220 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
21230 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
21240 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
21250 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50  ism != CKM_RSA_P
21260 4b 43 53 20 26 26 20 70 4d 65 63 68 61 6e 69 73  KCS && pMechanis
21270 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
21280 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
21290 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
212a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
212b0 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  r. pMechanism->m
212c0 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65  echanism not spe
212d0 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53  cified as CKM_RS
212e0 41 5f 50 4b 43 53 20 6f 72 20 43 4b 4d 5f 53 48  A_PKCS or CKM_SH
212f0 41 31 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a  A1_RSA_PKCS");..
21300 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43  ..return(CKR_MEC
21310 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56  HANISM_PARAM_INV
21320 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
21330 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
21340 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
21350 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21360 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
21370 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
21380 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
213a0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
213b0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
213c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
213d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
213e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
213f0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
21400 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
21410 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
21420 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
21430 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
21440 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21450 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
21460 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21470 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21480 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
21490 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
214a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
214b0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
214c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
214d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
214e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
214f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
21500 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
21510 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
21520 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
21530 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
21540 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
21550 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21560 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
21570 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
21580 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21590 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
215a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
215b0 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65  rror.  Sign alre
215c0 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ady in progress.
215d0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
215e0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
215f0 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  TIVE);..}...if (
21600 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73  hKey >= cackey_s
21610 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21620 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
21630 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  nt) {...cackey_m
21640 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21650 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21670 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79  NTF("Error.  Key
21680 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
21690 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20  ange (requested 
216a0 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c  key %lu, only %l
216b0 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61  u identities ava
216c0 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69  ilable).", (unsi
216d0 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c  gned long) hKey,
216e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
216f0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
21700 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
21710 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
21720 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f  .return(CKR_KEY_
21730 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
21740 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
21750 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21760 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b  sign_active = 1;
21770 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21780 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
21790 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  n_mechanism = pM
217a0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
217b0 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ism;...cackey_se
217c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
217d0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31  .sign_buflen = 1
217e0 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  28;..cackey_sess
217f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21800 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b  ign_bufused = 0;
21810 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
21820 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
21830 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  _buf = malloc(si
21840 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
21850 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21860 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
21870 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21880 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
21890 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  n);...CACKEY_DEB
218a0 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69  UG_PRINTF("Sessi
218b0 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e  on %lu sign_iden
218c0 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65 6e  tity is %p (iden
218d0 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e  tity #%lu)", (un
218e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65  signed long) hSe
218f0 73 73 69 6f 6e 2c 20 26 63 61 63 6b 65 79 5f 73  ssion, &cackey_s
21900 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21910 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
21920 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  y], (unsigned lo
21930 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b  ng) hKey);..cack
21940 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21950 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
21960 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
21970 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21980 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79  .identities[hKey
21990 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  ];...mutex_retva
219a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
219b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
219c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
219d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
219e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
219f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21a00 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
21a10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21a20 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21a30 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
21a40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21a50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
21a60 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
21a70 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
21a80 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21a90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
21aa0 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f  _Sign)(CK_SESSIO
21ab0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
21ac0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
21ad0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
21ae0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
21af0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
21b00 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
21b10 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
21b20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
21b30 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
21b40 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69 67 6e  sed;..CK_RV sign
21b50 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
21b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21b70 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21b80 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21b90 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21bb0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21bc0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21bd0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21be0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21bf0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
21c00 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
21c10 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
21c20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
21c30 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
21c40 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
21c50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21c60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21c70 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
21c80 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
21c90 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
21ca0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
21cb0 3b 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67  ;..}...start_sig
21cc0 6e 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b  n_bufused = cack
21cd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21ce0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
21cf0 65 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d  ed;...sign_ret =
21d00 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53   C_SignUpdate(hS
21d10 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75  ession, pData, u
21d20 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28  lDataLen);..if (
21d30 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
21d40 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
21d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21d60 6f 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28  or.  SignUpdate(
21d70 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
21d80 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
21d90 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
21da0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72   sign_ret);....r
21db0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
21dc0 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d  ..}...sign_ret =
21dd0 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65   C_SignFinal(hSe
21de0 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72  ssion, pSignatur
21df0 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  e, pulSignatureL
21e00 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
21e10 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
21e20 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d  ..if (sign_ret =
21e30 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
21e40 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43  _SMALL) {....CAC
21e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21e60 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65  ("SignFinal() re
21e70 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45  turned CKR_BUFFE
21e80 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20  R_TOO_SMALL (rv 
21e90 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20  = %lu), undoing 
21ea0 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c  C_SignUpdate()",
21eb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
21ec0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09   sign_ret);.....
21ed0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21ee0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
21ef0 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73  ufused = start_s
21f00 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09  ign_bufused;....
21f10 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
21f20 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
21f30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21f40 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c  rror.  SignFinal
21f50 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
21f60 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
21f70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
21f80 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
21f90 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
21fa0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
21fb0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21fc0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
21fd0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
21fe0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
21ff0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
22000 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
22010 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  gnUpdate)(CK_SES
22020 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
22030 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
22040 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
22050 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
22060 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22070 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22080 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22090 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
220a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
220b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
220c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
220d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
220e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
220f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22100 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22110 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
22120 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
22130 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
22140 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
22150 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22160 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
22170 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22180 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
22190 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
221a0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
221b0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
221c0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
221d0 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20  ...if (pPart == 
221e0 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65  NULL && ulPartLe
221f0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  n == 0) {.../* S
22200 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20  hort circuit if 
22210 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20  we are asked to 
22220 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20  sign nothing... 
22230 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
22240 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22250 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
22260 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
22270 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
22280 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
22290 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20  ...if (pPart == 
222a0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
222b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
222c0 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e  rror. pPart is N
222d0 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c  ULL, but ulPartL
222e0 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a  en is not 0.");.
222f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
22300 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
22310 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e  ...if (ulPartLen
22320 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
22330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22340 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e  Error. ulPartLen
22350 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74   is 0, but pPart
22360 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
22370 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
22380 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
22390 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
223a0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
223b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
223c0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
223d0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
223e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
223f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
22400 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22410 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22420 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22430 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
22440 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22450 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
22460 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22470 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22480 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
22490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
224a0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
224b0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
224c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
224d0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
224e0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
224f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22500 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
22510 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
22520 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
22530 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
22540 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22550 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
22560 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ign not active."
22570 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
22580 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
22590 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
225a0 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
225b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
225c0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61  sion].sign_mecha
225d0 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43  nism) {...case C
225e0 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  KM_RSA_PKCS:....
225f0 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69  /* Accumulate di
22600 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20  rectly */....if 
22610 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ((cackey_session
22620 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
22630 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72  _bufused + ulPar
22640 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73  tLen) > cackey_s
22650 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22660 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b  ].sign_buflen) {
22670 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
22680 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22690 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b  ign_buflen *= 2;
226a0 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ......cackey_ses
226b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
226c0 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c  sign_buf = reall
226d0 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  oc(cackey_sessio
226e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
226f0 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63  n_buf, sizeof(*c
22700 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22710 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
22720 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73  f) * cackey_sess
22730 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22740 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09  ign_buflen);....
22750 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63  }.....memcpy(cac
22760 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22770 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
22780 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  + cackey_session
22790 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
227a0 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72 74 2c  _bufused, pPart,
227b0 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09   ulPartLen);....
227c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
227d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
227e0 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 72  bufused += ulPar
227f0 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  tLen;.....break;
22800 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31  ...case CKM_SHA1
22810 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
22820 20 58 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65   XXX: Accumulate
22830 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73   into a SHA1 has
22840 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d  h */....cackey_m
22850 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22860 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
22870 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22880 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22890 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
228a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
228b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
228c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
228d0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
228e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
228f0 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b  RTED);....break;
22900 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
22910 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
22920 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22930 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22940 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22950 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22960 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22970 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
22980 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
22990 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
229a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
229b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
229c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
229d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
229e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
229f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22a00 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
22a10 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f  C_SignFinal)(CK_
22a20 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22a30 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
22a40 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
22a50 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
22a60 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
22a70 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
22a80 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09   sigbuf[1024];..
22a90 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65  ssize_t sigbufle
22aa0 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  n;..CK_RV retval
22ab0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
22ac0 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69  RROR;..int termi
22ad0 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
22ae0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22af0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22b00 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22b10 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22b20 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22b30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22b40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22b50 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22b60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22b70 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22b80 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22b90 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75  ..if (pulSignatu
22ba0 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  reLen == NULL) {
22bb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22bc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
22bd0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69  ulSignatureLen i
22be0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
22bf0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
22c00 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
22c10 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
22c20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
22c30 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22c40 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
22c50 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22c60 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
22c70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22c80 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
22c90 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
22ca0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
22cb0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
22cc0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
22cd0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
22ce0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
22cf0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22d00 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22d10 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22d30 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
22d40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
22d50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22d60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
22d70 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
22d80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
22d90 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
22da0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22db0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22dc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22dd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22de0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
22df0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
22e00 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
22e10 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22e20 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
22e30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22e40 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
22e50 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
22e60 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22e70 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
22e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22e90 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
22ea0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
22eb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
22ec0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
22ed0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
22ee0 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
22ef0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22f00 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
22f10 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
22f20 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
22f30 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a  k card to sign *
22f40 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  /....CACKEY_DEBU
22f50 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67  G_PRINTF("Asking
22f60 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64   to sign from id
22f70 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73  entity %p in ses
22f80 73 69 6f 6e 20 25 6c 75 22 2c 20 63 61 63 6b 65  sion %lu", cacke
22f90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22fa0 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
22fb0 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ty, (unsigned lo
22fc0 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09  ng) hSession);..
22fd0 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61  ..sigbuflen = ca
22fe0 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74  ckey_signdecrypt
22ff0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (&cackey_slots[c
23000 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23010 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d  Session].slotID]
23020 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
23030 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
23040 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65  _identity, cacke
23050 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23060 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63  ion].sign_buf, c
23070 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23080 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
23090 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73  fused, sigbuf, s
230a0 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31  izeof(sigbuf), 1
230b0 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69  , 0);.....if (si
230c0 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09  gbuflen < 0) {..
230d0 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61  .../* Signing fa
230e0 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74  iled. */.....ret
230f0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
23100 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c  L_ERROR;....} el
23110 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65  se if (((unsigne
23120 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
23130 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75  n) > *pulSignatu
23140 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74  reLen && pSignat
23150 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  ure) {...../* Si
23160 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  gned data too la
23170 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45  rge */.....CACKE
23180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23190 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
231a0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20  FER_TOO_SMALL;  
231b0 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c  sigbuflen = %lu,
231c0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
231d0 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
231e0 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
231f0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
23200 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ng) *pulSignatur
23210 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76  eLen);......retv
23220 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
23230 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09  TOO_SMALL;......
23240 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
23250 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a   0;....} else {.
23260 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
23270 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20  gn = 0;......if 
23280 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09  (pSignature) {..
23290 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e  ....memcpy(pSign
232a0 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73  ature, sigbuf, s
232b0 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  igbuflen);......
232c0 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
232d0 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  = 1;.....}......
232e0 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
232f0 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09   = sigbuflen;...
23300 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
23310 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  OK;....}.....bre
23320 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53  ak;...case CKM_S
23330 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  HA1_RSA_PKCS:...
23340 09 2f 2a 20 58 58 58 3a 20 41 63 63 75 6d 75 6c  ./* XXX: Accumul
23350 61 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20  ate into a SHA1 
23360 68 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65  hash */....cacke
23370 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23380 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23390 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
233a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
233b0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
233c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
233d0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
233e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
233f0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
23400 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23410 50 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65  PPORTED);....bre
23420 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72  ak;..}...if (ter
23430 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09  minate_sign) {..
23440 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
23450 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23460 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72  ign_buf) {....fr
23470 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
23480 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
23490 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63  n_buf);...}....c
234a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
234b0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
234c0 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d  tive = 0;..}...m
234d0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
234e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
234f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
23500 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
23510 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
23520 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23530 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
23540 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
23550 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23560 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23570 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
23580 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23590 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
235a0 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
235b0 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
235c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
235d0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f  K_RV, C_SignReco
235e0 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
235f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23600 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
23610 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
23620 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
23630 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
23640 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23650 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
23660 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
23670 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
23680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23690 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
236a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
236b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
236c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
236d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
236e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
236f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
23700 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23710 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
23720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23730 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
23740 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
23750 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
23760 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
23770 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
23780 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  nRecover)(CK_SES
23790 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
237a0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
237b0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
237c0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
237d0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
237e0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
237f0 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
23800 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
23810 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
23820 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23830 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23840 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23850 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23860 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23870 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23880 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23890 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
238a0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
238b0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
238c0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
238d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
238e0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
238f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23900 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
23910 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23920 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
23930 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23940 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69  _RV, C_VerifyIni
23950 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
23960 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
23970 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
23980 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
23990 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
239a0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
239b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
239c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
239d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
239e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
239f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23a00 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23a10 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23a20 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23a30 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23a40 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
23a50 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23a60 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
23a70 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
23a80 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
23a90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23aa0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
23ab0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23ac0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
23ad0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23ae0 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43  _RV, C_Verify)(C
23af0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
23b00 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
23b10 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
23b20 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
23b30 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
23b40 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
23b50 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
23b60 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
23b70 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
23b80 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23b90 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23ba0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23bb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23bc0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23bd0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23be0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23bf0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23c00 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
23c10 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23c20 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
23c30 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
23c40 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
23c50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23c60 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
23c70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23c80 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
23c90 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23ca0 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64  _RV, C_VerifyUpd
23cb0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
23cc0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
23cd0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
23ce0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
23cf0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
23d00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23d10 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23d20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
23d30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23d40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23d50 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
23d60 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
23d70 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
23d80 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
23d90 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
23da0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23db0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
23dc0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23dd0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
23de0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23df0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
23e00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23e10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
23e20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
23e30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
23e40 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  fyFinal)(CK_SESS
23e50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23e60 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
23e70 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
23e80 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
23e90 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
23ea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23eb0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23ec0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23ed0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23ef0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23f00 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23f10 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23f20 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23f30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23f40 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23f50 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
23f60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23f70 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
23f80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23f90 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
23fa0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23fb0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
23fc0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23fd0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
23fe0 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f  RecoverInit)(CK_
23ff0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24000 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
24010 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
24020 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
24030 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
24040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24050 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
24060 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
24070 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
24080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24090 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
240a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
240b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
240c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
240d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
240e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
240f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
24100 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24110 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
24120 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24130 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
24140 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
24150 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24160 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
24170 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
24180 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28  _VerifyRecover)(
24190 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
241a0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
241b0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
241c0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
241d0 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f  ignatureLen, CK_
241e0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
241f0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
24200 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
24210 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24220 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24230 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24240 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24260 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24270 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24280 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24290 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
242a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
242b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
242c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
242d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
242e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
242f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24300 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
24310 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
24320 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
24330 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24340 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
24350 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
24360 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
24370 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
24380 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
24390 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
243a0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
243b0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
243c0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
243d0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
243e0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
243f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24400 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24410 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24420 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24430 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24440 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
24450 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24460 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
24470 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
24480 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24490 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
244a0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
244b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
244c0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
244d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
244e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
244f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24500 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
24510 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24520 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69  _RV, C_DecryptDi
24530 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53  gestUpdate)(CK_S
24540 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24550 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
24560 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
24570 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
24580 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
24590 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
245a0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
245b0 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
245c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
245d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
245e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
245f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
24600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24610 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
24620 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
24630 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
24640 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
24650 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
24660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24670 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
24680 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24690 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
246a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
246b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
246c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
246d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
246e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
246f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
24700 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61  _SignEncryptUpda
24710 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
24720 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
24730 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
24740 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
24750 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
24760 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
24770 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
24780 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
24790 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
247a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
247b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
247c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
247d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
247e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
247f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24800 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24810 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24820 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24830 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24840 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24850 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
24860 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
24870 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
24880 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24890 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
248a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
248b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
248c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
248d0 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
248e0 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b  VerifyUpdate)(CK
248f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
24900 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
24910 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
24920 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
24930 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
24940 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
24950 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
24960 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
24970 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24980 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24990 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
249a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
249b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
249c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
249d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
249e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
249f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24a00 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24a10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24a20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24a30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24a40 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
24a50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24a60 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
24a70 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
24a80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24a90 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
24aa0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24ab0 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28   C_GenerateKey)(
24ac0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
24ad0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
24ae0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
24af0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52  chanism, CK_ATTR
24b00 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
24b10 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
24b20 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
24b30 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
24b40 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
24b50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24b60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24b70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24b80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24b90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24ba0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
24bb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24bc0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
24bd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
24be0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24bf0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24c00 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
24c10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
24c20 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
24c30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24c40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
24c50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24c60 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
24c70 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24c80 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b  _RV, C_GenerateK
24c90 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49  eyPair)(CK_SESSI
24ca0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
24cb0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
24cc0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
24cd0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
24ce0 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70  R pPublicKeyTemp
24cf0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
24d00 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62  lPublicKeyAttrib
24d10 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54  uteCount, CK_ATT
24d20 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76  RIBUTE_PTR pPriv
24d30 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  ateKeyTemplate, 
24d40 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61  CK_ULONG ulPriva
24d50 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f  teKeyAttributeCo
24d60 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
24d70 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c  ANDLE_PTR phPubl
24d80 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  icKey, CK_OBJECT
24d90 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72  _HANDLE_PTR phPr
24da0 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43  ivateKey) {..CAC
24db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24dc0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24dd0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24de0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24e00 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
24e10 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
24e20 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
24e30 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
24e40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
24e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24e60 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
24e70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24e80 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
24e90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24ea0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
24eb0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
24ec0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
24ed0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
24ee0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72  TION(CK_RV, C_Wr
24ef0 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
24f00 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
24f10 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
24f20 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
24f30 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
24f40 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43   hWrappingKey, C
24f50 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
24f60 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  hKey, CK_BYTE_PT
24f70 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
24f80 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57  K_ULONG_PTR pulW
24f90 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a  rappedKeyLen) {.
24fa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24fb0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24fc0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
24fd0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
24fe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24ff0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
25000 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
25010 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
25020 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
25030 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
25040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25050 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
25060 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25070 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
25080 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25090 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
250a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
250b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
250c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
250d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
250e0 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f  C_UnwrapKey)(CK_
250f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
25100 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
25110 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
25120 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
25130 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69  HANDLE hUnwrappi
25140 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50  ngKey, CK_BYTE_P
25150 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
25160 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70  CK_ULONG ulWrapp
25170 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54  edKeyLen, CK_ATT
25180 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
25190 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
251a0 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
251b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
251c0 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
251d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
251e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
251f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
25200 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
25210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25220 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
25230 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
25240 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
25250 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
25260 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
25270 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25280 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
25290 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
252a0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
252b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
252c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
252d0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
252e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
252f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
25300 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
25310 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53  _DeriveKey)(CK_S
25320 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25330 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
25340 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
25350 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
25360 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20  ANDLE hBaseKey, 
25370 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
25380 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
25390 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65  LONG ulAttribute
253a0 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
253b0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
253c0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
253d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
253e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
253f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
25400 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25410 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25420 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
25430 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
25440 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
25450 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
25460 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25470 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25480 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
25490 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
254a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
254b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
254c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
254d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
254e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
254f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
25500 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f  _RV, C_SeedRando
25510 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  m)(CK_SESSION_HA
25520 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
25530 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64  K_BYTE_PTR pSeed
25540 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65  , CK_ULONG ulSee
25550 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  dLen) {..CACKEY_
25560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25570 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
25580 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
25590 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
255a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
255b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
255c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
255d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
255e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
255f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
25600 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25610 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
25620 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
25630 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
25640 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25650 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
25660 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25670 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
25680 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25690 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
256a0 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53  teRandom)(CK_SES
256b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
256c0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
256d0 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43  R pRandomData, C
256e0 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d  K_ULONG ulRandom
256f0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
25700 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25710 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
25720 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25730 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
25740 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25750 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
25760 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
25770 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
25780 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25790 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
257a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
257b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
257c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
257d0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
257e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
257f0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
25800 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25810 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  PPORTED);.}../* 
25820 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74  Deprecated Funct
25830 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  ion */.CK_DEFINE
25840 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25850 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74   C_GetFunctionSt
25860 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  atus)(CK_SESSION
25870 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
25880 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
25890 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
258a0 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
258b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
258c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
258d0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20  ON_NOT_PARALLEL 
258e0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
258f0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
25900 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
25910 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
25920 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69  ALLEL);...hSessi
25930 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f  on = hSession; /
25940 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
25950 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
25960 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65  g */.}../* Depre
25970 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a  cated Function *
25980 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
25990 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61  TION(CK_RV, C_Ca
259a0 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b  ncelFunction)(CK
259b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
259c0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43  hSession) {..CAC
259d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
259e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
259f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25a00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
25a10 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
25a20 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43  ARALLEL (%i)", C
25a30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25a40 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74  PARALLEL);...ret
25a50 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
25a60 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
25a70 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65  ..hSession = hSe
25a80 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73  ssion; /* Supres
25a90 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
25aa0 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
25ab0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
25ac0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46  ON(CK_RV, C_GetF
25ad0 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f  unctionList)(CK_
25ae0 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54  FUNCTION_LIST_PT
25af0 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e  R_PTR ppFunction
25b00 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43  List) {..CK_FUNC
25b10 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46  TION_LIST_PTR pF
25b20 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
25b30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25b40 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
25b50 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c  .if (ppFunctionL
25b60 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
25b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25b80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46  INTF("Error. ppF
25b90 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e  unctionList is N
25ba0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
25bb0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
25bc0 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63  BAD);..}...pFunc
25bd0 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f  tionList = mallo
25be0 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74  c(sizeof(*pFunct
25bf0 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75  ionList));...pFu
25c00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
25c10 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
25c20 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
25c30 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
25c40 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e  6) & 0xff;..pFun
25c50 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
25c60 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
25c70 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
25c80 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
25c90 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63   & 0xff;...pFunc
25ca0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
25cb0 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69  ialize = C_Initi
25cc0 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  alize;..pFunctio
25cd0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a  nList->C_Finaliz
25ce0 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a  e = C_Finalize;.
25cf0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
25d00 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65  C_GetInfo = C_Ge
25d10 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  tInfo;..pFunctio
25d20 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
25d30 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74  List = C_GetSlot
25d40 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  List;..pFunction
25d50 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49  List->C_GetSlotI
25d60 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49  nfo = C_GetSlotI
25d70 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
25d80 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49  ist->C_GetTokenI
25d90 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e  nfo = C_GetToken
25da0 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
25db0 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53  List->C_WaitForS
25dc0 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69  lotEvent = C_Wai
25dd0 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09  tForSlotEvent;..
25de0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
25df0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73  _GetMechanismLis
25e00 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  t = C_GetMechani
25e10 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69  smList;..pFuncti
25e20 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
25e30 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47  hanismInfo = C_G
25e40 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b  etMechanismInfo;
25e50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
25e60 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43  >C_InitToken = C
25e70 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75  _InitToken;..pFu
25e80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
25e90 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49  itPIN = C_InitPI
25ea0 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  N;..pFunctionLis
25eb0 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f  t->C_SetPIN = C_
25ec0 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69  SetPIN;..pFuncti
25ed0 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65  onList->C_OpenSe
25ee0 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65  ssion = C_OpenSe
25ef0 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
25f00 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65  nList->C_CloseSe
25f10 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53  ssion = C_CloseS
25f20 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
25f30 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41  onList->C_CloseA
25f40 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43  llSessions = C_C
25f50 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b  loseAllSessions;
25f60 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
25f70 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66  >C_GetSessionInf
25f80 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e  o = C_GetSession
25f90 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
25fa0 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61  List->C_GetOpera
25fb0 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65  tionState = C_Ge
25fc0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b  tOperationState;
25fd0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
25fe0 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53  >C_SetOperationS
25ff0 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72  tate = C_SetOper
26000 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75  ationState;..pFu
26010 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f  nctionList->C_Lo
26020 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09  gin = C_Login;..
26030 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
26040 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f  _Logout = C_Logo
26050 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ut;..pFunctionLi
26060 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65  st->C_CreateObje
26070 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a  ct = C_CreateObj
26080 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
26090 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63  ist->C_CopyObjec
260a0 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74  t = C_CopyObject
260b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
260c0 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  ->C_DestroyObjec
260d0 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  t = C_DestroyObj
260e0 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
260f0 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74  ist->C_GetObject
26100 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65  Size = C_GetObje
26110 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ctSize;..pFuncti
26120 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74  onList->C_GetAtt
26130 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f  ributeValue = C_
26140 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
26150 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
26160 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74  t->C_SetAttribut
26170 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74  eValue = C_SetAt
26180 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70  tributeValue;..p
26190 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
261a0 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20  FindObjectsInit 
261b0 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  = C_FindObjectsI
261c0 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
261d0 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
261e0 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  ts = C_FindObjec
261f0 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ts;..pFunctionLi
26200 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
26210 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f  sFinal = C_FindO
26220 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46  bjectsFinal;..pF
26230 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
26240 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45  ncryptInit = C_E
26250 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75  ncryptInit;..pFu
26260 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
26270 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70  crypt = C_Encryp
26280 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
26290 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61  t->C_EncryptUpda
262a0 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70  te = C_EncryptUp
262b0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
262c0 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46  List->C_EncryptF
262d0 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74  inal = C_Encrypt
262e0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
262f0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
26300 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74  Init = C_Decrypt
26310 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
26320 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20  List->C_Decrypt 
26330 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46  = C_Decrypt;..pF
26340 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
26350 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ecryptUpdate = C
26360 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a  _DecryptUpdate;.
26370 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
26380 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d  C_DecryptFinal =
26390 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b   C_DecryptFinal;
263a0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
263b0 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20  >C_DigestInit = 
263c0 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70  C_DigestInit;..p
263d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
263e0 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73  Digest = C_Diges
263f0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
26400 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74  t->C_DigestUpdat
26410 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61  e = C_DigestUpda
26420 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
26430 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20  st->C_DigestKey 
26440 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09  = C_DigestKey;..
26450 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
26460 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43  _DigestFinal = C
26470 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70  _DigestFinal;..p
26480 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26490 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67  SignInit = C_Sig
264a0 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  nInit;..pFunctio
264b0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20  nList->C_Sign = 
264c0 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69  C_Sign;..pFuncti
264d0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70  onList->C_SignUp
264e0 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64  date = C_SignUpd
264f0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
26500 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c  ist->C_SignFinal
26510 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a   = C_SignFinal;.
26520 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
26530 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
26540 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  t = C_SignRecove
26550 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  rInit;..pFunctio
26560 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63  nList->C_SignRec
26570 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63  over = C_SignRec
26580 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  over;..pFunction
26590 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e  List->C_VerifyIn
265a0 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69  it = C_VerifyIni
265b0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
265c0 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f  t->C_Verify = C_
265d0 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69  Verify;..pFuncti
265e0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
265f0 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66  Update = C_Verif
26600 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  yUpdate;..pFunct
26610 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
26620 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66  yFinal = C_Verif
26630 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  yFinal;..pFuncti
26640 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
26650 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f  RecoverInit = C_
26660 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
26670 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
26680 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76  t->C_VerifyRecov
26690 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63  er = C_VerifyRec
266a0 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  over;..pFunction
266b0 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e  List->C_DigestEn
266c0 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
266d0 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
266e0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
266f0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69  ist->C_DecryptDi
26700 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44  gestUpdate = C_D
26710 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
26720 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
26730 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70  st->C_SignEncryp
26740 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  tUpdate = C_Sign
26750 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
26760 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
26770 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
26780 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
26790 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70  VerifyUpdate;..p
267a0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
267b0 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f  GenerateKey = C_
267c0 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46  GenerateKey;..pF
267d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
267e0 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d  enerateKeyPair =
267f0 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
26800 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ir;..pFunctionLi
26810 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20  st->C_WrapKey = 
26820 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e  C_WrapKey;..pFun
26830 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77  ctionList->C_Unw
26840 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61  rapKey = C_Unwra
26850 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  pKey;..pFunction
26860 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65  List->C_DeriveKe
26870 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b  y = C_DeriveKey;
26880 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
26890 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20  >C_SeedRandom = 
268a0 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70  C_SeedRandom;..p
268b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
268c0 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d  GenerateRandom =
268d0 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f   C_GenerateRando
268e0 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  m;..pFunctionLis
268f0 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  t->C_GetFunction
26900 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75  Status = C_GetFu
26910 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70  nctionStatus;..p
26920 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26930 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d  CancelFunction =
26940 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f   C_CancelFunctio
26950 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
26960 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  t->C_GetFunction
26970 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63  List = C_GetFunc
26980 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46  tionList;...*ppF
26990 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46  unctionList = pF
269a0 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
269b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
269c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
269d0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
269e0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
269f0 52 5f 4f 4b 29 3b 0a 7d 0a 0a                    R_OK);.}..