Hex Artifact Content

Artifact 5676179bd7f6b44a55bc30301c6e825ea957ffe8:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  if.#endif..#defi
02f0: 6e 65 20 43 4b 5f 50 54 52 20 2a 0a 23 64 65 66  ne CK_PTR *.#def
0300: 69 6e 65 20 43 4b 5f 44 45 46 49 4e 45 5f 46 55  ine CK_DEFINE_FU
0310: 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70  NCTION(returnTyp
0320: 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54  e, name) returnT
0330: 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65  ype name.#define
0340: 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43   CK_DECLARE_FUNC
0350: 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c  TION(returnType,
0360: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0370: 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43  e name.#define C
0380: 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49  K_DECLARE_FUNCTI
0390: 4f 4e 5f 50 4f 49 4e 54 45 52 28 72 65 74 75 72  ON_POINTER(retur
03a0: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
03b0: 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29  urnType (* name)
03c0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 43 41 4c 4c  .#define CK_CALL
03d0: 42 41 43 4b 5f 46 55 4e 43 54 49 4f 4e 28 72 65  BACK_FUNCTION(re
03e0: 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20  turnType, name) 
03f0: 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e 61  returnType (* na
0400: 6d 65 29 0a 23 69 66 6e 64 65 66 20 4e 55 4c 4c  me).#ifndef NULL
0410: 5f 50 54 52 0a 23 20 20 64 65 66 69 6e 65 20 4e  _PTR.#  define N
0420: 55 4c 4c 5f 50 54 52 20 30 0a 23 65 6e 64 69 66  ULL_PTR 0.#endif
0430: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73  ..#include "pkcs
0440: 31 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  11.h".#include "
0450: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 0a 23 69  asn1-x509.h"..#i
0460: 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43 52 59  fndef CACKEY_CRY
0470: 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
0480: 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  DE.#  define CAC
0490: 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
04a0: 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32 31 65  SION_CODE 0x021e
04b0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
04c0: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52  ef CKA_TRUST_SER
04d0: 56 45 52 5f 41 55 54 48 0a 23 20 20 64 65 66 69  VER_AUTH.#  defi
04e0: 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52  ne CKA_TRUST_SER
04f0: 56 45 52 5f 41 55 54 48 20 30 78 63 65 35 33 36  VER_AUTH 0xce536
0500: 33 35 38 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  358.#endif.#ifnd
0510: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  ef CKA_TRUST_CLI
0520: 45 4e 54 5f 41 55 54 48 0a 23 20 20 64 65 66 69  ENT_AUTH.#  defi
0530: 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  ne CKA_TRUST_CLI
0540: 45 4e 54 5f 41 55 54 48 20 30 78 63 65 35 33 36  ENT_AUTH 0xce536
0550: 33 35 39 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  359.#endif.#ifnd
0560: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  ef CKA_TRUST_COD
0570: 45 5f 53 49 47 4e 49 4e 47 0a 23 20 20 64 65 66  E_SIGNING.#  def
0580: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f  ine CKA_TRUST_CO
0590: 44 45 5f 53 49 47 4e 49 4e 47 20 30 78 63 65 35  DE_SIGNING 0xce5
05a0: 33 36 33 35 61 0a 23 65 6e 64 69 66 0a 23 69 66  3635a.#endif.#if
05b0: 6e 64 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 45  ndef CKA_TRUST_E
05c0: 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  MAIL_PROTECTION.
05d0: 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f 54 52  #  define CKA_TR
05e0: 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
05f0: 54 49 4f 4e 20 30 78 63 65 35 33 36 33 35 62 0a  TION 0xce53635b.
0600: 23 65 6e 64 69 66 0a 0a 2f 2a 20 47 53 43 2d 49  #endif../* GSC-I
0610: 53 20 76 32 2e 31 20 44 65 66 69 6e 69 74 69 6f  S v2.1 Definitio
0620: 6e 73 20 2a 2f 0a 2f 2a 2a 20 43 6c 61 73 73 65  ns */./** Classe
0630: 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53  s **/.#define GS
0640: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
0650: 36 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30  6           0x00
0660: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43  .#define GSCIS_C
0670: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
0680: 46 4f 52 4d 20 20 20 30 78 38 30 0a 0a 2f 2a 2a  FORM   0x80../**
0690: 20 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2a   Instructions **
06a0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
06b0: 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e  INSTR_GET_RESPON
06c0: 53 45 20 20 20 20 20 20 30 78 43 30 0a 23 64 65  SE      0xC0.#de
06d0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
06e0: 5f 52 45 41 44 5f 42 49 4e 41 52 59 20 20 20 20  _READ_BINARY    
06f0: 20 20 20 30 78 42 30 0a 23 64 65 66 69 6e 65 20     0xB0.#define 
0700: 47 53 43 49 53 5f 49 4e 53 54 52 5f 55 50 44 41  GSCIS_INSTR_UPDA
0710: 54 45 5f 42 49 4e 41 52 59 20 20 20 20 20 30 78  TE_BINARY     0x
0720: 44 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  D6.#define GSCIS
0730: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 20 20 20  _INSTR_SELECT   
0740: 20 20 20 20 20 20 20 20 20 30 78 41 34 0a 23 64           0xA4.#d
0750: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0760: 52 5f 45 58 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_EXTERNAL_AUTH 
0770: 20 20 20 20 30 78 38 32 0a 23 64 65 66 69 6e 65      0x82.#define
0780: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54   GSCIS_INSTR_GET
0790: 5f 43 48 41 4c 4c 45 4e 47 45 20 20 20 20 20 30  _CHALLENGE     0
07a0: 78 38 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x84.#define GSCI
07b0: 53 5f 49 4e 53 54 52 5f 49 4e 54 45 52 4e 41 4c  S_INSTR_INTERNAL
07c0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 38 0a 23  _AUTH     0x88.#
07d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
07e0: 54 52 5f 56 45 52 49 46 59 20 20 20 20 20 20 20  TR_VERIFY       
07f0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0800: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49  e GSCIS_INSTR_SI
0810: 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GN              
0820: 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x2A.#define GSC
0830: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52 4f  IS_INSTR_GET_PRO
0840: 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36 0a  P          0x56.
0850: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0860: 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20 20  STR_GET_ACR     
0870: 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66 69        0x4C.#defi
0880: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52  ne GSCIS_INSTR_R
0890: 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20 20  EAD_BUFFER      
08a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
08b0: 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45  CIS_INSTR_SIGNDE
08c0: 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34 32  CRYPT       0x42
08d0: 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  ..#define GSCIS_
08e0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
08f0: 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f 2a  LET     0x04../*
0900: 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a 20  * Tags **/./*** 
0910: 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23 64  CCC Tags ***/.#d
0920: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0930: 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20 20  CARDID          
0940: 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e 65      0xF0.#define
0950: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56   GSCIS_TAG_CCC_V
0960: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
0970: 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF1.#define GSCI
0980: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20 20  S_TAG_CCG_VER   
0990: 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a 23            0xF2.#
09a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09b0: 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20 20  _CARDURL        
09c0: 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69 6e       0xF3.#defin
09d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
09e0: 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  15              
09f0: 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF4.#define GSC
0a00: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
0a10: 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35 0a  MODEL      0xF5.
0a20: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a30: 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20 20  G_ACR_TABLE     
0a40: 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66 69        0xF6.#defi
0a50: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
0a60: 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20 20  D_APDU          
0a70: 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47 53   0xF7.#define GS
0a80: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
0a90: 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46 41  ION         0xFA
0aa0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ab0: 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20 20  AG_CT           
0ac0: 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65 66         0xFB.#def
0ad0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ine GSCIS_TAG_ST
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20 47    0xFC.#define G
0b00: 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43  SCIS_TAG_NEXTCCC
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46               0xF
0b20: 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c 20  D../*** General 
0b30: 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a 23  - EF 2200 ***/.#
0b40: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b50: 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _FNAME          
0b60: 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 6e       0x01.#defin
0b70: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d  e GSCIS_TAG_MNAM
0b80: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0b90: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0x02.#define GSC
0ba0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20 20  IS_TAG_LNAME    
0bb0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33 0a             0x03.
0bc0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bd0: 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20 20  G_SUFFIX        
0be0: 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66 69        0x04.#defi
0bf0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56  ne GSCIS_TAG_GOV
0c00: 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20 20  T_AGENCY        
0c10: 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47 53   0x05.#define GS
0c20: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20 20  CIS_TAG_BUREAU  
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 36              0x06
0c40: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c50: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20 20  AG_BUREAU_CODE  
0c60: 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65 66         0x07.#def
0c70: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ine GSCIS_TAG_DE
0c80: 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20 20  PT_CODE         
0c90: 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20 47    0x08.#define G
0ca0: 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20 20  SCIS_TAG_TITLE  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0cc0: 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  9.#define GSCIS_
0cd0: 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20 20  TAG_BUILDING    
0ce0: 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64 65          0x10.#de
0cf0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d00: 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20 20  FFICE_ADDR1     
0d10: 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65 20     0x11.#define 
0d20: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d30: 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30 78  _ADDR2        0x
0d40: 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  12.#define GSCIS
0d50: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59  _TAG_OFFICE_CITY
0d60: 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23 64           0x13.#d
0d70: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d80: 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20 20  OFFICE_STATE    
0d90: 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e 65      0x14.#define
0da0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0db0: 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20 30  E_ZIP          0
0dc0: 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x15.#define GSCI
0dd0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
0de0: 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a 23  NTRY      0x16.#
0df0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e00: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20 20  _OFFICE_PHONE   
0e10: 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69 6e       0x17.#defin
0e20: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e30: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20 20  CE_PHONE_EXT    
0e40: 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x18.#define GSC
0e50: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41  IS_TAG_OFFICE_FA
0e60: 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39 0a  X          0x19.
0e70: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e80: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20 20  G_OFFICE_EMAIL  
0e90: 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66 69        0x1A.#defi
0ea0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0eb0: 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20 20  ICE_ROOM        
0ec0: 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47 53   0x1B.#define GS
0ed0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
0ee0: 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31 43  GENCY       0x1C
0ef0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f00: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
0f10: 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a 2a  R      0x1D../**
0f20: 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30 20  * PII - EF 2100 
0f30: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
0f40: 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20 20  IS_TAG_SSN      
0f50: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0f60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0f70: 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20 20  G_DOB           
0f80: 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66 69        0x21.#defi
0f90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  ne GSCIS_TAG_GEN
0fa0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
0fb0: 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67 69   0x22../*** Logi
0fc0: 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  n Information - 
0fd0: 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64 65  EF 4000 ***/.#de
0fe0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 55  fine GSCIS_TAG_U
0ff0: 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20 20  SERID           
1000: 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 20     0x40.#define 
1010: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
1030: 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  41.#define GSCIS
1040: 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20 20  _TAG_PASSWORD   
1050: 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a 2f           0x42../
1060: 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d 61  *** Card Informa
1070: 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20 2a  tion - EF 5000 *
1080: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
1090: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20 20  S_TAG_ISSUERID  
10a0: 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a 23            0x50.#
10b0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10c0: 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20 20  _SERNO          
10d0: 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69 6e       0x51.#defin
10e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
10f0: 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20 20  E_DATE          
1100: 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0x52.#define GSC
1110: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41  IS_TAG_EXPIRE_DA
1120: 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33 0a  TE         0x53.
1130: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1140: 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20 20  G_CARD_TYPE     
1150: 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66 69        0x54.#defi
1160: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43  ne GSCIS_TAG_SEC
1170: 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20 20  URITY_CODE      
1180: 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47 53   0x57.#define GS
1190: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
11a0: 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35 38  ID          0x58
11b0: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
11c0: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
11d0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
11e0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
11f0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1200: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1210: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1220: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
1230: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
1240: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
1250: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
1260: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
1270: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
12a0: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
12b0: 78 44 42 2c 20 30 78 30 30 0a 0a 2f 2a 20 4d 61  xDB, 0x00../* Ma
12c0: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 64 61  ximum size of da
12d0: 74 61 20 70 6f 72 74 69 6f 6e 20 6f 66 20 41 50  ta portion of AP
12e0: 44 55 73 20 2a 2f 0a 2f 2a 2a 20 44 6f 20 6e 6f  DUs */./** Do no
12f0: 74 20 73 65 74 20 74 68 69 73 20 61 62 6f 76 65  t set this above
1300: 20 32 35 30 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   250 **/.#define
1310: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
1330: 35 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  50..#ifdef CACKE
1340: 59 5f 44 45 42 55 47 0a 0a 23 20 20 64 65 66 69  Y_DEBUG..#  defi
1350: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
1360: 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 66  PRINTF(x...) { f
1370: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1380: 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66 75  %s():%i: ", __fu
1390: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  nc__, __LINE__);
13a0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
13b0: 20 78 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64   x); fprintf(std
13c0: 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75  err, "\n"); fflu
13d0: 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20  sh(stderr); }.# 
13e0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
13f0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c  EBUG_PRINTBUF(f,
1400: 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67 6e 65   x, y) { unsigne
1410: 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46 3b 20  d char *TMPBUF; 
1420: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1430: 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75 6e 73  x; TMPBUF = (uns
1440: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78  igned char *) (x
1450: 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  ); fprintf(stder
1460: 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 25 73 20  r, "%s():%i: %s 
1470: 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78   (%s/%lu = {%02x
1480: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
1490: 49 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75  INE__, f, #x, (u
14a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79  nsigned long) (y
14b0: 29 2c 20 54 4d 50 42 55 46 5b 30 5d 29 3b 20 66  ), TMPBUF[0]); f
14c0: 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
14d0: 20 3c 20 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b   < (y); idx++) {
14e0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14f0: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1500: 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72 69  F[idx]); }; fpri
1510: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7d 29 5c  ntf(stderr, "})\
1520: 6e 22 29 3b 20 66 66 6c 75 73 68 28 73 74 64 65  n"); fflush(stde
1530: 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65  rr); }.#  define
1540: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45   CACKEY_DEBUG_PE
1550: 52 52 4f 52 28 78 29 20 7b 20 66 70 72 69 6e 74  RROR(x) { fprint
1560: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a  f(stderr, "%s():
1570: 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c  %i: ", __func__,
1580: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 70 65 72 72   __LINE__); perr
1590: 6f 72 28 78 29 3b 20 66 66 6c 75 73 68 28 73 74  or(x); fflush(st
15a0: 64 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69  derr); }.#  defi
15b0: 6e 65 20 66 72 65 65 28 78 29 20 7b 20 43 41 43  ne free(x) { CAC
15c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15d0: 28 22 46 52 45 45 28 25 70 29 20 28 25 73 29 22  ("FREE(%p) (%s)"
15e0: 2c 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78  , x, #x); free(x
15f0: 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  ); }..static voi
1600: 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  d *CACKEY_DEBUG_
1610: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65  FUNC_MALLOC(size
1620: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
1630: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
1640: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
1650: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
1660: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a   malloc(size);..
1670: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
1680: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75   "%s():%i: ", fu
1690: 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69  nc, line);..fpri
16a0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4d 41 4c  ntf(stderr, "MAL
16b0: 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65 74  LOC() = %p", ret
16c0: 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28 73  val);..fprintf(s
16d0: 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 09 66  tderr, "\n");..f
16e0: 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 0a 0a  flush(stderr);..
16f0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1700: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1710: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
1720: 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20  NC_REALLOC(void 
1730: 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a  *ptr, size_t siz
1740: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  e, const char *f
1750: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
1760: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
1770: 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
1780: 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a  oc(ptr, size);..
1790: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70  .if (retval != p
17a0: 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  tr) {...fprintf(
17b0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
17c0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
17d0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  ;...fprintf(stde
17e0: 72 72 2c 20 22 52 45 41 4c 4c 4f 43 28 25 70 29  rr, "REALLOC(%p)
17f0: 20 3d 20 25 70 22 2c 20 70 74 72 2c 20 72 65 74   = %p", ptr, ret
1800: 76 61 6c 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  val);...fprintf(
1810: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 09  stderr, "\n");..
1820: 09 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b  .fflush(stderr);
1830: 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ..}...if (retval
1840: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1850: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1860: 46 28 22 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a  F(" *** ERROR **
1870: 2a 20 72 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e  * realloc return
1880: 65 64 20 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20  ed NULL (size = 
1890: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
18a0: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d   long) size);..}
18b0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
18c0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  );.}..static cha
18d0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
18e0: 46 55 4e 43 5f 53 54 52 44 55 50 28 63 6f 6e 73  FUNC_STRDUP(cons
18f0: 74 20 63 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e  t char *ptr, con
1900: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69  st char *func, i
1910: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72  nt line) {..char
1920: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
1930: 61 6c 20 3d 20 73 74 72 64 75 70 28 70 74 72 29  al = strdup(ptr)
1940: 3b 0a 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65  ;...fprintf(stde
1950: 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  rr, "%s():%i: ",
1960: 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66   func, line);..f
1970: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1980: 53 54 52 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20  STRDUP_MALLOC() 
1990: 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a  = %p", retval);.
19a0: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
19b0: 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28   "\n");..fflush(
19c0: 73 74 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72  stderr);...retur
19d0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
19e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
19f0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
1a00: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e  NC_TAG_TO_STR(un
1a10: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 29  signed char tag)
1a20: 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67 29   {..switch (tag)
1a30: 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f   {...case GSCIS_
1a40: 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72  TAG_CARDID:....r
1a50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1a60: 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73  _CARDID");...cas
1a70: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
1a80: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
1a90: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45  GSCIS_TAG_CCC_VE
1aa0: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
1ab0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09  S_TAG_CCG_VER:..
1ac0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1ad0: 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09  TAG_CCG_VER");..
1ae0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1af0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75  CARDURL:....retu
1b00: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1b10: 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20  RDURL");...case 
1b20: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
1b30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1b40: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b  IS_TAG_PKCS15");
1b50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1b60: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
1b70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1b80: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
1b90: 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  MODEL");...case 
1ba0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
1bb0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
1bc0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
1bd0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  BLE");...case GS
1be0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
1bf0: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
1c00: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
1c10: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
1c20: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f  S_TAG_REDIRECTIO
1c30: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
1c40: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
1c50: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ION");...case GS
1c60: 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72  CIS_TAG_CT:....r
1c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1c80: 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _CT");...case GS
1c90: 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72  CIS_TAG_ST:....r
1ca0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1cb0: 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _ST");...case GS
1cc0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a  CIS_TAG_NEXTCCC:
1cd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1ce0: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b  S_TAG_NEXTCCC");
1cf0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d00: 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_FNAME:....retu
1d10: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e  rn("GSCIS_TAG_FN
1d20: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
1d30: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09  CIS_TAG_MNAME:..
1d40: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1d50: 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_MNAME");...c
1d60: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e  ase GSCIS_TAG_LN
1d70: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
1d80: 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22  GSCIS_TAG_LNAME"
1d90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1da0: 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72  TAG_SUFFIX:....r
1db0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1dc0: 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73  _SUFFIX");...cas
1dd0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54  e GSCIS_TAG_GOVT
1de0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
1df0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f  rn("GSCIS_TAG_GO
1e00: 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  VT_AGENCY");...c
1e10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
1e20: 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28  REAU:....return(
1e30: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41  "GSCIS_TAG_BUREA
1e40: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
1e50: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44  S_TAG_BUREAU_COD
1e60: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1e70: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
1e80: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
1e90: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
1ea0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1eb0: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
1ec0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1ed0: 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09  S_TAG_TITLE:....
1ee0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ef0: 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73  G_TITLE");...cas
1f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
1f10: 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28  DING:....return(
1f20: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44  "GSCIS_TAG_BUILD
1f30: 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ING");...case GS
1f40: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
1f50: 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  DDR1:....return(
1f60: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1f70: 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73  E_ADDR1");...cas
1f80: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1f90: 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74  CE_ADDR2:....ret
1fa0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1fb0: 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09  FFICE_ADDR2");..
1fc0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1fd0: 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09  OFFICE_CITY:....
1fe0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ff0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b  G_OFFICE_CITY");
2000: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2010: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a  G_OFFICE_STATE:.
2020: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2030: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
2040: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2050: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
2060: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2070: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
2080: 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  P");...case GSCI
2090: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
20a0: 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  NTRY:....return(
20b0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
20c0: 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63  E_COUNTRY");...c
20d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
20e0: 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72  FICE_PHONE:....r
20f0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2100: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b  _OFFICE_PHONE");
2110: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2120: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
2130: 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  XT:....return("G
2140: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2150: 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63  PHONE_EXT");...c
2160: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2170: 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74  FICE_FAX:....ret
2180: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2190: 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63  FFICE_FAX");...c
21a0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
21b0: 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72  FICE_EMAIL:....r
21c0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
21d0: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b  _OFFICE_EMAIL");
21e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
21f0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09  G_OFFICE_ROOM:..
2200: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2210: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22  TAG_OFFICE_ROOM"
2220: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2230: 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43  TAG_NONGOV_AGENC
2240: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2250: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2260: 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20  GENCY");...case 
2270: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
2280: 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74  SIGNATOR:....ret
2290: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
22a0: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b  SN_DESIGNATOR");
22b0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22c0: 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e  G_SSN:....return
22d0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22  ("GSCIS_TAG_SSN"
22e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
22f0: 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75  TAG_DOB:....retu
2300: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2310: 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  B");...case GSCI
2320: 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09  S_TAG_GENDER:...
2330: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2340: 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63  AG_GENDER");...c
2350: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53  ase GSCIS_TAG_US
2360: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2370: 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49  "GSCIS_TAG_USERI
2380: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2390: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09  S_TAG_DOMAIN:...
23a0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
23b0: 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63  AG_DOMAIN");...c
23c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41  ase GSCIS_TAG_PA
23d0: 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72  SSWORD:....retur
23e0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53  n("GSCIS_TAG_PAS
23f0: 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20  SWORD");...case 
2400: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52  GSCIS_TAG_ISSUER
2410: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2420: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49  SCIS_TAG_ISSUERI
2430: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2440: 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09  S_TAG_SERNO:....
2450: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2460: 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73  G_SERNO");...cas
2470: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2480: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
2490: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
24a0: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  UE_DATE");...cas
24b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
24c0: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
24d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58  rn("GSCIS_TAG_EX
24e0: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  PIRE_DATE");...c
24f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2500: 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  RD_TYPE:....retu
2510: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2520: 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  RD_TYPE");...cas
2530: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55  e GSCIS_TAG_SECU
2540: 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65  RITY_CODE:....re
2550: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2560: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b  SECURITY_CODE");
2570: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2580: 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09  G_CARDID_AID:...
2590: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
25a0: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b  AG_CARDID_AID");
25b0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
25c0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
25d0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25e0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 22  TAG_CERTIFICATE"
25f0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2600: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
2610: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2630: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2640: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
2650: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  RT_EXPIRE_DATE:.
2660: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2670: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
2680: 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  _DATE");..}...re
2690: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
26a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
26b0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
26c0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
26d0: 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65  R_TO_STR(LONG re
26e0: 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68  tcode) {..switch
26f0: 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63   (retcode) {...c
2700: 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43  ase SCARD_S_SUCC
2710: 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ESS:....return("
2720: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22  SCARD_S_SUCCESS"
2730: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2740: 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09  E_CANCELLED:....
2750: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2760: 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63  CANCELLED");...c
2770: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54  ase SCARD_E_CANT
2780: 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74  _DISPOSE:....ret
2790: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
27a0: 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63  T_DISPOSE");...c
27b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55  ase SCARD_E_INSU
27c0: 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a  FFICIENT_BUFFER:
27d0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
27e0: 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  D_E_INSUFFICIENT
27f0: 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73  _BUFFER");...cas
2800: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2810: 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e  D_ATR:....return
2820: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
2830: 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20  D_ATR");...case 
2840: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2850: 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72  HANDLE:....retur
2860: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
2870: 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63  ID_HANDLE");...c
2880: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2890: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09  LID_PARAMETER:..
28a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
28b0: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
28c0: 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TER");...case SC
28d0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
28e0: 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  RGET:....return(
28f0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
2900: 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73  _TARGET");...cas
2910: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2920: 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  D_VALUE:....retu
2930: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
2940: 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63  LID_VALUE");...c
2950: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  ase SCARD_E_NO_M
2960: 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e  EMORY:....return
2970: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d  ("SCARD_E_NO_MEM
2980: 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ORY");...case SC
2990: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
29a0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
29b0: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e  "SCARD_E_UNKNOWN
29c0: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
29d0: 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  e SCARD_E_TIMEOU
29e0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
29f0: 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b  ARD_E_TIMEOUT");
2a00: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2a10: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
2a20: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  N:....return("SC
2a30: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
2a40: 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  OLATION");...cas
2a50: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41  e SCARD_E_NO_SMA
2a60: 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  RTCARD:....retur
2a70: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d  n("SCARD_E_NO_SM
2a80: 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ARTCARD");...cas
2a90: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
2aa0: 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  N_CARD:....retur
2ab0: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
2ac0: 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  WN_CARD");...cas
2ad0: 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  e SCARD_E_PROTO_
2ae0: 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74  MISMATCH:....ret
2af0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f  urn("SCARD_E_PRO
2b00: 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09  TO_MISMATCH");..
2b10: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
2b20: 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75  T_READY:....retu
2b30: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
2b40: 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20  READY");...case 
2b50: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
2b60: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
2b70: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53  urn("SCARD_E_SYS
2b80: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  TEM_CANCELLED");
2b90: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2ba0: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a  NOT_TRANSACTED:.
2bb0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2bc0: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
2bd0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2be0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
2bf0: 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  ILABLE:....retur
2c00: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
2c10: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b  R_UNAVAILABLE");
2c20: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2c30: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
2c40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2c50: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
2c60: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2c70: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
2c80: 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65  SIVE_CARD:....re
2c90: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
2ca0: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22  RESPONSIVE_CARD"
2cb0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2cc0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
2cd0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2ce0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
2cf0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
2d00: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
2d10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2d20: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22  RD_W_RESET_CARD"
2d30: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d40: 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a  W_REMOVED_CARD:.
2d50: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2d60: 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22  _W_REMOVED_CARD"
2d70: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d80: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a  E_PCI_TOO_SMALL:
2d90: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2da0: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
2db0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  L");...case SCAR
2dc0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
2dd0: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72  PORTED:....retur
2de0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
2df0: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  R_UNSUPPORTED");
2e00: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2e10: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
2e20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2e30: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
2e40: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20  EADER");...case 
2e50: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
2e60: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
2e70: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52  urn("SCARD_E_CAR
2e80: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  D_UNSUPPORTED");
2e90: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2ea0: 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72  NO_SERVICE:....r
2eb0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
2ec0: 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63  O_SERVICE");...c
2ed0: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56  ase SCARD_E_SERV
2ee0: 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09  ICE_STOPPED:....
2ef0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2f00: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22  SERVICE_STOPPED"
2f10: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2f20: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
2f30: 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e  ATURE:....return
2f40: 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  ("SCARD_E_UNSUPP
2f50: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b  ORTED_FEATURE");
2f60: 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 57 5f  .#ifdef SCARD_W_
2f70: 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a 09 09  INSERTED_CARD...
2f80: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53  case SCARD_W_INS
2f90: 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ERTED_CARD:....r
2fa0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49  eturn("SCARD_W_I
2fb0: 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a  NSERTED_CARD");.
2fc0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 43  #endif.#ifdef SC
2fd0: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53  ARD_E_NO_READERS
2fe0: 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73  _AVAILABLE...cas
2ff0: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  e SCARD_E_NO_REA
3000: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a  DERS_AVAILABLE:.
3010: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3020: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3030: 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69  AILABLE");.#endi
3040: 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  f..}...return("U
3050: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
3060: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3070: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3080: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75  C_OBJID_TO_STR(u
3090: 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b  int16_t objid) {
30a0: 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29  ..switch (objid)
30b0: 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30 30   {...case 0x2000
30c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30d0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45  KEY_TLV_OBJID_GE
30e0: 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  NERALINFO");...c
30f0: 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72  ase 0x2100:....r
3100: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3110: 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f  V_OBJID_PROPERSO
3120: 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  NALINFO");...cas
3130: 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74  e 0x3000:....ret
3140: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3150: 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54  OBJID_ACCESSCONT
3160: 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ROL");...case 0x
3170: 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  4000:....return(
3180: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3190: 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73  D_LOGIN");...cas
31a0: 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74  e 0x5000:....ret
31b0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
31c0: 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29  OBJID_CARDINFO")
31d0: 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 30 3a  ;...case 0x6000:
31e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
31f0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
3200: 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73  METRICS");...cas
3210: 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74  e 0x7000:....ret
3220: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3230: 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47  OBJID_DIGITALSIG
3240: 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30  CERT");...case 0
3250: 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x0200:....return
3260: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3270: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b  ID_CAC_PERSON");
3280: 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a  ...case 0x0202:.
3290: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
32a0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
32b0: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
32c0: 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65  se 0x0203:....re
32d0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
32e0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
32f0: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
3300: 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65  se 0x0201:....re
3310: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3320: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3330: 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30  NNEL");...case 0
3340: 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e  x02FE:....return
3350: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3360: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29  ID_CAC_PKICERT")
3370: 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22  ;..}....return("
3380: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
3390: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
33a0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
33b0: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
33c0: 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70  R(uint8_t apptyp
33d0: 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70  e) {..switch (ap
33e0: 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  ptype) {...case 
33f0: 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x00:....return(
3400: 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20  "NONE");...case 
3410: 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x01:....return(
3420: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3430: 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73  GENERIC");...cas
3440: 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72  e 0x02:....retur
3450: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3460: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_SKI");...case 
3470: 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x03:....return(
3480: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3490: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
34a0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
34b0: 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09  ..case 0x04:....
34c0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
34d0: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
34e0: 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65  case 0x05:....re
34f0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3500: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
3510: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3520: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36  I");...case 0x06
3530: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3540: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
3550: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
3560: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
3570: 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x07:....return("
3580: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
3590: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
35a0: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41  TLV_APP_SKI | CA
35b0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
35c0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
35d0: 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 23  "INVALID");.}..#
35e0: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28    define malloc(
35f0: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
3600: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f  FUNC_MALLOC(x, _
3610: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
3620: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61  _).#  define rea
3630: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45  lloc(x, y) CACKE
3640: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
3650: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e  LLOC(x, y, __fun
3660: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
3670: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23    ifdef strdup.#
3680: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70      undef strdup
3690: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66  .#  endif.#  def
36a0: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41  ine strdup(x) CA
36b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
36c0: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63  STRDUP(x, __func
36d0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65  __, __LINE__).#e
36e0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41  lse.#  define CA
36f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
3700: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  F(x...) /**/.#  
3710: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
3720: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20  BUG_PRINTBUF(f, 
3730: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x, y) /**/.#  de
3740: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
3750: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f  G_PERROR(x) /**/
3760: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
3770: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
3780: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
3790: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
37a0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
37b0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
37c0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
37d0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
37e0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
37f0: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
3800: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
3810: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
3820: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
3830: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
3840: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
3850: 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a  SABLED".#endif..
3860: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
3870: 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 75  sc_identity {..u
3880: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 70  nsigned char app
3890: 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f  let[7];..uint16_
38a0: 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f 74  t file;...size_t
38b0: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
38c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
38d0: 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a   *certificate;..
38e0: 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65  .ssize_t keysize
38f0: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3900: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  key_identity {..
3910: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
3920: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
3930: 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b  c_identity;...CK
3940: 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72  _ATTRIBUTE *attr
3950: 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e  ibutes;..CK_ULON
3960: 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  G attributes_cou
3970: 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  nt;.};..struct c
3980: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a  ackey_session {.
3990: 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43  .int active;...C
39a0: 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
39b0: 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61  ;...CK_STATE sta
39c0: 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c  te;..CK_FLAGS fl
39d0: 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  ags;..CK_ULONG u
39e0: 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43  lDeviceError;..C
39f0: 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
3a00: 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54  ication;..CK_NOT
3a10: 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74  IFY Notify;...st
3a20: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
3a30: 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
3a40: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
3a50: 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
3a60: 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f  t;...int search_
3a70: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52  active;..CK_ATTR
3a80: 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68  IBUTE_PTR search
3a90: 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e  _query;..CK_ULON
3aa0: 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  G search_query_c
3ab0: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
3ac0: 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72  long search_curr
3ad0: 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f  _id;...int sign_
3ae0: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
3af0: 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f  ANISM_TYPE sign_
3b00: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42  mechanism;..CK_B
3b10: 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66  YTE_PTR sign_buf
3b20: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
3b30: 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75   sign_buflen;..u
3b40: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67  nsigned long sig
3b50: 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75  n_bufused;..stru
3b60: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
3b70: 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74  ty *sign_identit
3b80: 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74  y;...int decrypt
3b90: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
3ba0: 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72  HANISM_TYPE decr
3bb0: 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ypt_mechanism;..
3bc0: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72  CK_VOID_PTR decr
3bd0: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09  ypt_mech_parm;..
3be0: 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74  CK_ULONG decrypt
3bf0: 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09  _mech_parmlen;..
3c00: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
3c10: 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f  entity *decrypt_
3c20: 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74  identity;.};..st
3c30: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
3c40: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
3c50: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
3c60: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f  der;...int pcsc_
3c70: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a  card_connected;.
3c80: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73  .SCARDHANDLE pcs
3c90: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72  c_card;...int tr
3ca0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b  ansaction_depth;
3cb0: 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65  ...int slot_rese
3cc0: 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f  t;...CK_FLAGS to
3cd0: 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73  ken_flags;...uns
3ce0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65  igned char *labe
3cf0: 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f  l;...DWORD proto
3d00: 63 6f 6c 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  col;.};..typedef
3d10: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
3d20: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20  TLV_APP_GENERIC 
3d30: 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f  = 0x01,..CACKEY_
3d40: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20  TLV_APP_SKI     
3d50: 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f  = 0x02,..CACKEY_
3d60: 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20  TLV_APP_PKI     
3d70: 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f  = 0x04.} cackey_
3d80: 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79  tlv_apptype;..ty
3d90: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
3da0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47  CKEY_TLV_OBJID_G
3db0: 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20  ENERALINFO      
3dc0: 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b   = 0x2000,..CACK
3dd0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f  EY_TLV_OBJID_PRO
3de0: 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d  PERSONALINFO   =
3df0: 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59   0x2100,..CACKEY
3e00: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53  _TLV_OBJID_ACCES
3e10: 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30  SCONTROL     = 0
3e20: 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x3000,..CACKEY_T
3e30: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20  LV_OBJID_LOGIN  
3e40: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 34             = 0x4
3e50: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
3e60: 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20  _OBJID_CARDINFO 
3e70: 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30 30           = 0x500
3e80: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
3e90: 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20  BJID_BIOMETRICS 
3ea0: 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c         = 0x6000,
3eb0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3ec0: 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52  ID_DIGITALSIGCER
3ed0: 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09  T    = 0x7000,..
3ee0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3ef0: 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20  _CAC_PERSON     
3f00: 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41     = 0x0200,..CA
3f10: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
3f20: 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20  AC_BENEFITS     
3f30: 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b   = 0x0202,..CACK
3f40: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3f50: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d  _OTHERBENEFITS =
3f60: 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59   0x0203,..CACKEY
3f70: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3f80: 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30  ERSONNEL     = 0
3f90: 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54  x0201,..CACKEY_T
3fa0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
3fb0: 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78 30  CERT       = 0x0
3fc0: 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  2FE.} cackey_tlv
3fd0: 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65  _objectid;..type
3fe0: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
3ff0: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
4000: 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09  RESENT    = 1,..
4010: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
4030: 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  0,..CACKEY_PCSC_
4040: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 20  E_GENERIC       
4050: 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f    = -1,..CACKEY_
4060: 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20  PCSC_E_BADPIN   
4070: 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41         = -2,..CA
4080: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
4090: 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33  ED          = -3
40a0: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
40b0: 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20  _NEEDLOGIN      
40c0: 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50   = -4,..CACKEY_P
40d0: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
40e0: 54 20 20 20 20 20 3d 20 2d 36 0a 7d 20 63 61 63  T     = -6.} cac
40f0: 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74  key_ret;..struct
4100: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64   cackey_tlv_card
4110: 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  url {..unsigned 
4120: 63 68 61 72 20 20 20 20 20 20 20 20 72 69 64 5b  char        rid[
4130: 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  5];..cackey_tlv_
4140: 61 70 70 74 79 70 65 20 20 20 61 70 70 74 79 70  apptype   apptyp
4150: 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f  e;..cackey_tlv_o
4160: 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69  bjectid  objecti
4170: 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f  d;..cackey_tlv_o
4180: 62 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a  bjectid  appid;.
4190: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20  .unsigned char  
41a0: 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a        pinid;.};.
41b0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
41c0: 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63  lv_entity;.struc
41d0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
41e0: 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74  ity {..uint8_t t
41f0: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
4200: 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09  th;...union {...
4210: 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73  void *value;...s
4220: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
4230: 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f  _cardurl *value_
4240: 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38  cardurl;...uint8
4250: 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09  _t value_byte;..
4260: 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b  };...struct cack
4270: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f  ey_tlv_entity *_
4280: 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43  next;.};../* CAC
4290: 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c  KEY Global Handl
42a0: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es */.static voi
42b0: 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  d *cackey_bigloc
42c0: 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63  k = NULL;.static
42d0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
42e0: 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65  ession cackey_se
42f0: 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61  ssions[128];.sta
4300: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
4310: 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c  y_slot cackey_sl
4320: 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63  ots[128];.static
4330: 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74   int cackey_init
4340: 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61  ialized = 0;.sta
4350: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62  tic int cackey_b
4360: 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b  iglock_init = 0;
4370: 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45  .CK_C_INITIALIZE
4380: 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67  _ARGS cackey_arg
4390: 73 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62  s;../* PCSC Glob
43a0: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74  al Handles */.st
43b0: 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54  atic LPSCARDCONT
43c0: 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  EXT cackey_pcsc_
43d0: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  handle = NULL;..
43e0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
43f0: 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76  long cackey_getv
4400: 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09  ersion(void) {..
4410: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
4420: 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35  long retval = 25
4430: 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  5;..unsigned lon
4440: 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e  g major = 0;..un
4450: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f  signed long mino
4460: 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61  r = 0;..char *ma
4470: 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a  jor_str = NULL;.
4480: 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72  .char *minor_str
4490: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45   = NULL;...CACKE
44a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
44b0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
44c0: 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20  (retval != 255) 
44d0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
44e0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
44f0: 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65 64  ng 0x%lx (cached
4500: 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ).", retval);...
4510: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
4520: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30  ..}...retval = 0
4530: 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47  ;..#ifdef PACKAG
4540: 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20  E_VERSION.      
4550: 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41    major_str = PA
4560: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09  CKAGE_VERSION;..
4570: 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b  if (major_str) {
4580: 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20  ..        major 
4590: 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f  = strtoul(major_
45a0: 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c  str, &minor_str,
45b0: 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e   10);....if (min
45c0: 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e  or_str) {....min
45d0: 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e  or = strtoul(min
45e0: 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c  or_str + 1, NULL
45f0: 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  , 10);...}..}...
4600: 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20  retval = (major 
4610: 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20  << 16) | (minor 
4620: 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  << 8);.#endif...
4630: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4640: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
4650: 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a  x%lx", retval);.
4660: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
4670: 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65  ;.}../* PC/SC Re
4680: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  lated Functions 
4690: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  */./*. * SYNPOSI
46a0: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
46b0: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
46c0: 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b  nnect_all(void);
46d0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
46e0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
46f0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
4700: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
4710: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
4720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73  his function dis
4730: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c  connects from al
4740: 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a  l cards.. *. */.
4750: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
4760: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
4770: 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a  ect_all(void) {.
4780: 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a  .uint32_t idx;..
4790: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
47a0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
47b0: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
47c0: 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
47d0: 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
47e0: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
47f0: 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
4800: 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
4810: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
4820: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
4830: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
4840: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69  _PRINTF("SCardDi
4850: 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61  sconnect(%lu) ca
4860: 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64  lled", (unsigned
4870: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09   long) idx);....
4880: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
4890: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
48a0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  x].pcsc_card, SC
48b0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
48c0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
48d0: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
48e0: 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63  bel) {....free(c
48f0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
4900: 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63  .label);.....cac
4910: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
4920: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
4930: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
4940: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f  [idx].pcsc_card_
4950: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
4960: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
4970: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
4980: 65 70 74 68 20 3d 20 30 3b 0a 0a 09 09 69 66 20  epth = 0;....if 
4990: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
49a0: 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
49b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
49c0: 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74  NTF("Marking act
49d0: 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20  ive slot %lu as 
49e0: 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75  being reset", (u
49f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
4a00: 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  x);...}....cacke
4a10: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f  y_slots[idx].slo
4a20: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a  t_reset = 1;..}.
4a30: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4a40: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
4a50: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ");...return;.}.
4a60: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
4a70: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
4a80: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
4a90: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
4aa0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
4ab0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
4ac0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
4ad0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
4ae0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
4af0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
4b00: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
4b10: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
4b20: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
4b30: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
4b40: 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65   connects to the
4b50: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
4b60: 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70  n Manager and up
4b70: 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20  dates the. *    
4b80: 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a   global handle..
4b90: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
4ba0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
4bb0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69  pcsc_connect(voi
4bc0: 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  d) {..LONG scard
4bd0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4be0: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43  ;.#ifdef HAVE_SC
4bf0: 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58  ARDISVALIDCONTEX
4c00: 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73  T..LONG scard_is
4c10: 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69  valid_ret;.#endi
4c20: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
4c30: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
4c40: 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ");...if (cackey
4c50: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
4c60: 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
4c70: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d  _pcsc_handle = m
4c80: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
4c90: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4ca0: 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ));...if (cackey
4cb0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
4cc0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  NULL) {....CACKE
4cd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4ce0: 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29  Call to malloc()
4cf0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
4d00: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
4d10: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
4d20: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
4d30: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
4d40: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
4d50: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  ERIC);...}....CA
4d60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4d70: 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73  F("SCardEstablis
4d80: 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65  hContext() calle
4d90: 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74  d");...scard_est
4da0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53  _context_ret = S
4db0: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
4dc0: 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45  text(SCARD_SCOPE
4dd0: 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e  _SYSTEM, NULL, N
4de0: 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63  ULL, cackey_pcsc
4df0: 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28  _handle);...if (
4e00: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
4e10: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
4e20: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43  _SUCCESS) {....C
4e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4e40: 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72  TF("Call to SCar
4e50: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
4e60: 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e  t failed (return
4e70: 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75  ed %s/%li), retu
4e80: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
4e90: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
4ea0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
4eb0: 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63  _STR(scard_est_c
4ec0: 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f  ontext_ret), (lo
4ed0: 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ng) scard_est_co
4ee0: 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09  ntext_ret);.....
4ef0: 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63  free(cackey_pcsc
4f00: 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63  _handle);....cac
4f10: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
4f20: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b  = NULL;.....cack
4f30: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
4f40: 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72  ect_all();.....r
4f50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
4f60: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
4f70: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56  }..}..#ifdef HAV
4f80: 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f  E_SCARDISVALIDCO
4f90: 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45  NTEXT..CACKEY_DE
4fa0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
4fb0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
4fc0: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61  ) called");..sca
4fd0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d  rd_isvalid_ret =
4fe0: 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e   SCardIsValidCon
4ff0: 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  text(*cackey_pcs
5000: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28  c_handle);..if (
5010: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
5020: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
5030: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
5040: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48  _DEBUG_PRINTF("H
5050: 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65  andle has become
5060: 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49   invalid (SCardI
5070: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20  sValidContext = 
5080: 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20  %s/%li), trying 
5090: 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e  to re-establish.
50a0: 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
50b0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
50c0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76  TO_STR(scard_isv
50d0: 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  alid_ret), (long
50e0: 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  ) scard_isvalid_
50f0: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
5100: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
5110: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
5120: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
5130: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
5140: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
5150: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
5160: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
5170: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
5180: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5190: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
51a0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
51b0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
51c0: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
51d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
51e0: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
51f0: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
5200: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
5210: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
5220: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
5230: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
5240: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
5250: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
5260: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
5270: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
5280: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
5290: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
52a0: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70  le);....cackey_p
52b0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
52c0: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  L;.....cackey_sl
52d0: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
52e0: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
52f0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
5300: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
5310: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5320: 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20  NTF("Handle has 
5330: 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73  been re-establis
5340: 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  hed");..}.#endif
5350: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5360: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75  PRINTF("Sucessfu
5370: 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  lly connected to
5380: 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e   PC/SC, returnin
5390: 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a  g in success");.
53a0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
53b0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
53c0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
53d0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
53e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
53f0: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a  onnect(void);. *
5400: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
5410: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
5420: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
5430: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
5440: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
5450: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
5460: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5470: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
5480: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
5490: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
54a0: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
54b0: 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e  om the PC/SC Con
54c0: 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20  nection manager 
54d0: 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20  and updates. *  
54e0: 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61     the global ha
54f0: 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ndle.. *. */.sta
5500: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
5510: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
5520: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c  nnect(void) {..L
5530: 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f  ONG scard_rel_co
5540: 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43  ntext_ret;...CAC
5550: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5560: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
5570: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
5580: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
5590: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
55a0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
55b0: 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74  ..scard_rel_cont
55c0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52  ext_ret = SCardR
55d0: 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63  eleaseContext(*c
55e0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
55f0: 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  e);...if (cackey
5600: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a  _pcsc_handle) {.
5610: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
5620: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09  sc_handle);.....
5630: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5640: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  le = NULL;..}...
5650: 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f  if (scard_rel_co
5660: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
5670: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
5680: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5690: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
56a0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ..}...return(CAC
56b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
56c0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
56d0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
56e0: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  ret cackey_conne
56f0: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
5700: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5710: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
5720: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
5730: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
5740: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
5750: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
5760: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
5770: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
5780: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
5790: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
57a0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
57b0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
57c0: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
57d0: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
57e0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
57f0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
5800: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
5810: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
5820: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
5830: 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ret pcsc_connect
5840: 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f  _ret;..DWORD pro
5850: 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61  tocol;..LONG sca
5860: 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43  rd_conn_ret;...C
5870: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5880: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5890: 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09  .if (!slot) {...
58a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
58b0: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f  NTF("Invalid slo
58c0: 74 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74  t specified, ret
58d0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
58e0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
58f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5900: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  ERIC);..}...pcsc
5910: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
5920: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
5930: 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  ct();..if (pcsc_
5940: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
5950: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
5960: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
5970: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
5980: 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61  tion to PC/SC fa
5990: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
59a0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
59b0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
59c0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
59d0: 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20  .}.../* Connect 
59e0: 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e 65  to reader, if ne
59f0: 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c  eded */..if (!sl
5a00: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
5a10: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 73 6c 6f  nnected) {...slo
5a20: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b  t->protocol = 0;
5a30: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
5a40: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
5a50: 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64  nnect(%s) called
5a60: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
5a70: 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f 63  ader);...scard_c
5a80: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
5a90: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
5aa0: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
5ab0: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
5ac0: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
5ad0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
5ae0: 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f  L_T0 | SCARD_PRO
5af0: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
5b00: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
5b10: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73  tocol);....if (s
5b20: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
5b30: 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52   SCARD_W_UNPOWER
5b40: 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 73 63  ED_CARD) {....sc
5b50: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
5b60: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
5b70: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
5b80: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
5b90: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
5ba0: 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f 50 52  DIRECT, SCARD_PR
5bb0: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
5bc0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
5bd0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
5be0: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
5bf0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
5c00: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
5c10: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
5c20: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
5c30: 52 45 44 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 53  RED, protocol, S
5c40: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
5c50: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d   &protocol);...}
5c60: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
5c70: 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  nn_ret != SCARD_
5c80: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
5c90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5ca0: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
5cb0: 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20  to card failed, 
5cc0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
5cd0: 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65  lure (SCardConne
5ce0: 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c  ct() = %s/%li)",
5cf0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
5d00: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
5d10: 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  TR(scard_conn_re
5d20: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
5d30: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09  _conn_ret);.....
5d40: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5d50: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
5d60: 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63  .}....slot->pcsc
5d70: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
5d80: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 1;...slot->tra
5d90: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
5da0: 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74   0;...slot->prot
5db0: 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b  ocol = protocol;
5dc0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ..}...return(CAC
5dd0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
5de0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
5df0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
5e00: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
5e10: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
5e20: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
5e30: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
5e40: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
5e50: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5e60: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
5e70: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
5e80: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
5e90: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
5ea0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
5eb0: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
5ec0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
5ed0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
5ee0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
5ef0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
5f00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
5f10: 68 6f 75 6c 64 20 62 65 20 74 65 72 6d 69 6e 61  hould be termina
5f20: 74 65 64 20 75 73 69 6e 67 20 22 63 61 63 6b 65  ted using "cacke
5f30: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
5f40: 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  n". *. */.static
5f50: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5f60: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
5f70: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
5f80: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
5f90: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  ..cackey_ret cac
5fa0: 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c  key_conn_ret;..L
5fb0: 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f  ONG scard_trans_
5fc0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
5fd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
5fe0: 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  ed.");...cackey_
5ff0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  conn_ret = cacke
6000: 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
6010: 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61 63 6b 65  lot);..if (cacke
6020: 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41  y_conn_ret != CA
6030: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
6040: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
6050: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
6060: 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
6070: 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  rd, returning in
6080: 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74   error");....ret
6090: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
60a0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
60b0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
60c0: 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66  on_depth++;...if
60d0: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
60e0: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31 29 20 7b  ion_depth > 1) {
60f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6100: 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20  PRINTF("Already 
6110: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
6120: 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20  , performing no 
6130: 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74  action (new dept
6140: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
6150: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
6160: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
6170: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
6180: 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e  ..}...scard_tran
6190: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67  s_ret = SCardBeg
61a0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  inTransaction(sl
61b0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a  ot->pcsc_card);.
61c0: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
61d0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
61e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
61f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6200: 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69  ("Unable to begi
6210: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
6220: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
6230: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
6240: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6250: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
6260: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6270: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67  "Sucessfully beg
6280: 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  an transaction o
6290: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
62a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
62b0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
62c0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
62d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
62e0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
62f0: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
6300: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
6310: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
6320: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
6330: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
6340: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
6350: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
6360: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
6370: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
6380: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
6390: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
63a0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
63b0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
63c0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
63d0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
63e0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
63f0: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
6400: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  s "cackey_begin_
6410: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20  transaction" to 
6420: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a  be called first.
6430: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
6440: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6450: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
6460: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6470: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e  ot *slot) {..LON
6480: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
6490: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
64a0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
64b0: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
64c0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
64d0: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
64e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
64f0: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e  Card is not conn
6500: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f  ected, unable to
6510: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
6520: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
6530: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6540: 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  RIC);..}...if (s
6550: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
6560: 5f 64 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09  _depth == 0) {..
6570: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6580: 49 4e 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e  INTF("Terminatin
6590: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
65a0: 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67  that has not beg
65b0: 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  un!");....return
65c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
65d0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c  ENERIC);..}...sl
65e0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
65f0: 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73  depth--;...if (s
6600: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
6610: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
6620: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6630: 4e 54 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e  NTF("Transaction
6640: 73 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72  s still in progr
6650: 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61  ess, not termina
6660: 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61  ting on-card Tra
6670: 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e  nsaction (curren
6680: 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  t depth = %i)", 
6690: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
66a0: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74  n_depth);....ret
66b0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
66c0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
66d0: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  .scard_trans_ret
66e0: 20 3d 20 53 43 61 72 64 45 6e 64 54 72 61 6e 73   = SCardEndTrans
66f0: 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73  action(slot->pcs
6700: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
6710: 41 56 45 5f 43 41 52 44 29 3b 0a 09 69 66 20 28  AVE_CARD);..if (
6720: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
6730: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6740: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
6750: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
6760: 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73  ble to end trans
6770: 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e  action, returnin
6780: 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09  g in error");...
6790: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
67a0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
67b0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
67c0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73  G_PRINTF("Sucess
67d0: 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65 64  fully terminated
67e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
67f0: 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74  slot (%s)", slot
6800: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ->pcsc_reader);.
6810: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6820: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
6830: 2a 20 41 50 44 55 20 52 65 6c 61 74 65 64 20 46  * APDU Related F
6840: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20  unctions */./*. 
6850: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6860: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
6870: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74  key_send_apdu(st
6880: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
6890: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
68a0: 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73   char class, uns
68b0: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72  igned char instr
68c0: 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64  uction, unsigned
68d0: 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e   char p1, unsign
68e0: 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69  ed char p2, unsi
68f0: 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e  gned char lc, un
6900: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
6910: 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  a, unsigned char
6920: 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72   le, uint16_t *r
6930: 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65  espcode, unsigne
6940: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
6950: 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61  , size_t *respda
6960: 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41  ta_len);. *. * A
6970: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
6980: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
6990: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
69a0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
69b0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
69c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
69d0: 61 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20 41  ass. *         A
69e0: 50 44 55 20 43 6c 61 73 73 20 28 47 53 43 49 53  PDU Class (GSCIS
69f0: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 6f  _CLASS_ISO7816 o
6a00: 72 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  r GSCIS_CLASS_GL
6a10: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a  OBAL_PLATFORM. *
6a20: 20 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79           usually
6a30: 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20  ), (CLA). *. *  
6a40: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
6a50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20   instruction. * 
6a60: 20 20 20 20 20 20 20 20 41 50 44 55 20 49 6e 73          APDU Ins
6a70: 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20  truction (INS). 
6a80: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
6a90: 64 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20 20  d char p1. *    
6aa0: 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65       APDU Parame
6ab0: 74 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a  ter 1 (P1). *. *
6ac0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6ad0: 61 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20 20  ar p2. *        
6ae0: 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20   APDU Parameter 
6af0: 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20  2 (P2). *. *    
6b00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
6b10: 63 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  c. *         APD
6b20: 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74  U Length of Cont
6b30: 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69 73  ent (Lc) -- this
6b40: 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   is the length o
6b50: 66 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20 20  f "data". *     
6b60: 20 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20 20      parameter.  
6b70: 49 66 20 22 64 61 74 61 22 20 69 73 20 73 70 65  If "data" is spe
6b80: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
6b90: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 77  this parameter w
6ba0: 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 62  ill. *         b
6bb0: 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a  e ignored.. *. *
6bc0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6bd0: 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20 20  ar *data. *     
6be0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 62      Pointer to b
6bf0: 75 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20 20  uffer to send.  
6c00: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c 63  It should be "Lc
6c10: 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49  " bytes long.  I
6c20: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65  f. *         spe
6c30: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
6c40: 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65  "Lc" will not be
6c50: 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20   sent, and this 
6c60: 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a 20  buffer will be. 
6c70: 2a 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72 65  *         ignore
6c80: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
6c90: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20 2a  igned char le. *
6ca0: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65           APDU Le
6cb0: 6e 67 74 68 20 6f 66 20 45 78 70 65 63 74 61 74  ngth of Expectat
6cc0: 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69 73  ion (Le) -- this
6cd0: 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   is the length o
6ce0: 66 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  f the. *        
6cf0: 20 65 78 70 65 63 74 65 64 20 72 65 70 6c 79 2e   expected reply.
6d00: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
6d10: 63 69 66 69 65 64 20 61 73 20 30 20 74 68 65 6e  cified as 0 then
6d20: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20   it will not. * 
6d30: 20 20 20 20 20 20 20 20 62 65 20 73 65 6e 74 2e          be sent.
6d40: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31  . *. *     uint1
6d50: 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a  6_t *respcode. *
6d60: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50           [OUT] P
6d70: 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67  ointer to storag
6d80: 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e  e of APDU respon
6d90: 73 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68 69  se code.  If thi
6da0: 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  s is. *         
6db0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
6dc0: 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20  L, the response 
6dd0: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69 73  code will be dis
6de0: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  carded.. *. *   
6df0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6e00: 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20 20  *respdata. *    
6e10: 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74       [OUT] Point
6e20: 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66  er to storage of
6e30: 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 64   APDU response d
6e40: 61 74 61 2e 20 20 49 66 20 74 68 69 73 20 69 73  ata.  If this is
6e50: 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63  . *         spec
6e60: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
6e70: 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61  he response data
6e80: 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64   will be discard
6e90: 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20  ed.  If. *      
6ea0: 20 20 20 74 68 65 20 22 72 65 73 70 64 61 74 61     the "respdata
6eb0: 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72 20  _len" parameter 
6ec0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
6ed0: 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66 65  NULL, this buffe
6ee0: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69 6c  r. *         wil
6ef0: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
6f00: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65  .. *. *     size
6f10: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
6f20: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e 2c  . *         [IN,
6f30: 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e   OUT] Pointer in
6f40: 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e  itialing contain
6f50: 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ing the size of 
6f60: 74 68 65 20 22 72 65 73 70 64 61 74 61 22 0a 20  the "respdata". 
6f70: 2a 20 20 20 20 20 20 20 20 20 62 75 66 66 65 72  *         buffer
6f80: 2e 20 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  .  Before return
6f90: 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65 64  ing, the pointed
6fa0: 20 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70 64   to value is upd
6fb0: 61 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20 20  ated to the. *  
6fc0: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
6fd0: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74   bytes written t
6fe0: 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 20 49  o the buffer.  I
6ff0: 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66  f this is specif
7000: 69 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20 20  ied as. *       
7010: 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20    NULL, it will 
7020: 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c 20  not be updated, 
7030: 61 6e 64 20 22 72 65 73 70 64 61 74 61 22 20 77  and "respdata" w
7040: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 63  ill be ignored c
7050: 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20 20  ausing. *       
7060: 20 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64    the response d
7070: 61 74 61 20 74 6f 20 62 65 20 64 69 73 63 61 72  ata to be discar
7080: 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52  ded.. *. * RETUR
7090: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
70a0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
70b0: 20 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63            On suc
70c0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
70d0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
70e0: 43 20 20 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  C      On error.
70f0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
7100: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
7110: 20 20 49 66 20 74 68 65 20 73 65 6e 64 69 6e 67    If the sending
7120: 20 66 61 69 6c 65 64 20 62 65 63 61 75 73 65 20   failed because 
7130: 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a 20  the token is. * 
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
7160: 62 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e 4f 54 45  bsent. *. * NOTE
7170: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
7180: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e  nction will conn
7190: 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43  ect to the PC/SC
71a0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61   Connection Mana
71b0: 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63  ger via. *     c
71c0: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
71d0: 63 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a  ct() if needed..
71e0: 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c   *. *     It wil
71f0: 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  l connect to the
7200: 20 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61   card in the rea
7210: 64 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20  der attached to 
7220: 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20  the slot. *     
7230: 73 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77  specified.  It w
7240: 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f  ill reconnect to
7250: 20 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65   the card if the
7260: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20   connection. *  
7270: 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a     goes away.. *
7280: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
7290: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
72a0: 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63  nd_apdu(struct c
72b0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
72c0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
72d0: 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20  class, unsigned 
72e0: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
72f0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
7300: 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p1, unsigned cha
7310: 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p2, unsigned c
7320: 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64  har lc, unsigned
7330: 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73   char *data, uns
7340: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75  igned char le, u
7350: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
7360: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
7370: 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65   *respdata, size
7380: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
7390: 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a  ) {..uint8_t maj
73a0: 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b  or_rc, minor_rc;
73b0: 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74  ..size_t bytes_t
73c0: 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70  o_copy, tmp_resp
73d0: 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43  data_len;..LPCSC
73e0: 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70  ARD_IO_REQUEST p
73f0: 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52  ioSendPci;..DWOR
7400: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f  D protocol;..DWO
7410: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63  RD xmit_len, rec
7420: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  v_len;..LONG sca
7430: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61  rd_xmit_ret, sca
7440: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09  rd_reconn_ret;..
7450: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30  BYTE xmit_buf[10
7460: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30  24], recv_buf[10
7470: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  24];..int pcsc_c
7480: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63  onnect_ret, pcsc
7490: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69  _getresp_ret;..i
74a0: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
74b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
74c0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
74d0: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
74e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
74f0: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
7500: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65  cified.");....re
7510: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7520: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7530: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
7540: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
7550: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
7560: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
7570: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
7580: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
7590: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
75a0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
75b0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
75c0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
75d0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
75e0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
75f0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
7600: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68   Determine which
7610: 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e   protocol to sen
7620: 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74  d using */..swit
7630: 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ch (slot->protoc
7640: 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41  ol) {...case SCA
7650: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a  RD_PROTOCOL_T0:.
7660: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
7670: 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09  SCARD_PCI_T0;...
7680: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
7690: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
76a0: 31 3a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69  1:....pioSendPci
76b0: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b   = SCARD_PCI_T1;
76c0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  .....break;...de
76d0: 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59  fault:....CACKEY
76e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
76f0: 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20  nvalid protocol 
7700: 66 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e  found, aborting.
7710: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
7720: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7730: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54  ERIC);..}.../* T
7740: 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74  ransmit */..xmit
7750: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f  _len = 0;..xmit_
7760: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
7770: 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62  = class;..xmit_b
7780: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
7790: 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78   instruction;..x
77a0: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
77b0: 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f  ++] = p1;..xmit_
77c0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
77d0: 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29  = p2;..if (data)
77e0: 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d   {...xmit_buf[xm
77f0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a  it_len++] = lc;.
7800: 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
7810: 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29  idx < lc; idx++)
7820: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
7830: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74  mit_len++] = dat
7840: 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a  a[idx];...}..}..
7850: 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29  .if (le != 0x00)
7860: 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d   {...xmit_buf[xm
7870: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a  it_len++] = le;.
7880: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d  .}.../* Begin Sm
7890: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
78a0: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
78b0: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
78c0: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c  (slot);...if (cl
78d0: 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41  ass == GSCIS_CLA
78e0: 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e  SS_ISO7816 && in
78f0: 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43  struction == GSC
7900: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
7910: 26 26 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26  && p1 == 0x00 &&
7920: 20 70 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09   p2 == 0x00) {..
7930: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7940: 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50  INTF("Sending AP
7950: 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e  DU: <<censored>>
7960: 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
7970: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7980: 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41  NTBUF("Sending A
7990: 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c  PDU:", xmit_buf,
79a0: 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   xmit_len);..}..
79b0: 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65  .recv_len = size
79c0: 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73  of(recv_buf);..s
79d0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20  card_xmit_ret = 
79e0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c  SCardTransmit(sl
79f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70  ot->pcsc_card, p
7a00: 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f  ioSendPci, xmit_
7a10: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e  buf, xmit_len, N
7a20: 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26  ULL, recv_buf, &
7a30: 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 69 66 20 28  recv_len);..if (
7a40: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21  scard_xmit_ret !
7a50: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7a60: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
7a70: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
7a80: 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20  ed to send APDU 
7a90: 74 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72  to card (SCardTr
7aa0: 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c  ansmit() = %s/%l
7ab0: 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  x)", CACKEY_DEBU
7ac0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
7ad0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69  TO_STR(scard_xmi
7ae0: 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65  t_ret), (unsigne
7af0: 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d  d long) scard_xm
7b00: 69 74 5f 72 65 74 29 3b 0a 09 09 43 41 43 4b 45  it_ret);...CACKE
7b10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7b20: 4d 61 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20  Marking slot as 
7b30: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
7b40: 74 22 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 74 72  t");....slot->tr
7b50: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
7b60: 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 73 6c 6f  = 0;...slot->slo
7b70: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09  t_reset = 1;....
7b80: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
7b90: 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45  et == SCARD_W_RE
7ba0: 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43  SET_CARD) {....C
7bb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7bc0: 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72  TF("Reset requir
7bd0: 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e  ed, please hold.
7be0: 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f  ..");.....scard_
7bf0: 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  reconn_ret = SCa
7c00: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
7c10: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7c20: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7c30: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7c40: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
7c50: 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45  COL_T1, SCARD_RE
7c60: 53 45 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f  SET_CARD, &proto
7c70: 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61  col);....if (sca
7c80: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d  rd_reconn_ret ==
7c90: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
7ca0: 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74  ) {...../* Updat
7cb0: 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09  e protocol */...
7cc0: 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  ..slot->protocol
7cd0: 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 09 09   = protocol;....
7ce0: 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70  .switch (slot->p
7cf0: 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09 09 09  rotocol) {......
7d00: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f  case SCARD_PROTO
7d10: 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09 70 69  COL_T0:.......pi
7d20: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
7d30: 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09 09 09  _PCI_T0;........
7d40: 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
7d50: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7d60: 54 31 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e  T1:.......pioSen
7d70: 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49  dPci = SCARD_PCI
7d80: 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  _T1;........brea
7d90: 6b 3b 0a 09 09 09 09 09 64 65 66 61 75 6c 74 3a  k;......default:
7da0: 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
7db0: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
7dc0: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75  lid protocol fou
7dd0: 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61 74 65  nd, but too late
7de0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
7df0: 61 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d 2d 20  about it now -- 
7e00: 74 72 79 69 6e 67 20 61 6e 79 77 61 79 2e 22 29  trying anyway.")
7e10: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
7e20: 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 52 65  ....}....../* Re
7e30: 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73  -establish trans
7e40: 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61  action, if it wa
7e50: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09  s present */....
7e60: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
7e70: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
7e80: 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74  ) {......slot->t
7e90: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
7ea0: 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  --;......cackey_
7eb0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
7ec0: 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
7ed0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7ee0: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
7ef0: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61  uccessful, retra
7f00: 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09  nsmitting");....
7f10: 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a  ..recv_len = siz
7f20: 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09  eof(recv_buf);..
7f30: 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  ...scard_xmit_re
7f40: 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69  t = SCardTransmi
7f50: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
7f60: 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78  d, pioSendPci, x
7f70: 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65  mit_buf, xmit_le
7f80: 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75  n, NULL, recv_bu
7f90: 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  f, &recv_len);..
7fa0: 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d  ....if (scard_xm
7fb0: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
7fc0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
7fd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7fe0: 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d 69  RINTF("Retransmi
7ff0: 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  t failed, return
8000: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 61  ing in failure a
8010: 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 69  fter disconnecti
8020: 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43 61  ng the card (SCa
8030: 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f  rdTransmit = %s/
8040: 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %li)", CACKEY_DE
8050: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
8060: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
8070: 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  mit_ret), (long)
8080: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
8090: 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 73  ;.......SCardDis
80a0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
80b0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
80c0: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09  EAVE_CARD);.....
80d0: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
80e0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
80f0: 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ....../* End Sma
8100: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
8110: 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d  on */......slot-
8120: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8130: 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63  th = 1;......cac
8140: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
8150: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  ion(slot);......
8160: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8170: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
8180: 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  T);.....}....} e
8190: 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
81a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
81b0: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72  isconnecting car
81c0: 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 44  d");......SCardD
81d0: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
81e0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
81f0: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
8200: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
8210: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
8220: 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ....../* End Sma
8230: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
8240: 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e  on */.....slot->
8250: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8260: 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b 65  h = 1;.....cacke
8270: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
8280: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41  n(slot);......CA
8290: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
82a0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
82b0: 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72  failure");.....r
82c0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
82d0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
82e0: 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  ;....}...} else 
82f0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8300: 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e  G_PRINTF("Discon
8310: 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a  necting card");.
8320: 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
8330: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
8340: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
8350: 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d  _CARD);....slot-
8360: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
8370: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a  cted = 0;...../*
8380: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
8390: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
83a0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
83b0: 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09  on_depth = 1;...
83c0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
83d0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
83e0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
83f0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
8400: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
8410: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8420: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
8430: 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ENT);...}..}...C
8440: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8450: 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 56  TBUF("Returned V
8460: 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66  alue:", recv_buf
8470: 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69  , recv_len);...i
8480: 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29  f (recv_len < 2)
8490: 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20   {.../* Minimal 
84a0: 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20  response length 
84b0: 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 75  is 2 bytes, retu
84c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
84d0: 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
84e0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
84f0: 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72  nse too small, r
8500: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
8510: 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20  ure (recv_len = 
8520: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
8530: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29   long) recv_len)
8540: 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ;..../* End Smar
8550: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
8560: 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e  n */...cackey_en
8570: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
8580: 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ot);....return(C
8590: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
85a0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  ERIC);..}.../* D
85b0: 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20  etermine result 
85c0: 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72  code */..major_r
85d0: 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63  c = recv_buf[rec
85e0: 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e  v_len - 2];..min
85f0: 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66  or_rc = recv_buf
8600: 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a  [recv_len - 1];.
8610: 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b  .if (respcode) {
8620: 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28  ...*respcode = (
8630: 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c  major_rc << 8) |
8640: 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09   minor_rc;..}...
8650: 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67  /* Adjust messag
8660: 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63  e buffer */..rec
8670: 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a  v_len -= 2;.../*
8680: 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 65   Add bytes to re
8690: 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74  turn value */..t
86a0: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  mp_respdata_len 
86b0: 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61  = 0;..if (respda
86c0: 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c  ta && respdata_l
86d0: 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70  en) {...tmp_resp
86e0: 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70  data_len = *resp
86f0: 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74  data_len;....byt
8700: 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65  es_to_copy = *re
8710: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69  spdata_len;....i
8720: 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79  f (recv_len < by
8730: 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09  tes_to_copy) {..
8740: 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
8750: 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a  = recv_len;...}.
8760: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8770: 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20  PRINTF("Copying 
8780: 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 65  %lu bytes to the
8790: 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64 20   buffer (recv'd 
87a0: 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 6f  %lu bytes, but o
87b0: 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c 65  nly %lu bytes le
87c0: 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 72  ft in our buffer
87d0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
87e0: 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ng) bytes_to_cop
87f0: 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
8800: 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e  g) recv_len, (un
8810: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65  signed long) *re
8820: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09  spdata_len);....
8830: 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c  memcpy(respdata,
8840: 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73   recv_buf, bytes
8850: 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73  _to_copy);...res
8860: 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74  pdata += bytes_t
8870: 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70  o_copy;....*resp
8880: 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73  data_len = bytes
8890: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f  _to_copy;...tmp_
88a0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20  respdata_len -= 
88b0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09  bytes_to_copy;..
88c0: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72  } else {...if (r
88d0: 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a  ecv_len != 0) {.
88e0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
88f0: 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67  PRINTF("Throwing
8900: 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c   away %lu bytes,
8910: 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20   nowhere to put 
8920: 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65  them!", (unsigne
8930: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
8940: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
8950: 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31  major_rc == 0x61
8960: 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64  ) {.../* We need
8970: 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41   to READ */...CA
8980: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8990: 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 72  F("Buffer read r
89a0: 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66  equired");....if
89b0: 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78   (minor_rc == 0x
89c0: 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72  00) {....minor_r
89d0: 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  c = CACKEY_APDU_
89e0: 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63  MTU;...}....pcsc
89f0: 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63  _getresp_ret = c
8a00: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
8a10: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
8a20: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
8a30: 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f  _INSTR_GET_RESPO
8a40: 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  NSE, 0x00, 0x00,
8a50: 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f   0, NULL, minor_
8a60: 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65  rc, respcode, re
8a70: 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73  spdata, &tmp_res
8a80: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66  pdata_len);...if
8a90: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
8aa0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
8ab0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
8ac0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8ad0: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 66 61  ("Buffer read fa
8ae0: 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67  iled!  Returning
8af0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
8b00: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
8b10: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
8b20: 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
8b30: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
8b40: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
8b50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8b60: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERIC);...}....if
8b70: 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   (respdata_len) 
8b80: 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f 6c  {....*respdata_l
8b90: 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61  en += tmp_respda
8ba0: 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f  ta_len;...}..../
8bb0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
8bc0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
8bd0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
8be0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
8bf0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8c00: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
8c10: 20 69 6e 20 73 75 63 63 65 73 73 20 28 62 75 66   in success (buf
8c20: 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74  fer read complet
8c30: 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 43  e)");...return(C
8c40: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
8c50: 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d  ;..}.../* End Sm
8c60: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
8c70: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
8c80: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
8c90: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f  lot);...if (majo
8ca0: 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a  r_rc == 0x90) {.
8cb0: 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a  ../* Success */.
8cc0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8cd0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
8ce0: 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a   in success (maj
8cf0: 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b  or_rc = 0x90)");
8d00: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8d10: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
8d20: 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8d30: 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 52 65  _PRINTF("APDU Re
8d40: 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c  turned an error,
8d50: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
8d60: 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72  ilure");...retur
8d70: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
8d80: 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a  GENERIC);.}../*.
8d90: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
8da0: 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65     ssize_t cacke
8db0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74  y_read_buffer(st
8dc0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8dd0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
8de0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
8df0: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73  ize_t count, uns
8e00: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
8e10: 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61  v, size_t initia
8e20: 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a  l_offset);. *. *
8e30: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
8e40: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
8e50: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
8e60: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
8e70: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
8e80: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
8e90: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20  d char *buffer. 
8ea0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
8eb0: 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20  Buffer. *. *    
8ec0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a   size_t count. *
8ed0: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
8ee0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65  of bytes to atte
8ef0: 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20  mpt to read. *. 
8f00: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
8f10: 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20  har t_or_v. *   
8f20: 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68 65        Select the
8f30: 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20 6f   T-buffer (01) o
8f40: 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29 20  r V-buffer (02) 
8f50: 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a  to read from.  .
8f60: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
8f70: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a   initial_offset.
8f80: 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63 69   *         Speci
8f90: 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  fy the offset to
8fa0: 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64 20   begin the read 
8fb0: 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45  from. *. *. * RE
8fc0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
8fd0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
8fe0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
8ff0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
9000: 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31  ally read, or -1
9010: 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a   on error.. *. *
9020: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
9030: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
9040: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
9050: 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75  read_buffer(stru
9060: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
9070: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
9080: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
9090: 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67  e_t count, unsig
90a0: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c  ned char t_or_v,
90b0: 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f   size_t initial_
90c0: 6f 66 66 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f  offset) {..size_
90d0: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
90e0: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
90f0: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  unt;..unsigned c
9100: 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e  har cmd[2];..uin
9110: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
9120: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
9130: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9140: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
9150: 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20  ...max_offset = 
9160: 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e  count;..max_coun
9170: 74 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  t = CACKEY_APDU_
9180: 4d 54 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f  MTU;...if (t_or_
9190: 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76  v != 1 && t_or_v
91a0: 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45   != 2) {...CACKE
91b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
91c0: 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70  Invalid T or V p
91d0: 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
91e0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
91f0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
9200: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
9210: 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b  cmd[0] = t_or_v;
9220: 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09  ...while (1) {..
9230: 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d  .if (offset >= m
9240: 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09  ax_offset) {....
9250: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9260: 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20  NTF("Buffer too 
9270: 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67  small, returning
9280: 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22   what we got..."
9290: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
92a0: 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78  }....count = max
92b0: 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74  _offset - offset
92c0: 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20  ;...if (count > 
92d0: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
92e0: 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e  count = max_coun
92f0: 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d  t;...}....cmd[1]
9300: 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e   = count;....sen
9310: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
9320: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
9330: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
9340: 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49  L_PLATFORM, GSCI
9350: 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46  S_INSTR_READ_BUF
9360: 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f  FER, ((initial_o
9370: 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20  ffset + offset) 
9380: 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 69  >> 8) & 0xff, (i
9390: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20  nitial_offset + 
93a0: 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c 20  offset) & 0xff, 
93b0: 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64  sizeof(cmd), cmd
93c0: 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64  , 0x00, &respcod
93d0: 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73  e, buffer + offs
93e0: 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 09 09 69  et, &count);...i
93f0: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
9400: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
9410: 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f   {....if (respco
9420: 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a  de == 0x6A86) {.
9430: 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e  ....if (max_coun
9440: 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62  t == 1) {......b
9450: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
9460: 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78  .max_count = max
9470: 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09  _count / 2;.....
9480: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
9490: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
94a0: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
94b0: 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c  send_apdu() fail
94c0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
94d0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
94e0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
94f0: 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75  ...offset += cou
9500: 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74  nt;....if (count
9510: 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a   < max_count) {.
9520: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9530: 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65  PRINTF("Short re
9540: 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69  ad -- count = %i
9550: 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20  , cmd[1] = %i", 
9560: 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e  (int) count, (in
9570: 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09  t) cmd[1]);.....
9580: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  break;...}..}..#
9590: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
95a0: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
95b0: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
95c0: 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50  .if (offset > _P
95d0: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
95e0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
95f0: 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20  _PRINTF("Offset 
9600: 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
9610: 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
9620: 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
9630: 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20  x = %li, offset 
9640: 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
9650: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
9660: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
9670: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65  ) offset);....re
9680: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
9690: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43  endif.#endif...C
96a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
96b0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
96c0: 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25   success, read %
96d0: 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69  lu bytes", (unsi
96e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65  gned long) offse
96f0: 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66  t);...return(off
9700: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  set);.}../*. * S
9710: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
9720: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
9730: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
9740: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
9750: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
9760: 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a  d char *aid, siz
9770: 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a  e_t aid_len);. *
9780: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
9790: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
97a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
97b0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
97c0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
97d0: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
97e0: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20  gned char *aid. 
97f0: 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65 72  *         Buffer
9800: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c   containing Appl
9810: 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a  et ID to select.
9820: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
9830: 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20   aid_len. *     
9840: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79      Number of by
9850: 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 22  tes in the "aid"
9860: 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 72   (Applet ID) par
9870: 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54  ameter. *. * RET
9880: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
9890: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
98a0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
98b0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
98c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
98d0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
98e0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
98f0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
9900: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
9910: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
9920: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
9930: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
9940: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64  signed char *aid
9950: 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e  , size_t aid_len
9960: 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  ) {..int send_re
9970: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
9980: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
9990: 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
99a0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65  BUG_PRINTBUF("Se
99b0: 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22  lecting applet:"
99c0: 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b  , aid, aid_len);
99d0: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
99e0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
99f0: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
9a00: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
9a10: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53  INSTR_SELECT, GS
9a20: 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54  CIS_PARAM_SELECT
9a30: 5f 41 50 50 4c 45 54 2c 20 30 78 30 30 2c 20 61  _APPLET, 0x00, a
9a40: 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30  id_len, aid, 0x0
9a50: 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  0, NULL, NULL, N
9a60: 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  ULL);..if (send_
9a70: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
9a80: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
9a90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9aa0: 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  ("Failed to open
9ab0: 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69   applet, returni
9ac0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
9ad0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
9ae0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
9af0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
9b00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
9b10: 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74  cessfully select
9b20: 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74  ed file");...ret
9b30: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9b40: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
9b50: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
9b60: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
9b70: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
9b80: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9b90: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
9ba0: 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55   ef);. *. * ARGU
9bb0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
9bc0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9bd0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
9be0: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
9bf0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
9c00: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a      uint16_t ef.
9c10: 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65   *         Eleme
9c20: 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c  ntal File to sel
9c30: 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ect. *. * RETURN
9c40: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
9c50: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
9c60: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
9c70: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
9c80: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
9c90: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
9ca0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
9cb0: 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c  is selects an El
9cc0: 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45  ementary File (E
9cd0: 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  F) under the cur
9ce0: 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a  rently selected.
9cf0: 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64   *     Dedicated
9d00: 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a   File (DF). *. *
9d10: 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74       Typically t
9d20: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
9d30: 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68  ter selecting th
9d40: 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74  e correct Applet
9d50: 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63   (using. *     c
9d60: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
9d70: 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64  let) for VM card
9d80: 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  s. *. */.static 
9d90: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
9da0: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
9db0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9dc0: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
9dd0: 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64   ef) {..unsigned
9de0: 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d   char fid_buf[2]
9df0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
9e00: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9e10: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
9e20: 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65  );.../* Open the
9e30: 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65   elementary file
9e40: 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20   */..fid_buf[0] 
9e50: 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78  = (ef >> 8) & 0x
9e60: 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20  ff;..fid_buf[1] 
9e70: 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43  = ef & 0xff;...C
9e80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9e90: 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69  TF("Selecting fi
9ea0: 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73  le: %04lx", (uns
9eb0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b  igned long) ef);
9ec0: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
9ed0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
9ee0: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
9ef0: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
9f00: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78  INSTR_SELECT, 0x
9f10: 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66  02, 0x0C, sizeof
9f20: 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62  (fid_buf), fid_b
9f30: 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  uf, 0x00, NULL, 
9f40: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
9f50: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
9f60: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
9f70: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9f80: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
9f90: 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65  to open file, re
9fa0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
9fb0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
9fc0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9fd0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
9fe0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9ff0: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
a000: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
a010: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a020: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
a030: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
a040: 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79       void cackey
a050: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74  _free_tlv(struct
a060: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
a070: 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a  ty *root);. *. *
a080: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
a090: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
a0a0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
a0b0: 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74  . *         Root
a0c0: 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74   of the TLV list
a0d0: 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e   to start freein
a0e0: 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  g. *. * RETURN V
a0f0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
a100: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
a110: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
a120: 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20  n frees the TLV 
a130: 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65  linked listed re
a140: 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20  turned from. *  
a150: 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f     "cackey_read_
a160: 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  tlv". *. */.stat
a170: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
a180: 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ree_tlv(struct c
a190: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
a1a0: 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63   *root) {..struc
a1b0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
a1c0: 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74  ity *curr, *next
a1d0: 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ;...if (root == 
a1e0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
a1f0: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72  ;..}...for (curr
a200: 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63   = root; curr; c
a210: 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09  urr = next) {...
a220: 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65  next = curr->_ne
a230: 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  xt;....switch (c
a240: 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63  urr->tag) {....c
a250: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
a260: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65  R_TABLE:....case
a270: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
a280: 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28  FICATE:.....if (
a290: 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09  curr->value) {..
a2a0: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
a2b0: 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09  alue);.....}....
a2c0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
a2d0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
a2e0: 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d  L:.....if (curr-
a2f0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20  >value_cardurl) 
a300: 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
a310: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
a320: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  ;.....}.....brea
a330: 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63  k;...}....free(c
a340: 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  urr);..}...retur
a350: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
a360: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
a370: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
a380: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
a390: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
a3a0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
a3b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
a3c0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74   *. */.static st
a3d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
a3e0: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
a3f0: 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ead_tlv(struct c
a400: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
a410: 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
a420: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
a430: 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f  urr_entity, *roo
a440: 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20  t = NULL, *last 
a450: 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65  = NULL;..unsigne
a460: 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b  d char tlen_buf[
a470: 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32  2], tval_buf[102
a480: 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69  4], *tval;..unsi
a490: 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62  gned char vlen_b
a4a0: 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b  uf[2], vval_buf[
a4b0: 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75  8192], *vval;..u
a4c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
a4d0: 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  pbuf;..unsigned 
a4e0: 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  long tmpbuflen;.
a4f0: 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76  .ssize_t tlen, v
a500: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65  len;..ssize_t re
a510: 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ad_ret;..size_t 
a520: 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66  offset_t = 0, of
a530: 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73  fset_v = 0;..uns
a540: 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a  igned char tag;.
a550: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
a560: 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a  #ifdef HAVE_LIBZ
a570: 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73  ..int uncompress
a580: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
a590: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a5a0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
a5b0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
a5c0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
a5d0: 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73  lot, tlen_buf, s
a5e0: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c  izeof(tlen_buf),
a5f0: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
a600: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
a610: 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29  sizeof(tlen_buf)
a620: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a630: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
a640: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
a650: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a660: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a670: 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c  ..}...tlen = (tl
a680: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
a690: 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | tlen_buf[0];..
a6a0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
a6b0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
a6c0: 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73  lot, vlen_buf, s
a6d0: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c  izeof(vlen_buf),
a6e0: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
a6f0: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
a700: 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29  sizeof(vlen_buf)
a710: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a720: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
a730: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
a740: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a750: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a760: 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c  ..}...vlen = (vl
a770: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
a780: 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | vlen_buf[0];..
a790: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a7a0: 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68  INTF("Tag Length
a7b0: 20 3d 20 25 69 2c 20 56 61 6c 75 65 20 4c 65 6e   = %i, Value Len
a7c0: 67 74 68 20 3d 20 25 69 22 2c 20 74 6c 65 6e 2c  gth = %i", tlen,
a7d0: 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74   vlen);...offset
a7e0: 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74  _t += 2;..offset
a7f0: 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74  _v += 2;...if (t
a800: 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61  len > sizeof(tva
a810: 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  l_buf)) {...CACK
a820: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a830: 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74  "Tag length is t
a840: 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e  oo large, return
a850: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
a860: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
a870: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e  );..}...if (vlen
a880: 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62   > sizeof(vval_b
a890: 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  uf)) {...CACKEY_
a8a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61  DEBUG_PRINTF("Va
a8b0: 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f  lue length is to
a8c0: 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69  o large, returni
a8d0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
a8e0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
a8f0: 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20  ;..}...read_ret 
a900: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  = cackey_read_bu
a910: 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f  ffer(slot, tval_
a920: 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66  buf, tlen, 1, of
a930: 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65  fset_t);..if (re
a940: 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20  ad_ret != tlen) 
a950: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a960: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
a970: 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 54  to read entire T
a980: 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69  -buffer, returni
a990: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
a9a0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
a9b0: 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20  ;..}...read_ret 
a9c0: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  = cackey_read_bu
a9d0: 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f  ffer(slot, vval_
a9e0: 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66  buf, vlen, 2, of
a9f0: 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65  fset_v);..if (re
aa00: 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20  ad_ret != vlen) 
aa10: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
aa20: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
aa30: 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 56  to read entire V
aa40: 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69  -buffer, returni
aa50: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
aa60: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
aa70: 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76  ;..}...tval = tv
aa80: 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20  al_buf;..vval = 
aa90: 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65  vval_buf;..while
aaa0: 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c   (tlen > 0 && vl
aab0: 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20  en > 0) {...tag 
aac0: 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b  = *tval;...tval+
aad0: 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09  +;...tlen--;....
aae0: 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66  if (*tval == 0xf
aaf0: 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d  f) {....length =
ab00: 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20   (tval[2] << 8) 
ab10: 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76  | tval[1];....tv
ab20: 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e  al += 3;....tlen
ab30: 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20   -= 3;...} else 
ab40: 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74  {....length = *t
ab50: 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a  val;....tval++;.
ab60: 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a  ...tlen--;...}..
ab70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ab80: 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28  RINTF("Tag: %s (
ab90: 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  %02x)", CACKEY_D
aba0: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
abb0: 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69  _STR(tag), (unsi
abc0: 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a  gned int) tag);.
abd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
abe0: 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22  RINTBUF("Value:"
abf0: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
ac00: 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
ac10: 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68  = NULL;...switch
ac20: 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65   (tag) {....case
ac30: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
ac40: 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  RL:.....curr_ent
ac50: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
ac60: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
ac70: 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ));.....curr_ent
ac80: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
ac90: 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  rl = malloc(size
aca0: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d  of(*curr_entity-
acb0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29  >value_cardurl))
acc0: 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75  ;......memcpy(cu
acd0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
ace0: 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76  _cardurl->rid, v
acf0: 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72  val, 5);.....cur
ad00: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
ad10: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
ad20: 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09   = vval[5];.....
ad30: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
ad40: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
ad50: 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20  ctid = (vval[6] 
ad60: 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b  << 8) | vval[7];
ad70: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
ad80: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
ad90: 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38  >appid = (vval[8
ada0: 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39  ] << 8) | vval[9
adb0: 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ];......curr_ent
adc0: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
add0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
ade0: 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  >_next = NULL;..
adf0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
ae00: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52  se GSCIS_TAG_ACR
ae10: 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72  _TABLE:.....curr
ae20: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
ae30: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
ae40: 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62  tity));.....tmpb
ae50: 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67  uf = malloc(leng
ae60: 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79  th);......memcpy
ae70: 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c  (tmpbuf, vval, l
ae80: 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72  ength);......cur
ae90: 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20  r_entity->tag = 
aea0: 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  tag;.....curr_en
aeb0: 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c  tity->length = l
aec0: 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f  ength;.....curr_
aed0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20  entity->value = 
aee0: 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72  tmpbuf;.....curr
aef0: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
af00: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
af10: 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53  k;....case GSCIS
af20: 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45  _TAG_CERTIFICATE
af30: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
af40: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
af50: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
af60: 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c  ;..#ifdef HAVE_L
af70: 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65  IBZ.....tmpbufle
af80: 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a  n = length * 2;.
af90: 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c  ....tmpbuf = mal
afa0: 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  loc(tmpbuflen);.
afb0: 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f  .....uncompress_
afc0: 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73  ret = uncompress
afd0: 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66  (tmpbuf, &tmpbuf
afe0: 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  len, vval, lengt
aff0: 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f  h);.....if (unco
b000: 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f  mpress_ret != Z_
b010: 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  OK) {......CACKE
b020: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b030: 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70  Failed to decomp
b040: 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73  ress, uncompress
b050: 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d  () returned %i -
b060: 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64  - resorting to d
b070: 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63  irect copy", unc
b080: 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09  ompress_ret);...
b090: 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
b0a0: 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d  length;......mem
b0b0: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
b0c0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d  , length);.....}
b0d0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
b0e0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63  UG_PRINTBUF("Dec
b0f0: 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20  ompressed to:", 
b100: 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65  tmpbuf, tmpbufle
b110: 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41  n);.#else.....CA
b120: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b130: 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20  F("Missing ZLIB 
b140: 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65  Support, this ce
b150: 72 74 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b  rtificate is lik
b160: 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29  ely useless...")
b170: 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  ;......tmpbuflen
b180: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d   = length;.....m
b190: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
b1a0: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e  al, length);.#en
b1b0: 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  dif......curr_en
b1c0: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
b1d0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
b1e0: 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75  ->length = tmpbu
b1f0: 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65  flen;.....curr_e
b200: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74  ntity->value = t
b210: 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f  mpbuf;.....curr_
b220: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
b230: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
b240: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
b250: 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09  TAG_PKCS15:.....
b260: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
b270: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
b280: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  r_entity));.....
b290: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
b2a0: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
b2b0: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
b2c0: 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a  byte = vval[0];.
b2d0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
b2e0: 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  >_next = NULL;..
b2f0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
b300: 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68  ..vval += length
b310: 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67  ;...vlen -= leng
b320: 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f  th;....if (curr_
b330: 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20  entity != NULL) 
b340: 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d  {....if (root ==
b350: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f   NULL) {.....roo
b360: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
b370: 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61  ....}.....if (la
b380: 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st != NULL) {...
b390: 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20  ..last->_next = 
b3a0: 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09  curr_entity;....
b3b0: 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72  }.....last = cur
b3c0: 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d  r_entity;...}..}
b3d0: 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b  ...return(root);
b3e0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
b3f0: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
b400: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
b410: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
b420: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
b430: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
b440: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
b450: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
b460: 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72   cackey_free_cer
b470: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
b480: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
b490: 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f  start, size_t co
b4a0: 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74  unt, int free_st
b4b0: 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69  art) {..size_t i
b4c0: 64 78 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  dx;...for (idx =
b4d0: 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b   0; idx < count;
b4e0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
b4f0: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
b500: 66 69 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65  ficate) {....fre
b510: 65 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72  e(start[idx].cer
b520: 74 69 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09  tificate);...}..
b530: 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61  }...if (free_sta
b540: 72 74 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61  rt) {...free(sta
b550: 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rt);..}...return
b560: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
b570: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
b580: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
b590: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
b5a0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
b5b0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
b5c0: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
b5d0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
b5e0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
b5f0: 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  identity *cackey
b600: 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75  _read_certs(stru
b610: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
b620: 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
b630: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
b640: 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e  y *certs, unsign
b650: 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20  ed long *count) 
b660: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
b670: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
b680: 63 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74  curr_id;..struct
b690: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
b6a0: 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63  ty *ccc_tlv, *cc
b6b0: 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76  c_curr, *app_tlv
b6c0: 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e  , *app_curr;..un
b6d0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f  signed char ccc_
b6e0: 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41  aid[] = {GSCIS_A
b6f0: 49 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e  ID_CCC};..unsign
b700: 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64  ed char curr_aid
b710: 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  [7];..unsigned l
b720: 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a  ong outidx = 0;.
b730: 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e  .cackey_ret tran
b740: 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e  saction_ret;..in
b750: 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  t certs_resizabl
b760: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
b770: 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09  , select_ret;...
b780: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b790: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
b7a0: 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e  ..if (count == N
b7b0: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
b7c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f  DEBUG_PRINTF("co
b7d0: 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74  unt is NULL, ret
b7e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b7f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
b800: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ULL);..}...if (c
b810: 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  erts != NULL) {.
b820: 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20  ..if (*count == 
b830: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
b840: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
b850: 75 65 73 74 65 64 20 77 65 20 72 65 74 75 72 6e  uested we return
b860: 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72   0 objects, shor
b870: 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09  t-circuit");....
b880: 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a  .return(certs);.
b890: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69  ..}..}.../* Begi
b8a0: 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72  n a SmartCard tr
b8b0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72  ansaction */..tr
b8c0: 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20  ansaction_ret = 
b8d0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
b8e0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b8f0: 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e  .if (transaction
b900: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
b910: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
b920: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b930: 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20  F("Unable begin 
b940: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
b950: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b960: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
b970: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ULL);..}...if (c
b980: 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  erts == NULL) {.
b990: 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
b9a0: 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
b9b0: 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d  * 5);...*count =
b9c0: 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69   5;...certs_resi
b9d0: 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c  zable = 1;..} el
b9e0: 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73  se {...certs_res
b9f0: 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a  izable = 0;..}..
ba00: 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43  ./* Select the C
ba10: 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65  CC Applet */..se
ba20: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
ba30: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
ba40: 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a  ot, ccc_aid, siz
ba50: 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09  eof(ccc_aid));..
ba60: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
ba70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
ba80: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ba90: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
baa0: 65 20 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20  e to select CCC 
bab0: 41 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e  Applet, returnin
bac0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
bad0: 0a 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
bae0: 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61  SmartCard Transa
baf0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
bb00: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
bb10: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75  n(slot);....retu
bb20: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
bb30: 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61  * Read all the a
bb40: 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20  pplets from the 
bb50: 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63  CCC's TLV */..cc
bb60: 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72  c_tlv = cackey_r
bb70: 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a  ead_tlv(slot);..
bb80: 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52  ./* Look for CAR
bb90: 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65  DURLs that coore
bba0: 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70  spond to PKI app
bbb0: 6c 65 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63  lets */..for (cc
bbc0: 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
bbd0: 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
bbe0: 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
bbf0: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b  >_next) {...CACK
bc00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bc10: 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e  "Found tag: %s .
bc20: 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  .. ", CACKEY_DEB
bc30: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
bc40: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67  TR(ccc_curr->tag
bc50: 29 29 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63  ));....if (ccc_c
bc60: 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49  urr->tag != GSCI
bc70: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b  S_TAG_CARDURL) {
bc80: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
bc90: 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
bca0: 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
bcb0: 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
bcc0: 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09  ARDURLs)");.....
bcd0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
bce0: 09 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e  .if ((ccc_curr->
bcf0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
bd00: 70 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f  pptype & CACKEY_
bd10: 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20  TLV_APP_PKI) != 
bd20: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
bd30: 4b 49 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  KI) {....CACKEY_
bd40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
bd50: 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
bd60: 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
bd70: 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c  out PKI applets,
bd80: 20 74 68 69 73 20 61 70 70 6c 65 74 20 73 75 70   this applet sup
bd90: 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22  ports: %s/%02x)"
bda0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
bdb0: 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53  UNC_APPTYPE_TO_S
bdc0: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
bdd0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
bde0: 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ype), (unsigned 
bdf0: 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  int) ccc_curr->v
be00: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
be10: 70 74 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74  ptype);.....cont
be20: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  inue;...}....CAC
be30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
be40: 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63  UF("RID:", ccc_c
be50: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
be60: 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28  rl->rid, sizeof(
be70: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
be80: 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a  cardurl->rid));.
be90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bea0: 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25  RINTF("AppID = %
beb0: 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59  s/%04lx", CACKEY
bec0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
bed0: 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  D_TO_STR(ccc_cur
bee0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
bef0: 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67  ->appid), (unsig
bf00: 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
bf10: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
bf20: 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43  l->appid);...CAC
bf30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bf40: 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f  ("ObjectID = %s/
bf50: 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
bf60: 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
bf70: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
bf80: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
bf90: 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69  objectid), (unsi
bfa0: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63  gned long) ccc_c
bfb0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
bfc0: 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a  rl->objectid);..
bfd0: 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69  ..memcpy(curr_ai
bfe0: 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  d, ccc_curr->val
bff0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
c000: 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72   sizeof(ccc_curr
c010: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
c020: 3e 72 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61  >rid));...curr_a
c030: 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
c040: 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f  id) - 2] = (ccc_
c050: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
c060: 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29  url->appid >> 8)
c070: 20 26 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f   & 0xff;...curr_
c080: 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f  aid[sizeof(curr_
c090: 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f  aid) - 1] = ccc_
c0a0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
c0b0: 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66  url->appid & 0xf
c0c0: 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20  f;..../* Select 
c0d0: 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
c0e0: 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74   */...select_ret
c0f0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
c100: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75  _applet(slot, cu
c110: 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  rr_aid, sizeof(c
c120: 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20  urr_aid));...if 
c130: 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43  (select_ret != C
c140: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
c150: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
c160: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
c170: 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c  d to select appl
c180: 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  et, skipping pro
c190: 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
c1a0: 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f  object");.....co
c1b0: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f  ntinue;...}..../
c1c0: 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74  * ... and object
c1d0: 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c   (file) */...sel
c1e0: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
c1f0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f  _select_file(slo
c200: 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t, ccc_curr->val
c210: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
c220: 63 74 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c  ctid);...if (sel
c230: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
c240: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
c250: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c260: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
c270: 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b   select file, sk
c280: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
c290: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
c2a0: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
c2b0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63  ;...}..../* Proc
c2c0: 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20  ess this file's 
c2d0: 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TLV looking for 
c2e0: 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
c2f0: 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b  ..app_tlv = cack
c300: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74  ey_read_tlv(slot
c310: 29 3b 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63  );....for (app_c
c320: 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61  urr = app_tlv; a
c330: 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72  pp_curr; app_cur
c340: 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e  r = app_curr->_n
c350: 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ext) {....CACKEY
c360: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
c370: 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
c380: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
c390: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
c3a0: 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
c3b0: 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61  if (app_curr->ta
c3c0: 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
c3d0: 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
c3e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c3f0: 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69  RINTF("  ... ski
c400: 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c  pping it (we onl
c410: 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52  y care about CER
c420: 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09  TIFICATEs)");...
c430: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
c440: 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20  }.....curr_id = 
c450: 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a  &certs[outidx];.
c460: 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
c470: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d  .memcpy(curr_id-
c480: 3e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69  >applet, curr_ai
c490: 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  d, sizeof(curr_i
c4a0: 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09  d->applet));....
c4b0: 63 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20  curr_id->file = 
c4c0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
c4d0: 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
c4e0: 64 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b  d;....curr_id->k
c4f0: 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09  eysize = -1;....
c500: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c510: 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75  INTF("Filling cu
c520: 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 20 28 25  rr_id->applet (%
c530: 70 29 20 77 69 74 68 20 25 6c 75 20 62 79 74 65  p) with %lu byte
c540: 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70  s:", curr_id->ap
c550: 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20  plet, (unsigned 
c560: 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72  long) sizeof(cur
c570: 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a  r_id->applet));.
c580: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c590: 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c  PRINTBUF("VAL:",
c5a0: 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74   curr_id->applet
c5b0: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  , sizeof(curr_id
c5c0: 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09  ->applet));.....
c5d0: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
c5e0: 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63  cate_len = app_c
c5f0: 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09  urr->length;....
c600: 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
c610: 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  icate = malloc(c
c620: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
c630: 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d  ate_len);....mem
c640: 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  cpy(curr_id->cer
c650: 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75  tificate, app_cu
c660: 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f  rr->value, curr_
c670: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
c680: 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75  len);.....if (ou
c690: 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20  tidx >= *count) 
c6a0: 7b 0a 09 09 09 09 69 66 20 28 63 65 72 74 73 5f  {.....if (certs_
c6b0: 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09  resizable) {....
c6c0: 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09  ..*count *= 2;..
c6d0: 09 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c  ....certs = real
c6e0: 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f  loc(certs, sizeo
c6f0: 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f  f(*certs) * (*co
c700: 75 6e 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73  unt));.....} els
c710: 65 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  e {......break;.
c720: 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ....}....}...}..
c730: 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  ..cackey_free_tl
c740: 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 69  v(app_tlv);....i
c750: 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f  f (outidx >= *co
c760: 75 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b  unt) {....break;
c770: 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
c780: 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c  _free_tlv(ccc_tl
c790: 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f  v);...*count = o
c7a0: 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72  utidx;...if (cer
c7b0: 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
c7c0: 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f  ..certs = reallo
c7d0: 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28  c(certs, sizeof(
c7e0: 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e  *certs) * (*coun
c7f0: 74 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65 72  t));..}.../* Ter
c800: 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
c810: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
c820: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
c830: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
c840: 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a  .return(certs);.
c850: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
c860: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
c870: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
c880: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
c890: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
c8a0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
c8b0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
c8c0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
c8d0: 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65  _t cackey_signde
c8e0: 63 72 79 70 74 28 73 74 72 75 63 74 20 63 61 63  crypt(struct cac
c8f0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
c900: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
c910: 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
c920: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c930: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66  *buf, size_t buf
c940: 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  len, unsigned ch
c950: 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65  ar *outbuf, size
c960: 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e  _t outbuflen, in
c970: 74 20 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20  t padInput, int 
c980: 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09  unpadOutput) {..
c990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
c9a0: 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73  mpbuf, *tmpbuf_s
c9b0: 2c 20 2a 6f 75 74 62 75 66 5f 73 3b 0a 09 75 6e  , *outbuf_s;..un
c9c0: 73 69 67 6e 65 64 20 63 68 61 72 20 62 79 74 65  signed char byte
c9d0: 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09  s_to_send, p1;..
c9e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c  unsigned char bl
c9f0: 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79  ocktype;..cackey
ca00: 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  _ret send_ret;..
ca10: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
ca20: 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76  e;..ssize_t retv
ca30: 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66  al = 0, unpadoff
ca40: 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70  set;..size_t tmp
ca50: 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20  buflen, padlen, 
ca60: 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69  tmpoutbuflen;..i
ca70: 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  nt free_tmpbuf =
ca80: 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43   0;..int le;...C
ca90: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
caa0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
cab0: 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c  .if (slot == NUL
cac0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
cad0: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
cae0: 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c  r.  slot is NULL
caf0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
cb00: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 20  );..}...if (buf 
cb10: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
cb20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cb30: 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69 73  ("Error.  buf is
cb40: 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
cb50: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
cb60: 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29  (outbuf == NULL)
cb70: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
cb80: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
cb90: 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c 4c    outbuf is NULL
cba0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
cbb0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e  );..}...if (iden
cbc0: 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tity == NULL) {.
cbd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cbe0: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69  RINTF("Error.  i
cbf0: 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22  dentity is NULL"
cc00: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
cc10: 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74  ;..}...if (ident
cc20: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
cc30: 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
cc40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
cc50: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65  NTF("Error.  ide
cc60: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
cc70: 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tity is NULL");.
cc80: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
cc90: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
cca0: 20 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73 69   identity Key si
ccb0: 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  ze */..if (ident
ccc0: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
ccd0: 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29  ty->keysize < 0)
cce0: 20 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e 70   {...identity->p
ccf0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
cd00: 79 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f  ysize = x509_to_
cd10: 6b 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74 79  keysize(identity
cd20: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
cd30: 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 69 64  >certificate, id
cd40: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
cd50: 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
cd60: 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a  te_len);..}.../*
cd70: 20 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f 20   Pad message to 
cd80: 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20  key size */..if 
cd90: 28 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 09 69  (padInput) {...i
cda0: 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  f (identity->pcs
cdb0: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
cdc0: 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 69 66  ize > 0) {....if
cdd0: 20 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e   (buflen != iden
cde0: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
cdf0: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a  ity->keysize) {.
ce00: 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3e  ....if (buflen >
ce10: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
ce20: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
ce30: 7a 65 20 2b 20 33 29 29 20 7b 0a 09 09 09 09 09  ze + 3)) {......
ce40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ce50: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 65 73  NTF("Error.  Mes
ce60: 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  sage is too larg
ce70: 65 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 79 70  e to sign/decryp
ce80: 74 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  t");.......retur
ce90: 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  n(-1);.....}....
cea0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64  ..tmpbuflen = id
ceb0: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
cec0: 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a  ntity->keysize;.
ced0: 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c  ....tmpbuf = mal
cee0: 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  loc(tmpbuflen);.
cef0: 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
cf00: 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e  = 1;......padlen
cf10: 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62   = tmpbuflen - b
cf20: 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09  uflen - 3;......
cf30: 2f 2a 20 52 53 41 20 50 4b 43 53 23 31 20 45 4d  /* RSA PKCS#1 EM
cf40: 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50 61  SA-PKCS1-v1_5 Pa
cf50: 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70  dding */.....tmp
cf60: 62 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09  buf[0] = 0x00;..
cf70: 09 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30  ...tmpbuf[1] = 0
cf80: 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28  x01;.....memset(
cf90: 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46 46  &tmpbuf[2], 0xFF
cfa0: 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74  , padlen);.....t
cfb0: 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32  mpbuf[padlen + 2
cfc0: 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d  ]= 0x00;.....mem
cfd0: 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c  cpy(&tmpbuf[padl
cfe0: 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75  en + 3], buf, bu
cff0: 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b  flen);......CACK
d000: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
d010: 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62  F("Unpadded:", b
d020: 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09  uf, buflen);....
d030: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d040: 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22  INTBUF("Padded:"
d050: 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66  , tmpbuf, tmpbuf
d060: 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20  len);....} else 
d070: 7b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 62  {.....tmpbuf = b
d080: 75 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c 65  uf;.....tmpbufle
d090: 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09  n = buflen;.....
d0a0: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
d0b0: 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  .....padlen = 0;
d0c0: 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
d0d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d0e0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
d0f0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b 65 79  to determine key
d100: 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68   size, hoping th
d110: 65 20 6d 65 73 73 61 67 65 20 69 73 20 70 72 6f  e message is pro
d120: 70 65 72 6c 79 20 70 61 64 64 65 64 21 22 29 3b  perly padded!");
d130: 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75  .....tmpbuf = bu
d140: 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  f;....tmpbuflen 
d150: 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65  = buflen;....fre
d160: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
d170: 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d  .padlen = 0;...}
d180: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70  ..} else {...tmp
d190: 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70  buf = buf;...tmp
d1a0: 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
d1b0: 0a 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
d1c0: 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30   0;...padlen = 0
d1d0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20  ;..}.../* Begin 
d1e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
d1f0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
d200: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
d210: 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72  ../* Select corr
d220: 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43  ect applet */..C
d230: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d240: 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70  TF("Selecting ap
d250: 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70  plet found at %p
d260: 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d   ...", identity-
d270: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
d280: 61 70 70 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79  applet);..cackey
d290: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
d2a0: 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
d2b0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70  csc_identity->ap
d2c0: 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65  plet, sizeof(ide
d2d0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
d2e0: 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a  tity->applet));.
d2f0: 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72  ../* Select corr
d300: 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63  ect file */..cac
d310: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
d320: 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e  slot, identity->
d330: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66  pcsc_identity->f
d340: 69 6c 65 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73  ile);...tmpbuf_s
d350: 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62   = tmpbuf;..outb
d360: 75 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09  uf_s = outbuf;..
d370: 77 68 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e  while (tmpbuflen
d380: 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66  ) {...if (tmpbuf
d390: 6c 65 6e 20 3e 20 32 34 35 29 20 7b 0a 09 09 09  len > 245) {....
d3a0: 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20  bytes_to_send = 
d3b0: 32 34 35 3b 0a 09 09 09 70 31 20 3d 20 30 78 38  245;....p1 = 0x8
d3c0: 30 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b  0;....le = 0x00;
d3d0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62  ...} else {....b
d3e0: 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74  ytes_to_send = t
d3f0: 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 70 31 20  mpbuflen;....p1 
d400: 3d 20 30 78 30 30 3b 0a 09 09 09 6c 65 20 3d 20  = 0x00;....le = 
d410: 30 78 30 30 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70  0x00;...}....tmp
d420: 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62  outbuflen = outb
d430: 75 66 6c 65 6e 3b 0a 0a 09 09 73 65 6e 64 5f 72  uflen;....send_r
d440: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d450: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d460: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
d470: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
d480: 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54  NSTR_SIGNDECRYPT
d490: 2c 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65  , p1, 0x00, byte
d4a0: 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75  s_to_send, tmpbu
d4b0: 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65  f, le, &respcode
d4c0: 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75  , outbuf, &tmpou
d4d0: 74 62 75 66 6c 65 6e 29 3b 0a 09 09 69 66 20 28  tbuflen);...if (
d4e0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
d4f0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
d500: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d510: 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e  PRINTF("ADPU Sen
d520: 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72  ding Failed -- r
d530: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
d540: 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72  r.");.....if (fr
d550: 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09  ee_tmpbuf) {....
d560: 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b  .if (tmpbuf_s) {
d570: 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75  ......free(tmpbu
d580: 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  f_s);.....}....}
d590: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e  ...../* End tran
d5a0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61  saction */....ca
d5b0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
d5c0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
d5d0: 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
d5e0: 30 78 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41  0x6982) {.....CA
d5f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d600: 46 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74  F("Security stat
d610: 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65  us not satisifie
d620: 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45  d.  Returning NE
d630: 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09  EDLOGIN");......
d640: 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74  slot->slot_reset
d650: 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e   = 1;.....slot->
d660: 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
d670: 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
d680: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  ;......return(CA
d690: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44  CKEY_PCSC_E_NEED
d6a0: 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09  LOGIN);....}....
d6b0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
d6c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
d6d0: 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
d6e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d6f0: 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73  RINTF("Token abs
d700: 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
d710: 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a  TOKENABSENT");..
d720: 09 09 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72  ....slot->slot_r
d730: 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c  eset = 1;.....sl
d740: 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot->token_flags 
d750: 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
d760: 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72  IRED;......retur
d770: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
d780: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
d790: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  .}.....return(-1
d7a0: 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66  );...}....tmpbuf
d7b0: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   += bytes_to_sen
d7c0: 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d  d;...tmpbuflen -
d7d0: 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
d7e0: 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d  ....outbuf += tm
d7f0: 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75  poutbuflen;...ou
d800: 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75  tbuflen -= tmpou
d810: 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61  tbuflen;...retva
d820: 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  l += tmpoutbufle
d830: 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65  n;..}...if (free
d840: 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20  _tmpbuf) {...if 
d850: 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
d860: 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
d870: 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20  ..}..}...outbuf 
d880: 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a  = outbuf_s;.../*
d890: 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
d8a0: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
d8b0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
d8c0: 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  );..#ifdef CACKE
d8d0: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
d8e0: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
d8f0: 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66  _MAX..if (outbuf
d900: 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  len > _POSIX_SSI
d910: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
d920: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d930: 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65  "Outbuflen excee
d940: 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
d950: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
d960: 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
d970: 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20  li, outbuflen = 
d980: 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
d990: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
d9a0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d9b0: 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72  outbuflen);....r
d9c0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
d9d0: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
d9e0: 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a  /* Unpad reply *
d9f0: 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70  /..if (unpadOutp
da00: 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76  ut) {...if (retv
da10: 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43  al < 3) {....CAC
da20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
da30: 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73  ("Reply is too s
da40: 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74  mall, we are not
da50: 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d   able to unpad -
da60: 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
da70: 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
da80: 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
da90: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
daa0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
dab0: 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
dac0: 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
dad0: 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
dae0: 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
daf0: 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f  l);...}....if (o
db00: 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30  utbuf[0] != 0x00
db10: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
db20: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65  BUG_PRINTF("Unre
db30: 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67  cognized padding
db40: 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69   scheme -- passi
db50: 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69  ng back and hopi
db60: 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21  ng for the best!
db70: 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
db80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
db90: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
dba0: 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
dbb0: 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
dbc0: 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74   retval);....ret
dbd0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d  urn(retval);...}
dbe0: 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20  ....blocktype = 
dbf0: 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70  outbuf[1];...unp
dc00: 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09  adoffset = 0;...
dc10: 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79  .switch (blockty
dc20: 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78  pe) {....case 0x
dc30: 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  00:...../* Paddi
dc40: 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65  ng Scheme 1, the
dc50: 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20   first non-zero 
dc60: 62 79 74 65 20 69 73 20 74 68 65 20 73 74 61 72  byte is the star
dc70: 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09  t of data */....
dc80: 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
dc90: 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
dca0: 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
dcb0: 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
dcc0: 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
dcd0: 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78  padoffset] != 0x
dce0: 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  00) {.......brea
dcf0: 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
dd00: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
dd10: 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20  se 0x01:...../* 
dd20: 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32  Padding Scheme 2
dd30: 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20  , pad bytes are 
dd40: 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79  0xFF followed by
dd50: 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72   0x00 */.....for
dd60: 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
dd70: 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c  2; unpadoffset <
dd80: 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66   retval; unpadof
dd90: 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69  fset++) {......i
dda0: 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
ddb0: 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20  ffset] != 0xFF) 
ddc0: 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75 74 62  {.......if (outb
ddd0: 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
dde0: 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  == 0x00) {......
ddf0: 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
de00: 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  .........break;.
de10: 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
de20: 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
de30: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
de40: 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20  id padding data 
de50: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67  found, returning
de60: 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f   in failure, sho
de70: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78  uld have been 0x
de80: 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22  00 found 0x%02x"
de90: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
dea0: 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66   outbuf[unpadoff
deb0: 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72  set]);.........r
dec0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09  eturn(-1);......
ded0: 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
dee0: 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
def0: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
df00: 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61  lid padding data
df10: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e   found, returnin
df20: 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68  g in failure, sh
df30: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30  ould have been 0
df40: 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78  xFF found 0x%02x
df50: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ", (unsigned int
df60: 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66  ) outbuf[unpadof
df70: 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72  fset]);........r
df80: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09  eturn(-1);......
df90: 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  }.....}.....brea
dfa0: 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a  k;....case 0x02:
dfb0: 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
dfc0: 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79  Scheme 3, pad by
dfd0: 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f  tes are non-zero
dfe0: 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65   first zero byte
dff0: 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65   found is the se
e000: 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a  perator byte */.
e010: 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
e020: 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
e030: 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
e040: 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
e050: 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
e060: 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d  [unpadoffset] ==
e070: 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75   0x00) {.......u
e080: 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
e090: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
e0a0: 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  .}.....}.....bre
e0b0: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75  ak;...}....if (u
e0c0: 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74  npadoffset > ret
e0d0: 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  val) {....CACKEY
e0e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
e0f0: 66 66 73 65 74 20 67 72 65 61 74 65 72 20 74 68  ffset greater th
e100: 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61  an reply size, a
e110: 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64  borting.  (unpad
e120: 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65  offset = %lu, re
e130: 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75  tval = %lu)", (u
e140: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e  nsigned long) un
e150: 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69  padoffset, (unsi
e160: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61  gned long) retva
e170: 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
e180: 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  1);...}....CACKE
e190: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
e1a0: 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62  ("Padded:", outb
e1b0: 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  uf, retval);....
e1c0: 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f  retval -= unpado
e1d0: 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65  ffset;...memmove
e1e0: 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20  (outbuf, outbuf 
e1f0: 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72  + unpadoffset, r
e200: 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45  etval);....CACKE
e210: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
e220: 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75  ("Unpadded:", ou
e230: 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09  tbuf, retval);..
e240: 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
e250: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
e260: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
e270: 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
e280: 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
e290: 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
e2a0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20  retval);.}../*. 
e2b0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
e2c0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
e2d0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
e2e0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
e2f0: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
e300: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
e310: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
e320: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
e330: 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75  ackey_login(stru
e340: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
e350: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
e360: 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e  har *pin, unsign
e370: 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c  ed long pin_len,
e380: 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61   int *tries_rema
e390: 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69  ining_p) {..unsi
e3a0: 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69  gned char cac_pi
e3b0: 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78  n[8] = {0xFF, 0x
e3c0: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
e3d0: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
e3e0: 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36  , 0xFF};..uint16
e3f0: 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  _t response_code
e400: 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
e410: 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e  aining;..int sen
e420: 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69  d_ret;.../* Indi
e430: 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f 20  cate that we do 
e440: 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68  not know about h
e450: 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72  ow many tries ar
e460: 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09  e remaining */..
e470: 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
e480: 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65  ing_p) {...*trie
e490: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20  s_remaining_p = 
e4a0: 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61  -1;..}.../* Appa
e4b0: 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73  rently, CAC PINs
e4c0: 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38   are *EXACTLY* 8
e4d0: 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70   bytes long -- p
e4e0: 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20  ad with 0xFF if 
e4f0: 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
e500: 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20   (pin_len >= 8) 
e510: 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
e520: 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20  in, pin, 8);..} 
e530: 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
e540: 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69  cac_pin, pin, pi
e550: 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  n_len);..}.../* 
e560: 49 73 73 75 65 20 50 49 4e 20 56 65 72 69 66 79  Issue PIN Verify
e570: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
e580: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
e590: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
e5a0: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
e5b0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20  S_INSTR_VERIFY, 
e5c0: 30 78 30 30 2c 20 30 78 30 30 2c 20 73 69 7a 65  0x00, 0x00, size
e5d0: 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  of(cac_pin), cac
e5e0: 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73  _pin, 0x00, &res
e5f0: 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c  ponse_code, NULL
e600: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
e610: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
e620: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
e630: 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f  if ((response_co
e640: 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20  de & 0x63C0) == 
e650: 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69  0x63C0) {....tri
e660: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28  es_remaining = (
e670: 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
e680: 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  0xF);.....CACKEY
e690: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
e6a0: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
e6b0: 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73  failed, %i tries
e6c0: 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69   remaining", tri
e6d0: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a  es_remaining);..
e6e0: 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
e6f0: 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09  aining_p) {.....
e700: 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
e710: 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69  _p = tries_remai
e720: 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  ning;....}.....r
e730: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
e740: 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d  C_E_BADPIN);...}
e750: 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65  ....if (response
e760: 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29  _code == 0x6983)
e770: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
e780: 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
e790: 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c  erification fail
e7a0: 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f  ed, device is lo
e7b0: 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75  cked");.....retu
e7c0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
e7d0: 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09  _LOCKED);...}...
e7e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
e7f0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
e800: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
e810: 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
e820: 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65  rification succe
e830: 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  eded");...return
e840: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
e850: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
e860: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
e870: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
e880: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
e890: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
e8a0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
e8b0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
e8c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
e8d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
e8e0: 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73  _token_present(s
e8f0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
e900: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b  t *slot) {..cack
e910: 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e  ey_ret pcsc_conn
e920: 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20  ect_ret;..DWORD 
e930: 72 65 61 64 65 72 5f 6c 65 6e 2c 20 73 74 61 74  reader_len, stat
e940: 65 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  e, protocol, atr
e950: 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b  _len;..BYTE atr[
e960: 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09  MAX_ATR_SIZE];..
e970: 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c  LONG status_ret,
e980: 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65   scard_reconn_re
e990: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
e9a0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
e9b0: 2e 22 29 3b 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e  .");...pcsc_conn
e9c0: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
e9d0: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
e9e0: 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  ot);..if (pcsc_c
e9f0: 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
ea00: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
ea10: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
ea20: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
ea30: 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
ea40: 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
ea50: 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
ea60: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
ea70: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
ea80: 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e  T);..}...atr_len
ea90: 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a   = sizeof(atr);.
eaa0: 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43  .status_ret = SC
eab0: 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e  ardStatus(slot->
eac0: 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c  pcsc_card, NULL,
ead0: 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73   &reader_len, &s
eae0: 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c  tate, &protocol,
eaf0: 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b   atr, &atr_len);
eb00: 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
eb10: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
eb20: 45 53 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 73  ESS) {...slot->s
eb30: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
eb40: 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
eb50: 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
eb60: 45 51 55 49 52 45 44 3b 0a 0a 09 09 69 66 20 28  EQUIRED;....if (
eb70: 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43  status_ret == SC
eb80: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
eb90: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
eba0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
ebb0: 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61  t required, plea
ebc0: 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09  se hold...");...
ebd0: 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  ..scard_reconn_r
ebe0: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
ebf0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
ec00: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
ec10: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
ec20: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
ec30: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
ec40: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
ec50: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
ec60: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
ec70: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
ec80: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
ec90: 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63  /* Update protoc
eca0: 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e  ol */.....slot->
ecb0: 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f  protocol = proto
ecc0: 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20 52 65 2d  col;....../* Re-
ecd0: 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61  establish transa
ece0: 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73  ction, if it was
ecf0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09   present */.....
ed00: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
ed10: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
ed20: 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72   {......slot->tr
ed30: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
ed40: 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62  -;......cackey_b
ed50: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
ed60: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  (slot);.....}...
ed70: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ed80: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75  PRINTF("Reset su
ed90: 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72  ccessful, requer
eda0: 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74  ying");.....stat
edb0: 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
edc0: 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
edd0: 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
ede0: 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
edf0: 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
ee00: 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09   &atr_len);.....
ee10: 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21  if (status_ret !
ee20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
ee30: 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  S) {......CACKEY
ee40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
ee50: 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71  till unable to q
ee60: 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73  uery card status
ee70: 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
ee80: 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
ee90: 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20  Status() = %s", 
eea0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
eeb0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
eec0: 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a  R(status_ret));.
eed0: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
eee0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
eef0: 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09  ABSENT);.....}..
ef00: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
ef10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ef20: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65  TF("Unable to re
ef30: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
ef40: 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
ef50: 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52   absent.  SCardR
ef60: 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22  econnect() = %s"
ef70: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
ef80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
ef90: 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e  STR(scard_reconn
efa0: 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74  _ret));......ret
efb0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
efc0: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
efd0: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
efe0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
eff0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
f000: 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
f010: 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
f020: 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
f030: 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
f040: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
f050: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
f060: 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
f070: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
f080: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
f090: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d  NABSENT);...}..}
f0a0: 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26 20  ...if ((state & 
f0b0: 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d  SCARD_ABSENT) ==
f0c0: 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b   SCARD_ABSENT) {
f0d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f0e0: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
f0f0: 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e  absent, returnin
f100: 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29  g token absent")
f110: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
f120: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
f130: 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  BSENT);..}...CAC
f140: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f150: 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  ("Returning toke
f160: 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09  n present.");...
f170: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
f180: 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
f190: 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  T);.}../*. * SYN
f1a0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
f1b0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
f1c0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
f1d0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
f1e0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
f1f0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
f200: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
f210: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63  size_t cackey_pc
f220: 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
f230: 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b  abel(struct cack
f240: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
f250: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
f260: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
f270: 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c  _buf, unsigned l
f280: 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  ong label_buf_le
f290: 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
f2a0: 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 5f  ong certificate_
f2b0: 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61 62 65  len;..char *labe
f2c0: 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63  l_asn1;..void *c
f2d0: 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74  ertificate;..int
f2e0: 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
f2f0: 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ..certificate = 
f300: 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
f310: 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63  icate;..certific
f320: 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69  ate_len = identi
f330: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
f340: 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69  len;...if (certi
f350: 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20  ficate_len < 0) 
f360: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
f370: 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72  .}...x509_read_r
f380: 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62  et = x509_to_sub
f390: 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65  ject(certificate
f3a0: 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
f3b0: 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61  n, (void **) &la
f3c0: 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28  bel_asn1);..if (
f3d0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
f3e0: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
f3f0: 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61  );..}...x509_rea
f400: 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
f410: 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
f420: 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
f430: 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
f440: 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
f450: 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09  uf_len, "CN");..
f460: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
f470: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39  t <= 0) {...x509
f480: 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
f490: 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61  _dn_to_string(la
f4a0: 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72  bel_asn1, x509_r
f4b0: 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a  ead_ret, (char *
f4c0: 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62  ) label_buf, lab
f4d0: 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c  el_buf_len, NULL
f4e0: 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72  );....if (x509_r
f4f0: 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
f500: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f510: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  .}..}..#ifdef CA
f520: 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
f530: 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
f540: 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30  IZE_MAX..if (x50
f550: 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f  9_read_ret > _PO
f560: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
f570: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f580: 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61  PRINTF("x509_rea
f590: 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d 61  d_ret exceeds ma
f5a0: 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
f5b0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
f5c0: 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78  e. (max = %li, x
f5d0: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25  509_read_ret = %
f5e0: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
f5f0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
f600: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78  unsigned long) x
f610: 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a  509_read_ret);..
f620: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
f630: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
f640: 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72  ...return(x509_r
f650: 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20  ead_ret);.}../* 
f660: 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
f670: 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
f680: 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
f690: 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75  create(void **mu
f6a0: 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
f6b0: 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
f6c0: 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
f6d0: 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
f6e0: 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
f6f0: 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
f700: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
f710: 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
f720: 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
f730: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
f740: 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
f750: 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
f760: 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c  read_mutex = mal
f770: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72  loc(sizeof(*pthr
f780: 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69  ead_mutex));...i
f790: 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65  f (!pthread_mute
f7a0: 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  x) {....CACKEY_D
f7b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
f7c0: 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  led to allocate 
f7d0: 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72  memory.");.....r
f7e0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
f7f0: 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
f800: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
f810: 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75  _init(pthread_mu
f820: 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66  tex, NULL);...if
f830: 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
f840: 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
f850: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f860: 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69  "pthread_mutex_i
f870: 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 65  nit() returned e
f880: 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
f890: 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
f8a0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
f8b0: 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74  }....*mutex = pt
f8c0: 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20  hread_mutex;..} 
f8d0: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
f8e0: 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
f8f0: 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
f900: 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
f910: 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
f920: 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
f930: 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
f940: 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
f950: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f960: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
f970: 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29  gs.CreateMutex()
f980: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
f990: 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
f9a0: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
f9b0: 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
f9c0: 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
f9d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f9e0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
f9f0: 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
fa00: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
fa10: 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
fa20: 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
fa30: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
fa40: 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d  tex_lock(void *m
fa50: 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
fa60: 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
fa70: 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
fa80: 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
fa90: 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
faa0: 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
fab0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
fac0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
fad0: 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
fae0: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
faf0: 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
fb00: 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
fb10: 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75  hread_mutex = mu
fb20: 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f  tex;....pthread_
fb30: 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64  retval = pthread
fb40: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72  _mutex_lock(pthr
fb50: 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66  ead_mutex);...if
fb60: 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
fb70: 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
fb80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fb90: 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c  "pthread_mutex_l
fba0: 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
fbb0: 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
fbc0: 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
fbd0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
fbe0: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
fbf0: 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f   (cackey_args.Lo
fc00: 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
fc10: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
fc20: 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
fc30: 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
fc40: 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
fc50: 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
fc60: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fc70: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
fc80: 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20  rgs.LockMutex() 
fc90: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
fca0: 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
fcb0: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
fcc0: 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
fcd0: 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
fce0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fcf0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
fd00: 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
fd10: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
fd20: 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
fd30: 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
fd40: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
fd50: 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a  ex_unlock(void *
fd60: 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
fd70: 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
fd80: 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
fd90: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
fda0: 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
fdb0: 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
fdc0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
fdd0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
fde0: 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
fdf0: 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
fe00: 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
fe10: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
fe20: 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
fe30: 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
fe40: 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
fe50: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70  d_mutex_unlock(p
fe60: 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09  thread_mutex);..
fe70: 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
fe80: 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
fe90: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fea0: 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
feb0: 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72  x_unlock() retur
fec0: 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
fed0: 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
fee0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
fef0: 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
ff00: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
ff10: 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20  gs.UnlockMutex) 
ff20: 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
ff30: 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
ff40: 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  .UnlockMutex(mut
ff50: 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
ff60: 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
ff70: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
ff80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ff90: 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  "cackey_args.Unl
ffa0: 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
ffb0: 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
ffc0: 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
ffd0: 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
ffe0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
fff0: 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
10000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10010 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
10020 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
10030 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(0);.}..stati
10040 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  c CK_ATTRIBUTE_P
10050 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74  TR cackey_get_at
10060 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45  tributes(CK_OBJE
10070 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63  CT_CLASS objectc
10080 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61 63  lass, struct cac
10090 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
100a0 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
100b0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
100c0 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e  ity_num, CK_ULON
100d0 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
100e0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f  {..static CK_BBO
100f0 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a  OL ck_true = 1;.
10100 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c  .static CK_BBOOL
10110 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09   ck_false = 0;..
10120 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72  CK_ULONG numattr
10130 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f  s = 0, retval_co
10140 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
10150 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74  TE_TYPE curr_att
10160 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52  r_type;..CK_ATTR
10170 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c  IBUTE curr_attr,
10180 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f   *retval;..CK_VO
10190 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
101a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
101b0 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  Len;..CK_OBJECT_
101c0 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f  CLASS ck_object_
101d0 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49  class;..CK_CERTI
101e0 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63  FICATE_TYPE ck_c
101f0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
10200 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b  ..CK_KEY_TYPE ck
10210 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55  _key_type;..CK_U
10220 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66  TF8CHAR ucTmpBuf
10230 5b 31 30 32 34 5d 3b 0a 09 75 6e 73 69 67 6e 65  [1024];..unsigne
10240 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  d char *certific
10250 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65  ate;..ssize_t ce
10260 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
10270 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  -1, x509_read_re
10280 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66  t;..int pValue_f
10290 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ree;...CACKEY_DE
102a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
102b0 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20  ed (objectClass 
102c0 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f  = %lu, identity_
102d0 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  num = %lu).", (u
102e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62  nsigned long) ob
102f0 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74  jectclass, ident
10300 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 69 66 20 28  ity_num);...if (
10310 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
10320 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
10330 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
10340 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20   CKO_PUBLIC_KEY 
10350 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
10360 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
10370 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  Y) {...CACKEY_DE
10380 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
10390 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
103a0 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
103b0 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a  object class");.
103c0 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
103d0 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72  ..}.../* Get Cer
103e0 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  t */..if (identi
103f0 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
10400 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10410 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
10420 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
10430 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79   invalid identiy
10440 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09   provided");....
10450 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
10460 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
10470 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
10480 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
10490 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
104a0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
104b0 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
104c0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d  ificate_len == -
104d0 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65  1 || certificate
104e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
104f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10500 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
10510 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
10520 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65  his identity doe
10530 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e  s not have an X.
10540 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
10550 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10560 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  it and will not 
10570 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72  work");....retur
10580 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
10590 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72   Verify that cer
105a0 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e  tificate is ASN.
105b0 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20  1 encoded X.509 
105c0 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
105d0 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69  if (x509_to_seri
105e0 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
105f0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
10600 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09   NULL) < 0) {...
10610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10620 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
10630 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
10640 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69   the X.509 certi
10650 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
10660 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e  d with this iden
10670 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69  tity is not vali
10680 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
10690 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  ULL);..}...retva
106a0 6c 5f 63 6f 75 6e 74 20 3d 20 31 36 3b 0a 09 72  l_count = 16;..r
106b0 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72  etval = malloc(r
106c0 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
106d0 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
106e0 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
106f0 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f  _type = 0; curr_
10700 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65  attr_type < 0xce
10710 35 33 36 33 35 66 3b 20 63 75 72 72 5f 61 74 74  53635f; curr_att
10720 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66  r_type++) {...if
10730 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
10740 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09   == 0x800) {....
10750 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
10760 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d   0xce536300;...}
10770 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20  ....pValue_free 
10780 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20  = 0;...pValue = 
10790 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
107a0 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
107b0 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  1;....switch (cu
107c0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a  rr_attr_type) {.
107d0 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53  ...case CKA_CLAS
107e0 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
107f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
10800 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
10810 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30   CKA_CLASS (0x%0
10820 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
10830 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
10840 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
10850 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  .ck_object_class
10860 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a   = objectclass;.
10870 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
10880 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
10890 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
108a0 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63   sizeof(ck_objec
108b0 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43  t_class);......C
108c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
108d0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
108e0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
108f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10900 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  ) *((CK_OBJECT_C
10910 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c  LASS *) pValue),
10920 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
10930 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
10940 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
10950 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  ;....case CKA_TO
10960 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  KEN:.....CACKEY_
10970 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10980 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
10990 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78  te CKA_TOKEN (0x
109a0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
109b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
109c0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
109d0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
109e0 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
109f0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
10a00 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
10a10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10a20 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
10a30 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
10a40 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10a50 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
10a60 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
10a70 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10a80 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
10a90 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10aa0 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
10ab0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10ac0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
10ad0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
10ae0 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78  TRUSTED (0x%08lx
10af0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
10b00 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
10b10 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
10b20 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
10b30 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
10b40 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
10b50 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
10b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
10b70 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
10b80 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
10b90 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
10ba0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
10bb0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
10bc0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
10bd0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
10be0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
10bf0 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09  MODIFIABLE:.....
10c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10c10 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
10c20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f  attribute CKA_MO
10c30 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c  DIFIABLE (0x%08l
10c40 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
10c50 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
10c60 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
10c70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
10c80 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
10c90 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
10ca0 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
10cb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10cc0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
10cd0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
10ce0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
10cf0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
10d00 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
10d10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
10d20 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
10d30 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10d40 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41  KA_LABEL:.....CA
10d50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10d60 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
10d70 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45  tribute CKA_LABE
10d80 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  L (0x%08lx) ..."
10d90 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10da0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
10db0 29 3b 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20  );....../* XXX: 
10dc0 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a  Determine name *
10dd0 2f 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  /.....ulValueLen
10de0 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61   = snprintf((cha
10df0 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73  r *) ucTmpBuf, s
10e00 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c  izeof(ucTmpBuf),
10e10 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22   "Identity #%lu"
10e20 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10e30 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  ) identity_num);
10e40 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63  .....pValue = uc
10e50 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 66 20  TmpBuf;......if 
10e60 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73  (ulValueLen >= s
10e70 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29  izeof(ucTmpBuf))
10e80 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c   {......ulValueL
10e90 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 56 61  en = 0;......pVa
10ea0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
10eb0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
10ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
10ed0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
10ee0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
10ef0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
10f00 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
10f10 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10f20 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41  KA_VALUE:.....CA
10f30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10f40 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
10f50 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55  tribute CKA_VALU
10f60 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
10f70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10f80 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
10f90 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28  );......switch (
10fa0 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09  objectclass) {..
10fb0 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49  ....case CKO_PRI
10fc0 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09  VATE_KEY:.......
10fd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10fe0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
10ff0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
11000 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70 72  ause we are a pr
11010 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09  ivate key.");...
11020 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
11030 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43  .case CKO_PUBLIC
11040 5f 4b 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58  _KEY:......./* X
11050 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09  XX: TODO */.....
11060 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
11070 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  ase CKO_CERTIFIC
11080 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75  ATE:.......pValu
11090 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b  e = certificate;
110a0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
110b0 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f  n = certificate_
110c0 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  len;........brea
110d0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  k;.....}......CA
110e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
110f0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
11100 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
11110 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
11120 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
11130 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
11140 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a  ase CKA_ISSUER:.
11150 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11160 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
11170 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
11180 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 6c  A_ISSUER (0x%08l
11190 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
111a0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
111b0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
111c0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
111d0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
111e0 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
111f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
11200 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
11210 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
11220 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
11230 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09  ificate.");.....
11240 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
11250 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
11260 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
11270 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
11280 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73  et = x509_to_iss
11290 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c  uer(certificate,
112a0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
112b0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
112c0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
112d0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
112e0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
112f0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
11300 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
11310 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
11320 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
11330 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11340 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
11350 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
11360 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
11370 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
11380 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
11390 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
113a0 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41  L_NUMBER:.....CA
113b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
113c0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
113d0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49  tribute CKA_SERI
113e0 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38  AL_NUMBER (0x%08
113f0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
11400 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
11410 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
11420 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
11430 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
11440 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
11450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11460 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
11470 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
11480 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
11490 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09  tificate.");....
114a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
114b0 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
114c0 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
114d0 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
114e0 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65  ret = x509_to_se
114f0 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
11500 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
11510 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
11520 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
11530 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
11540 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
11550 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
11560 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
11570 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
11580 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
11590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
115a0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
115b0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
115c0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
115d0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
115e0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
115f0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55  ;....case CKA_SU
11600 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45  BJECT:.....CACKE
11610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11620 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
11630 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  bute CKA_SUBJECT
11640 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
11650 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11660 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
11670 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
11680 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
11690 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
116a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
116b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
116c0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
116d0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
116e0 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e  t a certificate.
116f0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
11700 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
11710 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
11720 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
11730 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
11740 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72  9_to_subject(cer
11750 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
11760 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
11770 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
11780 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
11790 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
117a0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
117b0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
117c0 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
117d0 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
117e0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
117f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
11800 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
11810 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
11820 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
11830 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
11840 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
11850 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b  CKA_ID:.....CACK
11860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11870 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
11880 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78  ibute CKA_ID (0x
11890 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
118a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
118b0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
118c0 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d  ...ucTmpBuf[0] =
118d0 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20   ((identity_num 
118e0 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66  + 1) >> 8) & 0xf
118f0 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  f;.....ucTmpBuf[
11900 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f  1] =  (identity_
11910 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b  num + 1) & 0xff;
11920 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
11930 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c  ucTmpBuf;.....ul
11940 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09  ValueLen = 2;...
11950 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11960 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
11970 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
11980 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
11990 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
119a0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
119b0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
119c0 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
119d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
119e0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
119f0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
11a00 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
11a10 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
11a20 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11a30 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
11a40 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
11a50 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
11a60 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
11a70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11a80 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
11a90 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
11aa0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
11ab0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
11ac0 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
11ad0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
11ae0 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
11af0 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20  one certificate 
11b00 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63  type */.....ck_c
11b10 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20  ertificate_type 
11b20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09  = CKC_X_509;....
11b30 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63  ..pValue = &ck_c
11b40 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
11b50 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
11b60 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74  = sizeof(ck_cert
11b70 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a  ificate_type);..
11b80 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11b90 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
11ba0 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30  turning CKC_X_50
11bb0 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29  9 (%lu) (%p/%lu)
11bc0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
11bd0 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49  g) *((CK_CERTIFI
11be0 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61  CATE_TYPE *) pVa
11bf0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
11c00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
11c10 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
11c20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
11c30 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
11c40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11c50 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
11c60 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b   attribute CKA_K
11c70 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78  EY_TYPE (0x%08lx
11c80 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
11c90 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
11ca0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
11cb0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
11cc0 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
11cd0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
11ce0 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
11cf0 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  Y) {......CACKEY
11d00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
11d10 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
11d20 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
11d30 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e  e are not a key.
11d40 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
11d50 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
11d60 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
11d70 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09  ne key type */..
11d80 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d  ...ck_key_type =
11d90 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70   CKK_RSA;......p
11da0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f  Value = &ck_key_
11db0 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  type;.....ulValu
11dc0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
11dd0 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09  _key_type);.....
11de0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11df0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
11e00 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c  ning CKK_RSA (%l
11e10 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  u) (%p/%lu)", (u
11e20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
11e30 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  (CK_CERTIFICATE_
11e40 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c  TYPE *) pValue),
11e50 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
11e60 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
11e70 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
11e80 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
11e90 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  GN:.....CACKEY_D
11ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
11eb0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
11ec0 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30  e CKA_SIGN (0x%0
11ed0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
11ee0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
11ef0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
11f00 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
11f10 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
11f20 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
11f30 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
11f40 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
11f50 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
11f60 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
11f70 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
11f80 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
11f90 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
11fa0 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
11fb0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
11fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
11fd0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
11fe0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
11ff0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
12000 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
12010 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
12020 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
12030 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
12040 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
12050 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
12060 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12070 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
12080 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
12090 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25  IGN_RECOVER (0x%
120a0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
120b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
120c0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
120d0 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 6c  ../* We currentl
120e0 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 22  y only support "
120f0 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e 64  Sign with Append
12100 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75  ix" */.....pValu
12110 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
12120 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
12130 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
12140 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
12150 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
12160 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
12170 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
12180 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
12190 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
121a0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
121b0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
121c0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
121d0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44  k;....case CKA_D
121e0 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b  ECRYPT:.....CACK
121f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12200 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
12210 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50  ibute CKA_DECRYP
12220 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  T (0x%08lx) ..."
12230 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12240 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
12250 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
12260 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
12270 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62  RIVATE_KEY || ob
12280 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
12290 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
122a0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
122b0 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
122c0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
122d0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
122e0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
122f0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
12300 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
12310 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
12320 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
12330 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12340 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
12350 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
12360 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12370 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
12380 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
12390 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
123a0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
123b0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
123c0 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  se CKA_SENSITIVE
123d0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
123e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
123f0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
12400 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30  CKA_SENSITIVE (0
12410 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
12420 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
12430 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
12440 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
12450 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
12460 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
12470 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
12480 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
12490 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
124a0 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
124b0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
124c0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
124d0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
124e0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
124f0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
12500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
12510 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
12520 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
12530 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
12540 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
12550 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
12560 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
12570 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
12580 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
12590 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  A_EXTRACTABLE:..
125a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
125b0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
125c0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
125d0 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78  _EXTRACTABLE (0x
125e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
125f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
12600 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
12610 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
12620 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
12630 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  E_KEY) {......pV
12640 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
12650 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
12660 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
12670 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
12680 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
12690 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
126a0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
126b0 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
126c0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
126d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
126e0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
126f0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
12700 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
12710 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
12720 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
12730 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
12740 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
12750 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
12760 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43 41  _MODULUS:.....CA
12770 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12780 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
12790 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55  tribute CKA_MODU
127a0 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  LUS (0x%08lx) ..
127b0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
127c0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
127d0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 65  pe);......if (ce
127e0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
127f0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
12800 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
12810 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69  to_modulus(certi
12820 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
12830 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
12840 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
12850 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
12860 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
12870 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
12880 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
12890 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
128a0 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
128b0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
128c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
128d0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
128e0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
128f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
12900 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
12910 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
12920 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
12930 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ENT:.....CACKEY_
12940 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
12950 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
12960 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58  te CKA_PUBLIC_EX
12970 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29  PONENT (0x%08lx)
12980 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
12990 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
129a0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
129b0 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
129c0 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
129d0 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
129e0 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63  09_to_exponent(c
129f0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
12a00 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
12a10 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
12a20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
12a30 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
12a40 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
12a50 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
12a60 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
12a70 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
12a80 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
12a90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12aa0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
12ab0 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
12ac0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
12ad0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
12ae0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
12af0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45  ase CKA_TRUST_SE
12b00 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 09 43  RVER_AUTH:.....C
12b10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12b20 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
12b30 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
12b40 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 20 28  ST_SERVER_AUTH (
12b50 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
12b60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
12b70 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
12b80 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
12b90 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
12ba0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
12bb0 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
12bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12bd0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
12be0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
12bf0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12c00 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
12c10 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
12c20 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12c30 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
12c40 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
12c50 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  se CKA_TRUST_CLI
12c60 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 09 43 41  ENT_AUTH:.....CA
12c70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12c80 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
12c90 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
12ca0 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20 28 30  T_CLIENT_AUTH (0
12cb0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
12cc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
12cd0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
12ce0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
12cf0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
12d00 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
12d10 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
12d20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12d30 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
12d40 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
12d50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12d60 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
12d70 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
12d80 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12d90 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
12da0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
12db0 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45  e CKA_TRUST_CODE
12dc0 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41  _SIGNING:.....CA
12dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12de0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
12df0 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
12e00 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28  T_CODE_SIGNING (
12e10 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
12e20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
12e30 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
12e40 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
12e50 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
12e60 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
12e70 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
12e80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12e90 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
12ea0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
12eb0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12ec0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
12ed0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
12ee0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12ef0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
12f00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
12f10 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41  se CKA_TRUST_EMA
12f20 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09  IL_PROTECTION:..
12f30 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12f40 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
12f50 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
12f60 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f  _TRUST_EMAIL_PRO
12f70 54 45 43 54 49 4f 4e 20 28 30 78 25 30 38 6c 78  TECTION (0x%08lx
12f80 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
12f90 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
12fa0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
12fb0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
12fc0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
12fd0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
12fe0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
12ff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
13000 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
13010 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
13020 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
13030 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
13040 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
13050 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
13060 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
13070 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a  ak;....default:.
13080 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
13090 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  L;.....ulValueLe
130a0 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
130b0 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
130c0 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e  ....if (((CK_LON
130d0 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21  G) ulValueLen) !
130e0 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29  = ((CK_LONG) -1)
130f0 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63  ) {..../* Push c
13100 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68  urr_attr onto th
13110 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75  e stack */....cu
13120 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63  rr_attr.type = c
13130 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
13140 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  ..curr_attr.ulVa
13150 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65  lueLen = ulValue
13160 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74  Len;.....curr_at
13170 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c  tr.pValue = mall
13180 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  oc(curr_attr.ulV
13190 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d  alueLen);....mem
131a0 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56  cpy(curr_attr.pV
131b0 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75  alue, pValue, cu
131c0 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c  rr_attr.ulValueL
131d0 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61  en);.....if (pVa
131e0 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c  lue_free && pVal
131f0 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70  ue) {.....free(p
13200 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09  Value);....}....
13210 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d  .if (numattrs >=
13220 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b   retval_count) {
13230 0a 09 09 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e  .....retval_coun
13240 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72 65 74 76  t *= 2;.....retv
13250 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
13260 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
13270 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
13280 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  al));....}.....m
13290 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75  emcpy(&retval[nu
132a0 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61  mattrs], &curr_a
132b0 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  ttr, sizeof(curr
132c0 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61  _attr));....numa
132d0 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a  ttrs++;...}..}..
132e0 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d  .if (numattrs !=
132f0 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63   0) {...retval_c
13300 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
13310 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
13320 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76  loc(retval, retv
13330 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
13340 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20  f(*retval));..} 
13350 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65  else {...free(re
13360 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
13370 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70   = NULL;..}...*p
13380 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  ulCount = numatt
13390 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  rs;...CACKEY_DEB
133a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
133b0 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73  ning %lu objects
133c0 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72   (%p).", numattr
133d0 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  s, retval);...re
133e0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
133f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
13400 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
13410 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
13420 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
13430 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64  tities, unsigned
13440 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73   long identities
13450 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54  _count) {..CK_AT
13460 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
13470 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  tr;..unsigned lo
13480 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f  ng id_idx, attr_
13490 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  idx;...if (ident
134a0 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  ities == NULL ||
134b0 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
134c0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t == 0) {...retu
134d0 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  rn;..}...for (id
134e0 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78  _idx = 0; id_idx
134f0 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f   < identities_co
13500 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b  unt; id_idx++) {
13510 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
13520 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
13530 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28  utes) {....for (
13540 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
13550 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
13560 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
13570 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74  ibutes_count; at
13580 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
13590 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65  curr_attr = &ide
135a0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
135b0 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f  attributes[attr_
135c0 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63  idx];......if (c
135d0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
135e0 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
135f0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
13600 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
13610 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
13620 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
13630 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69  es) {.....free(i
13640 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
13650 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09  ].attributes);..
13660 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
13670 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69  ree_certs(identi
13680 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
13690 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31  c_identity, 1, 1
136a0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65  );...}..}...free
136b0 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a  (identities);.}.
136c0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
136d0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
136e0 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
136f0 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61  tities(struct ca
13700 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
13710 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
13720 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74  ids_found) {..st
13730 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
13740 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
13750 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72  identities;..str
13760 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
13770 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
13780 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
13790 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c  num_ids, id_idx,
137a0 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09   curr_id_type;..
137b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
137c0 6d 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64  m_certs, cert_id
137d0 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
137e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
137f0 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66  .");...if (ids_f
13800 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ound == NULL) {.
13810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13820 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69  RINTF("Error.  i
13830 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c  ds_found is NULL
13840 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
13850 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69  LL);..}...pcsc_i
13860 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
13870 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c  ey_read_certs(sl
13880 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  ot, NULL, &num_c
13890 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63  erts);..if (pcsc
138a0 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  _identities != N
138b0 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76  ULL) {.../* Conv
138c0 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65  ert number of Ce
138d0 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66  rts to number of
138e0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75   objects */...nu
138f0 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49  m_ids = (CKO_PRI
13900 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43  VATE_KEY - CKO_C
13910 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20  ERTIFICATE + 1) 
13920 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09  * num_certs;....
13930 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c  identities = mal
13940 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69  loc(num_ids * si
13950 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
13960 29 29 3b 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20  ));....id_idx = 
13970 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69  0;...for (cert_i
13980 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
13990 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65   < num_certs; ce
139a0 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66  rt_idx++) {....f
139b0 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65  or (curr_id_type
139c0 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   = CKO_CERTIFICA
139d0 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  TE; curr_id_type
139e0 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   <= CKO_PRIVATE_
139f0 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  KEY; curr_id_typ
13a00 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74  e++) {.....ident
13a10 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
13a20 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
13a30 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
13a40 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26  (curr_id_type, &
13a50 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
13a60 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f  cert_idx], cert_
13a70 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
13a80 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
13a90 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  tes_count);.....
13aa0 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
13ab0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
13ac0 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es == NULL) {...
13ad0 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
13ae0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
13af0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09  _count = 0;.....
13b00 7d 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  }......identitie
13b10 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
13b20 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  dentity = malloc
13b30 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74  (sizeof(*identit
13b40 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
13b50 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  _identity));....
13b60 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
13b70 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
13b80 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f  identity, &pcsc_
13b90 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
13ba0 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64  idx], sizeof(*id
13bb0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
13bc0 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
13bd0 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
13be0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
13bf0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
13c00 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  cate = malloc(pc
13c10 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
13c20 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
13c30 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
13c40 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
13c50 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
13c60 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
13c70 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
13c80 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
13c90 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f  rtificate, pcsc_
13ca0 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
13cb0 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
13cc0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69  _len);......id_i
13cd0 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  dx++;....}...}..
13ce0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
13cf0 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
13d00 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
13d10 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e  1);....*ids_foun
13d20 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72  d = num_ids;...r
13d30 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73  eturn(identities
13d40 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75  );..}...*ids_fou
13d50 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28  nd = 0;..return(
13d60 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  NULL);.}..CK_DEF
13d70 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
13d80 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65  RV, C_Initialize
13d90 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49  )(CK_VOID_PTR pI
13da0 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43  nitArgs) {..CK_C
13db0 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
13dc0 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75   CK_PTR args;..u
13dd0 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e  int32_t idx;..in
13de0 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74  t mutex_init_ret
13df0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
13e00 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
13e10 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 69 74 41  ");...if (pInitA
13e20 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rgs != NULL) {..
13e30 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67  .args = pInitArg
13e40 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63  s;...memcpy(&cac
13e50 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20  key_args, args, 
13e60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72  sizeof(cackey_ar
13e70 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67  gs));....if (arg
13e80 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d  s->CreateMutex =
13e90 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
13ea0 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20  DestroyMutex == 
13eb0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f  NULL || args->Lo
13ec0 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  ckMutex == NULL 
13ed0 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d  || args->UnlockM
13ee0 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  utex == NULL) {.
13ef0 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
13f00 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ateMutex != NULL
13f10 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
13f20 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  yMutex != NULL |
13f30 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
13f40 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
13f50 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21  s->UnlockMutex !
13f60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
13f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13f80 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20  F("Error. Some, 
13f90 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65  but not All thre
13fa0 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  ading primitives
13fb0 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09   provided.");...
13fc0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
13fd0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
13fe0 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 61 72  .}...}....if (ar
13ff0 67 73 2d 3e 70 52 65 73 65 72 76 65 64 20 21 3d  gs->pReserved !=
14000 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b   NULL) {....CACK
14010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14020 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
14030 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
14040 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
14050 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
14060 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
14070 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  .cackey_args.Cre
14080 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ateMutex = NULL;
14090 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44  ...cackey_args.D
140a0 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55  estroyMutex = NU
140b0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
140c0 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  s.LockMutex = NU
140d0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
140e0 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20  s.UnlockMutex = 
140f0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
14100 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09  rgs.flags = 0;..
14110 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69  }...if (cackey_i
14120 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
14130 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14140 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72  NTF("Error.  Alr
14150 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
14160 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14170 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45  KR_CRYPTOKI_ALRE
14180 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  ADY_INITIALIZED)
14190 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
141a0 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
141b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
141c0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
141d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
141e0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
141f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
14200 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  x].active = 0;..
14210 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
14220 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
14230 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
14240 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
14250 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
14260 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
14270 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
14280 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
14290 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
142a0 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  er = NULL;...cac
142b0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
142c0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
142d0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
142e0 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72  lots[idx].slot_r
142f0 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  eset = 0;...cack
14300 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f  ey_slots[idx].to
14310 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
14320 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
14330 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  x].label = NULL;
14340 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ..}...cackey_ini
14350 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09  tialized = 1;...
14360 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c  if (!cackey_bigl
14370 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75  ock_init) {...mu
14380 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63  tex_init_ret = c
14390 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
143a0 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f  te(&cackey_biglo
143b0 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
143c0 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29  x_init_ret != 0)
143d0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
143e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
143f0 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c  .  Mutex initial
14400 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22  ization failed."
14410 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
14420 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09  R_CANT_LOCK);...
14430 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c  }....cackey_bigl
14440 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d  ock_init = 1;..}
14450 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14460 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
14470 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
14480 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
14490 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
144a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
144b0 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69  (CK_RV, C_Finali
144c0 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ze)(CK_VOID_PTR 
144d0 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69  pReserved) {..ui
144e0 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
144f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14500 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
14510 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
14520 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
14530 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14540 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
14550 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
14560 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
14570 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
14580 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
14590 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
145a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
145b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
145c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
145d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
145e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
145f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
14600 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
14610 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
14620 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
14630 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
14640 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
14650 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
14660 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
14670 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43  active) {....C_C
14680 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
14690 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...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 66 6f 72 20  ct_all();...for 
146c0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
146d0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
146e0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
146f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
14700 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
14710 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
14720 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20  x].pcsc_reader) 
14730 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
14740 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
14750 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a 09 7d  _reader);...}..}
14760 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  ...cackey_pcsc_d
14770 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63  isconnect();...c
14780 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
14790 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  d = 0;...CACKEY_
147a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
147b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
147c0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
147d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
147e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
147f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
14800 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f  GetInfo)(CK_INFO
14810 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
14820 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
14830 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  R manufacturerID
14840 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72  [] = "U.S. Gover
14850 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20  nment";..static 
14860 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69 62 72  CK_UTF8CHAR libr
14870 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d  aryDescription[]
14880 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43   = "CACKey";...C
14890 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
148a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
148b0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
148c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
148d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
148e0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
148f0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
14900 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
14910 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
14920 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
14930 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14940 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
14950 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
14960 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
14970 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
14980 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
14990 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70  .}...pInfo->cryp
149a0 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  tokiVersion.majo
149b0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
149c0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
149d0 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  DE) >> 16) & 0xf
149e0 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74  f;..pInfo->crypt
149f0 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  okiVersion.minor
14a00 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
14a10 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
14a20 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  E) >> 8) & 0xff;
14a30 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
14a40 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
14a50 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
14a60 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
14a70 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  ID));..memcpy(pI
14a80 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
14a90 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65  rID, manufacture
14aa0 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75  rID, sizeof(manu
14ab0 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29  facturerID) - 1)
14ac0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ;...pInfo->flags
14ad0 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65   = 0x00;...memse
14ae0 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  t(pInfo->library
14af0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27  Description, ' '
14b00 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
14b10 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
14b20 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  on));..memcpy(pI
14b30 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
14b40 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79  ription, library
14b50 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
14b60 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73 63 72  eof(libraryDescr
14b70 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09  iption) - 1);...
14b80 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
14b90 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63  rsion.major = (c
14ba0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
14bb0 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  () >> 16) & 0xff
14bc0 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ;..pInfo->librar
14bd0 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  yVersion.minor =
14be0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
14bf0 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
14c00 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ff;...CACKEY_DEB
14c10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
14c20 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
14c30 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
14c40 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
14c50 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c  ./*. * Process l
14c60 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 2c 20  ist of readers, 
14c70 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70 70 69  and create mappi
14c80 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61 64 65  ng between reade
14c90 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20  r name and slot 
14ca0 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  ID. */.CK_DEFINE
14cb0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
14cc0 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 28   C_GetSlotList)(
14cd0 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72  CK_BBOOL tokenPr
14ce0 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49  esent, CK_SLOT_I
14cf0 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c  D_PTR pSlotList,
14d00 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
14d10 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74 20 6d  lCount) {..int m
14d20 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
14d30 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
14d40 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f  et;..CK_ULONG co
14d50 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20  unt, slot_count 
14d60 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 3b 0a 09  = 0, currslot;..
14d70 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
14d80 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72  rs, *pcsc_reader
14d90 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65  s_s, *pcsc_reade
14da0 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63 73  rs_e;..DWORD pcs
14db0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09  c_readers_len;..
14dc0 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72  LONG scard_listr
14dd0 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a  eaders_ret;..siz
14de0 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f  e_t curr_reader_
14df0 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  len;...CACKEY_DE
14e00 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
14e10 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c  ed.");...if (pul
14e20 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
14e30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14e40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
14e50 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ulCount is NULL.
14e60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
14e70 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
14e80 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
14e90 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
14ea0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
14eb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
14ec0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
14ed0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14ee0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
14ef0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
14f00 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
14f10 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
14f20 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
14f30 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
14f40 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
14f50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
14f70 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
14f80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
14f90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
14fa0 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73  }.../* Clear lis
14fb0 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 69  t of slots */..i
14fc0 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a  f (pSlotList) {.
14fd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14fe0 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61  RINTF("Purging a
14ff0 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74  ll slot informat
15000 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20 4f 6e  ion.");..../* On
15010 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
15020 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
15030 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
15040 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20  eing supply the 
15050 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
15060 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   */...cackey_slo
15070 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
15080 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72  l();....for (cur
15090 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
150a0 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
150b0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
150c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
150d0 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
150e0 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ++) {....if (cac
150f0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
15100 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
15110 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b   {.....free(cack
15120 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
15130 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t].pcsc_reader);
15140 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
15150 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
15160 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b  c_reader = NULL;
15170 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61  ....}.....if (ca
15180 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
15190 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09  lot].label) {...
151a0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
151b0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
151c0 62 65 6c 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  bel);......cacke
151d0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
151e0 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
151f0 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
15200 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
15210 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a  active = 0;...}.
15220 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
15230 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
15240 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
15250 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
15260 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
15270 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
15280 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
15290 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
152a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
152b0 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  TF("Connection t
152c0 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20  o PC/SC failed, 
152d0 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74  assuming no slot
152e0 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75  s");....slot_cou
152f0 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  nt = 0;..} else 
15300 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  {...pcsc_readers
15310 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61  _len = 0;....sca
15320 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
15330 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
15340 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
15350 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
15360 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61   NULL, &pcsc_rea
15370 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  ders_len);....if
15380 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
15390 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
153a0 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b  _F_COMM_ERROR) {
153b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
153c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
153d0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
153e0 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
153f0 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20  D_F_COMM_ERROR, 
15400 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74  assuming Connect
15410 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e  ion to PC/SC wen
15420 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63  t away. Reconnec
15430 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63  ting.");.....cac
15440 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
15450 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79  ect();....cackey
15460 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
15470 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15480 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67  G_PRINTF("Trying
15490 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
154a0 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09  s() again");....
154b0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
154c0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
154d0 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
154e0 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
154f0 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
15500 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
15510 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  }....if (scard_l
15520 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
15530 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
15540 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72  S && pcsc_reader
15550 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  s_len != 0) {...
15560 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20  .pcsc_readers = 
15570 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64  malloc(pcsc_read
15580 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73  ers_len);....pcs
15590 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63  c_readers_s = pc
155a0 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09  sc_readers;.....
155b0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
155c0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
155d0 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
155e0 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
155f0 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  LL, pcsc_readers
15600 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
15610 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61  len);....if (sca
15620 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
15630 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
15640 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73  CCESS) {.....pcs
15650 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63  c_readers_e = pc
15660 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73  sc_readers + pcs
15670 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a  c_readers_len;..
15680 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74  ..../* Start wit
15690 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20  h Slot ID 1, to 
156a0 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47  avoid a bug in G
156b0 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09  DM on RHEL */...
156c0 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
156d0 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
156e0 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
156f0 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
15700 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73  911 */.....currs
15710 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 77 68 69  lot = 1;.....whi
15720 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73  le (pcsc_readers
15730 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   < pcsc_readers_
15740 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72  e) {......curr_r
15750 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c  eader_len = strl
15760 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  en(pcsc_readers)
15770 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73  ;.......if ((pcs
15780 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72  c_readers + curr
15790 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70  _reader_len) > p
157a0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
157b0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
157c0 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
157d0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
157e0 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  = 0) {.......bre
157f0 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
15800 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d  .if (currslot >=
15810 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
15820 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
15830 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
15840 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  )) {.......CACKE
15850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15860 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65  Found more reade
15870 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72  rs than slots ar
15880 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a  e available!");.
15890 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
158a0 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45  ...}.......CACKE
158b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
158c0 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73  Found reader: %s
158d0 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29  ", pcsc_readers)
158e0 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20  ;......./* Only 
158f0 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
15900 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
15910 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
15920 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79 20 74  g asked supply t
15930 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74  he slot informat
15940 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28  ion */......if (
15950 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09  pSlotList) {....
15960 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
15970 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
15980 20 3d 20 31 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 1;.......cack
15990 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
159a0 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
159b0 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61   strdup(pcsc_rea
159c0 64 65 72 73 29 3b 0a 09 09 09 09 09 09 63 61 63  ders);.......cac
159d0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
159e0 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot].pcsc_card_co
159f0 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09  nnected = 0;....
15a00 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
15a10 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61  currslot].transa
15a20 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
15a30 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
15a40 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c  ots[currslot].sl
15a50 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09  ot_reset = 1;...
15a60 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
15a70 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
15a80 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
15a90 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09  IN_REQUIRED;....
15aa0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
15ab0 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20  currslot].label 
15ac0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09  = NULL;......}..
15ad0 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a  ....currslot++;.
15ae0 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  ......pcsc_reade
15af0 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65  rs += curr_reade
15b00 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d  r_len + 1;.....}
15b10 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77  ....../* Start w
15b20 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74  ith Slot ID 1, t
15b30 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e  o avoid a bug in
15b40 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a   GDM on RHEL */.
15b50 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31  ..../* Bug 59491
15b60 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  1: https://bugzi
15b70 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73  lla.redhat.com/s
15b80 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35  how_bug.cgi?id=5
15b90 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 69 66 20  94911 */.....if 
15ba0 28 63 75 72 72 73 6c 6f 74 20 3e 20 31 29 20 7b  (currslot > 1) {
15bb0 0a 09 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77  ....../* Start w
15bc0 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74  ith Slot ID 1, t
15bd0 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e  o avoid a bug in
15be0 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a   GDM on RHEL */.
15bf0 09 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39  ...../* Bug 5949
15c00 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a  11: https://bugz
15c10 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f  illa.redhat.com/
15c20 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
15c30 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 09 73  594911 */......s
15c40 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72  lot_count = curr
15c50 73 6c 6f 74 20 2d 20 31 3b 0a 09 09 09 09 7d 0a  slot - 1;.....}.
15c60 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
15c70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15c80 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c  NTF("Second call
15c90 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
15ca0 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
15cb0 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
15cc0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
15cd0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
15ce0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
15cf0 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
15d00 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
15d10 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66  ret);....}.....f
15d20 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72 73  ree(pcsc_readers
15d30 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  _s);...} else {.
15d40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15d50 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63 61  PRINTF("First ca
15d60 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52  ll to SCardListR
15d70 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72  eaders failed, r
15d80 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43  eturn %s/%li", C
15d90 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
15da0 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
15db0 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
15dc0 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  rs_ret), (long) 
15dd0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
15de0 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  s_ret);...}..}..
15df0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
15e00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
15e10 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
15e20 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
15e30 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
15e40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15e50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
15e60 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
15e70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15e80 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
15e90 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c  ..}...if (pSlotL
15ea0 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
15eb0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
15ec0 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b  t_count;....CACK
15ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15ee0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
15ef0 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
15f00 6c 75 20 72 65 61 64 65 72 73 2c 20 62 75 74 20  lu readers, but 
15f10 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20  not storing IDs 
15f20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55  (pSlotList == NU
15f30 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75  LL)", CKR_OK, (u
15f40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c  nsigned long) sl
15f50 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  ot_count);....re
15f60 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
15f70 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43  ...count = *pulC
15f80 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74  ount;..if (count
15f90 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b   < slot_count) {
15fa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15fb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55  PRINTF("Error. U
15fc0 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c  ser allocated %l
15fd0 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77  u entries, but w
15fe0 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69  e have %lu entri
15ff0 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f  es.", count, slo
16000 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  t_count);....ret
16010 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54  urn(CKR_BUFFER_T
16020 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a  OO_SMALL);...}..
16030 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d  .for (currslot =
16040 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 73   0; currslot < s
16050 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72 72 73  lot_count; currs
16060 6c 6f 74 2b 2b 29 20 7b 0a 09 09 2f 2a 20 53 74  lot++) {.../* St
16070 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44  art with Slot ID
16080 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62   1, to avoid a b
16090 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45  ug in GDM on RHE
160a0 4c 20 2a 2f 0a 09 09 2f 2a 20 42 75 67 20 35 39  L */.../* Bug 59
160b0 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75  4911: https://bu
160c0 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f  gzilla.redhat.co
160d0 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  m/show_bug.cgi?i
160e0 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 70 53  d=594911 */...pS
160f0 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74  lotList[currslot
16100 5d 20 3d 20 63 75 72 72 73 6c 6f 74 20 2b 20 31  ] = currslot + 1
16110 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
16120 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a   = slot_count;..
16130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16140 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16150 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f  CKR_OK (%i).  Fo
16160 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e  und %lu readers.
16170 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
16180 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
16190 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  count);...return
161a0 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65  (CKR_OK);...toke
161b0 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e  nPresent = token
161c0 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72  Present; /* Supr
161d0 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
161e0 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
161f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
16200 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
16210 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c  tSlotInfo)(CK_SL
16220 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
16230 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70  _SLOT_INFO_PTR p
16240 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
16250 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74  CK_UTF8CHAR slot
16260 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
16270 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09  "CACKey Slot";..
16280 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
16290 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f  ;..int bytes_to_
162a0 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  copy;...CACKEY_D
162b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
162c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
162d0 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
162e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
162f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
16300 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
16310 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
16320 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
16330 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
16340 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
16350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16360 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
16370 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
16380 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
16390 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
163a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
163b0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
163c0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
163d0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
163e0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
163f0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
16400 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16410 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
16420 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
16430 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
16440 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
16450 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
16460 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
16470 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
16480 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
16490 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
164a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
164b0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
164c0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
164d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
164e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
164f0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
16500 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
16510 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
16520 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
16530 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
16540 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
16550 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16560 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
16570 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
16580 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
16590 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
165a0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
165b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
165c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
165d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
165e0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
165f0 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66  );..}...pInfo->f
16600 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45 4d 4f 56  lags = CKF_REMOV
16610 41 42 4c 45 5f 44 45 56 49 43 45 20 7c 20 43 4b  ABLE_DEVICE | CK
16620 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20  F_HW_SLOT;...if 
16630 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
16640 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
16650 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20  ots[slotID]) == 
16660 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
16670 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
16680 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20  pInfo->flags |= 
16690 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e  CKF_TOKEN_PRESEN
166a0 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74 6f  T;..}...bytes_to
166b0 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 63  _copy = strlen(c
166c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
166d0 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ID].pcsc_reader)
166e0 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70 49  ;..if (sizeof(pI
166f0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
16700 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f  rID) < bytes_to_
16710 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73 5f  copy) {...bytes_
16720 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66  to_copy = sizeof
16730 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
16740 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d  urerID);..}..mem
16750 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
16760 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b 65  acturerID, cacke
16770 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
16780 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79 74  pcsc_reader, byt
16790 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d  es_to_copy);...m
167a0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
167b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
167c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
167d0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
167e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
167f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16800 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
16810 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
16820 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
16830 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
16840 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  }...memset(pInfo
16850 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
16860 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
16870 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
16880 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79  ption));..memcpy
16890 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
168a0 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73  ription, slotDes
168b0 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66  cription, sizeof
168c0 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e  (slotDescription
168d0 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
168e0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
168f0 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
16900 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
16910 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09 70  acturerID));...p
16920 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
16930 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63  rsion.major = (c
16940 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
16950 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  () >> 16) & 0xff
16960 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ;..pInfo->hardwa
16970 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
16980 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
16990 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30  sion() >> 8) & 0
169a0 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69  xff;...pInfo->fi
169b0 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rmwareVersion.ma
169c0 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e  jor = 0x00;..pIn
169d0 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
169e0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30  ion.minor = 0x00
169f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
16a00 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
16a10 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
16a20 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
16a30 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
16a40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
16a50 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f  N(CK_RV, C_GetTo
16a60 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54  kenInfo)(CK_SLOT
16a70 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54  _ID slotID, CK_T
16a80 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49  OKEN_INFO_PTR pI
16a90 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43  nfo) {..static C
16aa0 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66  K_UTF8CHAR manuf
16ab0 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55  acturerID[] = "U
16ac0 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b  .S. Government";
16ad0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
16ae0 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62 65  CHAR defaultLabe
16af0 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54  l[] = "Unknown T
16b00 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20 43  oken";..static C
16b10 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65 6c  K_UTF8CHAR model
16b20 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22  [] = "CAC Token"
16b30 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
16b40 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
16b50 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b  pcsc_identities;
16b60 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
16b70 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a  num_certs;..ssiz
16b80 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09  e_t label_ret;..
16b90 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
16ba0 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61 75  ;..int use_defau
16bb0 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b  lt_label;...CACK
16bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16bd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
16be0 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
16bf0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16c00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16c10 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
16c20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
16c30 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
16c40 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
16c50 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
16c60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16c70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16c80 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
16c90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
16ca0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
16cb0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
16cc0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
16cd0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
16ce0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
16cf0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
16d00 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
16d10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16d20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16d30 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
16d40 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
16d50 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
16d60 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
16d70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
16d80 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
16d90 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
16da0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
16db0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
16dc0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
16dd0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
16de0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16df0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16e00 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
16e10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
16e20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
16e30 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
16e40 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
16e50 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
16e60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16e70 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
16e80 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
16e90 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
16ea0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
16eb0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
16ec0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
16ed0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
16ee0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
16ef0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
16f00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
16f10 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
16f20 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
16f30 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43  ts[slotID]) != C
16f40 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
16f50 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43  ENPRESENT) {...C
16f60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16f70 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20  TF("No token is 
16f80 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49  present in slotI
16f90 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44  D = %lu", slotID
16fa0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
16fb0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
16fc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
16fd0 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e  turn(CKR_TOKEN_N
16fe0 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a  OT_PRESENT);..}.
16ff0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
17000 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
17010 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
17020 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
17030 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
17040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17050 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
17060 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
17070 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17080 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
17090 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
170a0 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20  ine token label 
170b0 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74 65  from certificate
170c0 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e  s */..memset(pIn
170d0 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20  fo->label, ' ', 
170e0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
170f0 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 61  bel));..use_defa
17100 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a  ult_label = 1;..
17110 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
17120 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
17130 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73  == NULL) {...pcs
17140 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  c_identities = c
17150 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
17160 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
17170 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e  lotID], NULL, &n
17180 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66 20  um_certs);...if 
17190 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
171a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
171b0 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30  f (num_certs > 0
171c0 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65  ) {.....label_re
171d0 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
171e0 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65  identity_to_labe
171f0 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  l(pcsc_identitie
17200 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  s, pInfo->label,
17210 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
17220 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20 28  abel));.....if (
17230 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b  label_ret > 0) {
17240 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75 6c  ......use_defaul
17250 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09  t_label = 0;....
17260 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
17270 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20  slotID].label = 
17280 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49  malloc(sizeof(pI
17290 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09  nfo->label));...
172a0 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
172b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
172c0 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61  label, pInfo->la
172d0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
172e0 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09  o->label));.....
172f0 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  }....}.....cacke
17300 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
17310 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
17320 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d  m_certs, 1);...}
17330 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
17340 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  cpy(pInfo->label
17350 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  , cackey_slots[s
17360 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69  lotID].label, si
17370 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
17380 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61  l));....use_defa
17390 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09  ult_label = 0;..
173a0 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66 61  }...if (use_defa
173b0 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 6d  ult_label) {...m
173c0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62  emcpy(pInfo->lab
173d0 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65 6c  el, defaultLabel
173e0 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c 74  , sizeof(default
173f0 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a  Label) - 1);..}.
17400 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
17410 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
17420 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
17430 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
17440 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  D));..memcpy(pIn
17450 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
17460 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72  ID, manufacturer
17470 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66  ID, sizeof(manuf
17480 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b  acturerID) - 1);
17490 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
174a0 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a  >model, ' ', siz
174b0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  eof(pInfo->model
174c0 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ));..memcpy(pInf
174d0 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c  o->model, model,
174e0 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d   sizeof(model) -
174f0 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
17500 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65  nfo->serialNumbe
17510 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  r, ' ', sizeof(p
17520 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62  Info->serialNumb
17530 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  er));...memset(p
17540 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27  Info->utcTime, '
17550 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
17560 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70  ->utcTime));...p
17570 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
17580 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63  rsion.major = (c
17590 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
175a0 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  () >> 16) & 0xff
175b0 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ;..pInfo->hardwa
175c0 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
175d0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
175e0 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30  sion() >> 8) & 0
175f0 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69  xff;...pInfo->fi
17600 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rmwareVersion.ma
17610 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e  jor = 0x00;..pIn
17620 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
17630 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30  ion.minor = 0x00
17640 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ;...pInfo->flags
17650 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f   = CKF_WRITE_PRO
17660 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53 45  TECTED | CKF_USE
17670 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45  R_PIN_INITIALIZE
17680 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e  D | CKF_TOKEN_IN
17690 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63 6b  ITIALIZED | cack
176a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
176b0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09  .token_flags;...
176c0 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73  pInfo->ulMaxSess
176d0 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65  ionCount = (size
176e0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
176f0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
17700 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
17710 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ) - 1;..pInfo->u
17720 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  lSessionCount = 
17730 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
17740 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
17750 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69  fo->ulMaxRwSessi
17760 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49  onCount = 0;..pI
17770 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e  nfo->ulRwSession
17780 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41  Count = CK_UNAVA
17790 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
177a0 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ON;..pInfo->ulMa
177b0 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09  xPinLen = 128;..
177c0 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c  pInfo->ulMinPinL
177d0 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e  en = 0;..pInfo->
177e0 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d  ulTotalPublicMem
177f0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
17800 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
17810 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
17820 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43  PublicMemory = C
17830 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
17840 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
17850 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74  o->ulTotalPrivat
17860 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  eMemory = CK_UNA
17870 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
17880 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
17890 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72  FreePrivateMemor
178a0 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
178b0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
178c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
178d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
178e0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
178f0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
17900 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
17910 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
17920 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72  CK_RV, C_WaitFor
17930 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c  SlotEvent)(CK_FL
17940 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c  AGS flags, CK_SL
17950 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49  OT_ID_PTR pSlotI
17960 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  D, CK_VOID_PTR p
17970 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43  Reserved) {..CAC
17980 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17990 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
179a0 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
179b0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
179c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
179d0 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
179e0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
179f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
17a00 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
17a10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
17a20 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
17a30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17a40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
17a50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
17a60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
17a70 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
17a80 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
17a90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17aa0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
17ab0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
17ac0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
17ad0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
17ae0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
17af0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
17b00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
17b10 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
17b20 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
17b30 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
17b40 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  st)(CK_SLOT_ID s
17b50 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
17b60 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65  ISM_TYPE_PTR pMe
17b70 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f  chanismList, CK_
17b80 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
17b90 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  nt) {..CACKEY_DE
17ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
17bb0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
17bc0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
17bd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17be0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17bf0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
17c00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17c10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
17c20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
17c30 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e  .}...if (pulCoun
17c40 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
17c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17c60 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43  TF("Error.  pulC
17c70 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ount is NULL.");
17c80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
17c90 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
17ca0 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
17cb0 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  smList == NULL) 
17cc0 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
17cd0 33 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  3;....CACKEY_DEB
17ce0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
17cf0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
17d00 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
17d10 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
17d20 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e  }...if (*pulCoun
17d30 74 20 3c 20 33 29 20 7b 0a 09 09 43 41 43 4b 45  t < 3) {...CACKE
17d40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17d50 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74  Error.  Buffer t
17d60 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09  oo small.");....
17d70 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
17d80 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d  R_TOO_SMALL);..}
17d90 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  ...pMechanismLis
17da0 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50  t[0] = CKM_RSA_P
17db0 4b 43 53 3b 0a 09 70 4d 65 63 68 61 6e 69 73 6d  KCS;..pMechanism
17dc0 4c 69 73 74 5b 31 5d 20 3d 20 43 4b 4d 5f 53 48  List[1] = CKM_SH
17dd0 41 31 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70  A1_RSA_PKCS;..*p
17de0 75 6c 43 6f 75 6e 74 20 3d 20 32 3b 0a 0a 09 43  ulCount = 2;...C
17df0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17e00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
17e10 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
17e20 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
17e30 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
17e40 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
17e50 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  RV, C_GetMechani
17e60 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  smInfo)(CK_SLOT_
17e70 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45  ID slotID, CK_ME
17e80 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70  CHANISM_TYPE typ
17e90 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  e, CK_MECHANISM_
17ea0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
17eb0 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
17ec0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
17ed0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
17ee0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
17ef0 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
17f00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17f10 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
17f20 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
17f30 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
17f40 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
17f50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
17f60 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
17f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17f80 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
17f90 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
17fa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
17fb0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
17fc0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
17fd0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
17fe0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
17ff0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
18000 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
18010 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
18020 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18030 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
18040 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
18050 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
18060 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
18070 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
18080 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
18090 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
180a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
180b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
180c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
180d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
180e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
180f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18100 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
18110 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
18120 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
18130 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
18140 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
18150 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
18160 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
18170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18180 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
18190 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
181a0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
181b0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
181c0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
181d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
181e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
181f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18200 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
18210 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
18220 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
18230 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18240 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18250 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18260 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18270 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18280 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
18290 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
182a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
182b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58  RROR);..}.../* X
182c0 58 58 3a 20 54 68 69 73 20 69 73 20 75 6e 74 65  XX: This is unte
182d0 73 74 65 64 2c 20 61 6e 64 20 66 75 72 74 68 65  sted, and furthe
182e0 72 20 49 27 6d 20 6e 6f 74 20 72 65 61 6c 6c 79  r I'm not really
182f0 20 73 75 72 65 20 69 66 20 74 68 69 73 20 69 73   sure if this is
18300 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 09 73 77   correct. */..sw
18310 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09  itch (type) {...
18320 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
18330 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  S:....pInfo->ulM
18340 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b  inKeySize = 512;
18350 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ....pInfo->ulMax
18360 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a  KeySize = 8192;.
18370 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
18380 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45  = CKF_HW | CKF_E
18390 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43  NCRYPT | CKF_DEC
183a0 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20  RYPT | CKF_SIGN 
183b0 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09  | CKF_VERIFY;...
183c0 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
183d0 4b 4d 5f 52 53 41 5f 58 5f 35 30 39 3a 0a 09 09  KM_RSA_X_509:...
183e0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79  .pInfo->ulMinKey
183f0 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70  Size = 512;....p
18400 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69  Info->ulMaxKeySi
18410 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49  ze = 8192;....pI
18420 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
18430 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50  _HW | CKF_ENCRYP
18440 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20  T | CKF_DECRYPT 
18450 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46  | CKF_SIGN | CKF
18460 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61  _VERIFY;....brea
18470 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48  k;...case CKM_SH
18480 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  A1_RSA_PKCS:....
18490 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53  pInfo->ulMinKeyS
184a0 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49  ize = 512;....pI
184b0 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a  nfo->ulMaxKeySiz
184c0 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e  e = 8192;....pIn
184d0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
184e0 48 57 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20  HW | CKF_SIGN | 
184f0 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62  CKF_VERIFY;....b
18500 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  reak;..}...CACKE
18510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18520 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
18530 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
18540 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
18550 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
18560 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
18570 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
18580 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
18590 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29  RV, C_InitToken)
185a0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
185b0 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  ID, CK_UTF8CHAR_
185c0 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
185d0 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f  NG ulPinLen, CK_
185e0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61  UTF8CHAR_PTR pLa
185f0 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  bel) {..CACKEY_D
18600 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
18610 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
18620 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
18630 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
18640 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18650 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
18660 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
18670 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
18680 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
18690 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
186a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
186b0 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
186c0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
186d0 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
186e0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
186f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
18700 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
18710 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20  CTED);.}../* We 
18720 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68  don't support th
18730 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b  is method. */.CK
18740 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
18750 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49  (CK_RV, C_InitPI
18760 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  N)(CK_SESSION_HA
18770 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
18780 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
18790 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
187a0 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  PinLen) {..CACKE
187b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
187c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
187d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
187e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
187f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18800 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
18810 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
18820 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
18830 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
18840 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
18850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18860 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45  turning CKR_TOKE
18870 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
18880 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b  D (%i)", CKR_TOK
18890 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
188a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
188b0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
188c0 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  OTECTED);.}../* 
188d0 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
188e0 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
188f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
18900 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
18910 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  PIN)(CK_SESSION_
18920 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
18930 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
18940 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f   pOldPin, CK_ULO
18950 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20  NG ulOldPinLen, 
18960 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
18970 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  pNewPin, CK_ULON
18980 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b  G ulNewPinLen) {
18990 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
189a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
189b0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
189c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
189d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
189e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
189f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
18a00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18a10 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
18a20 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
18a30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18a40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
18a50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
18a60 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
18a70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
18a80 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
18a90 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
18aa0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
18ab0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
18ac0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
18ad0 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28   C_OpenSession)(
18ae0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
18af0 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  D, CK_FLAGS flag
18b00 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  s, CK_VOID_PTR p
18b10 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f  Application, CK_
18b20 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43  NOTIFY notify, C
18b30 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
18b40 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20  _PTR phSession) 
18b50 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
18b60 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
18b70 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f  _retval;..int fo
18b80 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b  und_session = 0;
18b90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18ba0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
18bb0 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20  );...if ((flags 
18bc0 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  & CKF_SERIAL_SES
18bd0 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52  SION) != CKF_SER
18be0 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09  IAL_SESSION) {..
18bf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
18c00 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54  ION_PARALLEL_NOT
18c10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a  _SUPPORTED);..}.
18c20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
18c30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
18c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18c50 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
18c60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
18c70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
18c80 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
18c90 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
18ca0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
18cb0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
18cc0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
18cd0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
18ce0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
18cf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18d00 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
18d10 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
18d20 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
18d30 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
18d40 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
18d50 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
18d60 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
18d70 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
18d80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
18d90 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18da0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
18db0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
18dc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18dd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
18de0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
18df0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
18e00 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
18e10 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
18e20 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
18e30 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
18e40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18e50 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
18e60 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
18e70 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
18e80 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
18e90 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
18ea0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
18eb0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18ec0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18ed0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
18ee0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
18ef0 79 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20  y that the card 
18f00 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74  is actually in t
18f10 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20  he slot. */../* 
18f20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61  XXX: Check to ma
18f30 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
18f40 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73  in the PKCS#11 s
18f50 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a  pecification */.
18f60 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
18f70 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
18f80 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
18f90 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
18fa0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
18fb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18fc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18fd0 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e   Card not presen
18fe0 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b  t.  Returning CK
18ff0 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
19000 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
19010 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
19020 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
19030 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45  eturn(CKR_DEVICE
19040 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09  _REMOVED);..}...
19050 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64  for (idx = 1; id
19060 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
19070 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
19080 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
19090 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
190a0 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b  +) {...if (!cack
190b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
190c0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f  .active) {....fo
190d0 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b  und_session = 1;
190e0 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20  .....*phSession 
190f0 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65  = idx;.....cacke
19100 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
19110 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63  active = 1;....c
19120 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
19130 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f  dx].slotID = slo
19140 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  tID;....cackey_s
19150 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61  essions[idx].sta
19160 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c  te = CKS_RO_PUBL
19170 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63  IC_SESSION;....c
19180 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
19190 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67  dx].flags = flag
191a0 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  s;....cackey_ses
191b0 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76  sions[idx].ulDev
191c0 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09  iceError = 0;...
191d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
191e0 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69  [idx].pApplicati
191f0 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f  on = pApplicatio
19200 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  n;....cackey_ses
19210 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66  sions[idx].Notif
19220 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09  y = notify;.....
19230 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19240 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
19250 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
19260 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
19270 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
19280 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
19290 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
192a0 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30  earch_active = 0
192b0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
192c0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f  sions[idx].sign_
192d0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
192e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
192f0 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  idx].decrypt_act
19300 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
19310 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
19320 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
19330 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
19340 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
19350 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
19360 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
19370 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
19380 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b  unt);......break
19390 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
193a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
193b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
193c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
193d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
193e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
193f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19400 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
19410 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
19420 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
19430 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
19440 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69  if (!found_sessi
19450 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  on) {...CACKEY_D
19460 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19470 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49  urning CKR_SESSI
19480 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20  ON_COUNT (%i)", 
19490 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
194a0 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  T);....return(CK
194b0 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
194c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
194d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
194e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
194f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
19500 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
19510 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
19520 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
19530 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  oseSession)(CK_S
19540 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
19550 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d  ession) {..int m
19560 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
19570 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19580 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
19590 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
195a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
195b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
195c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
195d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
195e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
195f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
19600 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
19610 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
19620 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
19630 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
19640 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
19650 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19660 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
19670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19680 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
19690 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
196a0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
196b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
196c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
196d0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
196e0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
196f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
19700 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
19710 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
19720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19730 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
19740 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
19750 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
19760 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
19770 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
19780 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
19790 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
197a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
197b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
197c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
197d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
197e0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
197f0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
19800 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
19810 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
19820 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
19830 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
19840 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tive = 0;..cacke
19850 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
19860 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s(cackey_session
19870 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
19880 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73  tities, cackey_s
19890 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
198a0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
198b0 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  nt);...mutex_ret
198c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
198d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
198e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
198f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
19900 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
19910 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19920 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
19930 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
19940 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
19950 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
19960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19970 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
19980 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
19990 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
199a0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
199b0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
199c0 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
199d0 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ons)(CK_SLOT_ID 
199e0 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33  slotID) {..uint3
199f0 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  2_t idx;..int mu
19a00 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
19a10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19a20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
19a30 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
19a40 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
19a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19a60 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
19a70 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
19a80 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
19a90 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
19aa0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
19ab0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
19ac0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
19ad0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
19ae0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
19af0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
19b00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19b10 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
19b20 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
19b30 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
19b40 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
19b50 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
19b60 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
19b70 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
19b80 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
19b90 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
19ba0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19bb0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
19bc0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
19bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19be0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
19bf0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
19c00 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
19c10 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
19c20 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
19c30 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
19c40 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
19c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19c60 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
19c70 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
19c80 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
19c90 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
19ca0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
19cb0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19cc0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19cd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
19ce0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
19cf0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
19d00 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
19d10 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
19d20 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
19d30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
19d40 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
19d50 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
19d60 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
19d70 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
19d80 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
19d90 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a  ID != slotID) {.
19da0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
19db0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  .}.....cackey_mu
19dc0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
19dd0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43  y_biglock);....C
19de0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
19df0 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  x);....cackey_mu
19e00 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
19e10 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d  biglock);...}..}
19e20 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
19e30 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
19e40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
19e50 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
19e60 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
19e70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19e80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19e90 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
19ea0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19eb0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
19ec0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
19ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19ee0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
19ef0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
19f00 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
19f10 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
19f20 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
19f30 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43  etSessionInfo)(C
19f40 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
19f50 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45   hSession, CK_SE
19f60 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  SSION_INFO_PTR p
19f70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
19f80 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
19f90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19fa0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
19fb0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
19fc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19fd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19fe0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
19ff0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a000 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1a010 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1a020 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a030 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a040 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a050 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1a060 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a070 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1a080 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1a090 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1a0a0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1a0b0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1a0c0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1a0d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1a0e0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1a0f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a100 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1a110 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1a120 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1a130 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1a140 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1a150 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1a160 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1a170 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1a180 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1a190 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1a1a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a1b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1a1c0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1a1d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1a1e0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1a1f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1a200 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a210 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1a220 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1a230 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1a240 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1a250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a260 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1a270 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1a280 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1a290 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1a2a0 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ID);..}...pInfo-
1a2b0 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  >slotID = cackey
1a2c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a2d0 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e  on].slotID;..pIn
1a2e0 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b  fo->state = cack
1a2f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a300 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49  sion].state;..pI
1a310 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63  nfo->flags = cac
1a320 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1a330 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70  ssion].flags;..p
1a340 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72  Info->ulDeviceEr
1a350 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ror = cackey_ses
1a360 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a370 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a  ulDeviceError;..
1a380 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1a390 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1a3a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1a3b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1a3c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1a3d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a3e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1a3f0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1a400 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a410 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1a420 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1a430 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1a440 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1a450 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1a460 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1a470 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1a480 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1a490 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
1a4a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1a4b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1a4c0 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
1a4d0 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
1a4e0 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69  G_PTR pulOperati
1a4f0 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43  onStateLen) {..C
1a500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a510 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1a520 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1a530 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1a540 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a550 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1a560 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1a570 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1a580 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1a590 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1a5a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a5b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a5c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1a5d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1a5e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1a5f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1a600 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1a610 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1a620 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1a630 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1a640 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
1a650 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1a660 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1a670 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
1a680 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
1a690 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e  LONG ulOperation
1a6a0 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a  StateLen, CK_OBJ
1a6b0 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72  ECT_HANDLE hEncr
1a6c0 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42  yptionKey, CK_OB
1a6d0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74  JECT_HANDLE hAut
1a6e0 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20  henticationKey) 
1a6f0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1a700 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1a710 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1a720 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1a730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1a750 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1a760 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a770 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1a780 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1a790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a7a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1a7b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1a7c0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1a7d0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1a7e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1a7f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1a800 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1a810 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1a820 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1a830 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45  , C_Login)(CK_SE
1a840 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1a850 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54  ssion, CK_USER_T
1a860 59 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b  YPE userType, CK
1a870 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
1a880 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
1a890 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f  inLen) {..CK_SLO
1a8a0 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e  T_ID slotID;..in
1a8b0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1a8c0 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
1a8d0 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e  ning;..int login
1a8e0 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
1a8f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1a900 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1a910 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1a920 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1a930 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a940 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1a950 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1a960 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1a970 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1a980 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
1a990 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
1a9a0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
1a9b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1a9c0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1a9d0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
1a9e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a9f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1aa00 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
1aa10 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
1aa20 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1aa30 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1aa40 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
1aa50 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
1aa60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1aa70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1aa80 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
1aa90 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
1aaa0 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
1aab0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1aac0 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
1aad0 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
1aae0 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
1aaf0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1ab00 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1ab10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1ab20 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1ab30 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1ab40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ab50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1ab60 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1ab70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ab80 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1ab90 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1aba0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1abb0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1abc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1abd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1abe0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1abf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ac00 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1ac10 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1ac20 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1ac30 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1ac40 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ID);..}...slotID
1ac50 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1ac60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
1ac70 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
1ac80 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
1ac90 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1aca0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1acb0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1acc0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1acd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ace0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1acf0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1ad00 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
1ad10 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
1ad20 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
1ad30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1ad40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1ad50 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1ad60 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1ad70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ad80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1ad90 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1ada0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1adb0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1adc0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1add0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1ade0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1adf0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1ae00 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ae10 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  RROR);..}...logi
1ae20 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
1ae30 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
1ae40 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e  ts[slotID], pPin
1ae50 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69  , ulPinLen, &tri
1ae60 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09  es_remaining);..
1ae70 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d  if (login_ret !=
1ae80 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
1ae90 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  K) {...cackey_mu
1aea0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1aeb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
1aec0 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
1aed0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
1aee0 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CKED) {....CACKE
1aef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1af00 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73  Error.  Token is
1af10 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09   locked.");.....
1af20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1af30 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1af40 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
1af50 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72 65 74  _LOCKED;.....ret
1af60 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  urn(CKR_PIN_LOCK
1af70 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  ED);...} else if
1af80 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
1af90 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
1afa0 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  PIN) {....CACKEY
1afb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1afc0 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50  rror.  Invalid P
1afd0 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  IN.");.....cacke
1afe0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1aff0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
1b000 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
1b010 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74  T_LOW;.....if (t
1b020 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
1b030 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  = 1) {.....cacke
1b040 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1b050 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
1b060 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
1b070 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09  L_TRY;....}.....
1b080 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
1b090 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a  NCORRECT);...}..
1b0a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b0b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1b0c0 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74  nknown error ret
1b0d0 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65  urned from cacke
1b0e0 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c  y_login() (%i)",
1b0f0 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09   login_ret);....
1b100 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1b110 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1b120 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1b130 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1b140 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50   &= ~(CKF_USER_P
1b150 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f  IN_LOCKED | CKF_
1b160 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
1b170 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  OW | CKF_LOGIN_R
1b180 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53  EQUIRED | CKF_US
1b190 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59  ER_PIN_FINAL_TRY
1b1a0 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  );...cackey_sess
1b1b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1b1c0 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53  tate = CKS_RO_US
1b1d0 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09  ER_FUNCTIONS;...
1b1e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1b1f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1b200 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1b210 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1b220 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1b230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b240 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1b250 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1b260 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b270 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1b280 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1b290 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b2a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1b2b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1b2c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1b2d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b2e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f  ON(CK_RV, C_Logo
1b2f0 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ut)(CK_SESSION_H
1b300 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
1b310 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  {..CK_SLOT_ID sl
1b320 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78  otID;..int mutex
1b330 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1b340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b350 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1b360 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1b370 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1b380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b390 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1b3a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1b3b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1b3c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1b3d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1b3e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1b3f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1b400 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1b410 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1b420 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1b430 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b440 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b450 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1b460 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1b470 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1b480 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1b490 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1b4a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1b4b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1b4c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1b4d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1b4e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1b4f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b500 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1b510 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1b520 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1b530 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1b540 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b550 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1b560 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1b570 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1b580 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1b590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b5a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1b5b0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1b5c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1b5d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1b5e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1b5f0 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
1b600 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1b610 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
1b620 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
1b630 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
1b640 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1b650 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1b660 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
1b670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b680 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1b690 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1b6a0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
1b6b0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
1b6c0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
1b6d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1b6e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1b6f0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
1b700 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
1b710 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1b720 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b730 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1b740 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1b750 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
1b760 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
1b770 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1b780 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1b790 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1b7a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1b7b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1b7c0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1b7d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
1b7e0 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
1b7f0 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61 63 6b  C_SESSION;..cack
1b800 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1b810 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  .token_flags = C
1b820 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
1b830 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  D;...mutex_retva
1b840 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1b850 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1b860 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1b870 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1b880 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b890 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b8a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1b8b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b8c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1b8d0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
1b8e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b8f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1b900 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1b910 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1b920 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1b930 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1b940 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43  _CreateObject)(C
1b950 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1b960 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
1b970 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
1b980 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
1b990 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
1b9a0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
1b9b0 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
1b9c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b9d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1b9e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1b9f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ba00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ba10 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1ba20 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1ba30 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1ba40 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1ba50 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1ba60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1ba70 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1ba80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ba90 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1baa0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1bab0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1bac0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1bad0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1bae0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1baf0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79  ON(CK_RV, C_Copy
1bb00 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
1bb10 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1bb20 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
1bb30 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
1bb40 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
1bb50 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
1bb60 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
1bb70 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
1bb80 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a   phNewObject) {.
1bb90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bba0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1bbb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1bbc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1bbd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bbe0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1bbf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1bc00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1bc10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1bc20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1bc30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bc40 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1bc50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1bc60 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1bc70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1bc80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1bc90 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1bca0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1bcb0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1bcc0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1bcd0 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29  C_DestroyObject)
1bce0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1bcf0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1bd00 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
1bd10 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
1bd20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1bd30 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1bd40 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1bd50 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1bd60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1bd70 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1bd80 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1bd90 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1bda0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1bdb0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1bdc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1bdd0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1bde0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1bdf0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1be00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1be10 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1be20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1be30 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1be40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1be50 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62  N(CK_RV, C_GetOb
1be60 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53  jectSize)(CK_SES
1be70 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1be80 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
1be90 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
1bea0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1beb0 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f  Size) {..CACKEY_
1bec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1bed0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1bee0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1bef0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1bf00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1bf10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1bf20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1bf30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1bf40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1bf50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1bf60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1bf70 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1bf80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1bf90 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1bfa0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1bfb0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1bfc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1bfd0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1bfe0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1bff0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74  (CK_RV, C_GetAtt
1c000 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f  ributeValue)(CK_
1c010 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1c020 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1c030 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1c040 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
1c050 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
1c060 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
1c070 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
1c080 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74   *curr_attr;..st
1c090 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
1c0a0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a  tity *identity;.
1c0b0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
1c0c0 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74  dentity_idx, att
1c0d0 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
1c0e0 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09  _idx, num_ids;..
1c0f0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1c100 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
1c110 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f  = CKR_OK;..CK_VO
1c120 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
1c130 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
1c140 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  Len;...CACKEY_DE
1c150 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1c160 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1c170 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1c180 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c190 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c1a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c1b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c1c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c1d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1c1e0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1c1f0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1c200 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1c210 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1c220 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1c230 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1c240 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c250 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1c260 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1c270 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1c280 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1c290 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1c2a0 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63  ..}...if (hObjec
1c2b0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
1c2c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c2d0 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
1c2e0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
1c2f0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1c300 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
1c310 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1c320 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74  .}...if (ulCount
1c330 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
1c340 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
1c350 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
1c360 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
1c370 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
1c380 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43  mediately */...C
1c390 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c3a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1c3b0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
1c3c0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
1c3d0 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
1c3e0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
1c3f0 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55  (pTemplate == NU
1c400 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1c410 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c420 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69  or.  pTemplate i
1c430 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1c440 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1c450 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64  TS_BAD);..}...id
1c460 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62  entity_idx = hOb
1c470 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65  ject - 1;...mute
1c480 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1c490 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1c4a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1c4b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1c4c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1c4d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c4e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1c4f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1c500 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1c510 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1c520 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1c530 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1c540 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1c550 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1c560 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1c570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c580 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1c590 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1c5a0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1c5b0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1c5c0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1c5d0 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b  ..num_ids = cack
1c5e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1c5f0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1c600 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64  _count;...if (id
1c610 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75  entity_idx >= nu
1c620 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65  m_ids) {...cacke
1c630 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1c640 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1c650 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c660 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c670 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75  Object handle ou
1c680 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65  t of range.  ide
1c690 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c  ntity_idx = %lu,
1c6a0 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22   num_ids = %lu."
1c6b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1c6c0 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  ) identity_idx, 
1c6d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c6e0 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74  num_ids);....ret
1c6f0 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
1c700 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1c710 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20  .}...identity = 
1c720 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1c730 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1c740 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69  ities[identity_i
1c750 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72  dx];...for (attr
1c760 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69  _idx = 0; attr_i
1c770 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74  dx < ulCount; at
1c780 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75  tr_idx++) {...cu
1c790 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70  rr_attr = &pTemp
1c7a0 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  late[attr_idx];.
1c7b0 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
1c7c0 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ;...ulValueLen =
1c7d0 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
1c7e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c7f0 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66  RINTF("Looking f
1c800 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25  or attribute 0x%
1c810 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25  08lx (identity:%
1c820 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lu) ...", (unsig
1c830 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1c840 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69  ttr->type, (unsi
1c850 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
1c860 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72  ity_idx);....for
1c870 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
1c880 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
1c890 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61  dx < identity->a
1c8a0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
1c8b0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
1c8c0 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74  ) {....if (ident
1c8d0 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
1c8e0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74  sess_attr_idx].t
1c8f0 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72  ype == curr_attr
1c900 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41  ->type) {.....CA
1c910 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c920 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74  F(" ... found it
1c930 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75  , pValue = %p, u
1c940 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22  lValueLen = %lu"
1c950 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
1c960 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1c970 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64  _idx].pValue, id
1c980 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
1c990 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1c9a0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
1c9b0 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  ........pValue =
1c9c0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
1c9d0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1c9e0 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09  idx].pValue;....
1c9f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64  .ulValueLen = id
1ca00 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
1ca10 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1ca20 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ].ulValueLen;...
1ca30 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75  .}...}....if (cu
1ca40 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20  rr_attr->pValue 
1ca50 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
1ca60 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75  if (curr_attr->u
1ca70 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56  lValueLen >= ulV
1ca80 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d  alueLen) {.....m
1ca90 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d  emcpy(curr_attr-
1caa0 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c  >pValue, pValue,
1cab0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09   ulValueLen);...
1cac0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c  .} else {.....ul
1cad0 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
1cae0 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65  ONG) -1;......re
1caf0 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
1cb00 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
1cb10 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74  }...}....curr_at
1cb20 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  tr->ulValueLen =
1cb30 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a   ulValueLen;..}.
1cb40 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1cb50 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1cb60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1cb70 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1cb80 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1cb90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cba0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1cbb0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1cbc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1cbd0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1cbe0 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61  ;..}...if (retva
1cbf0 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55  l == CKR_ATTRIBU
1cc00 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  TE_TYPE_INVALID)
1cc10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cc20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1cc30 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54  ing CKR_ATTRIBUT
1cc40 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28  E_TYPE_INVALID (
1cc50 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
1cc60 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
1cc70 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42  (retval == CKR_B
1cc80 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
1cc90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cca0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1ccb0 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
1ccc0 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20  OO_SMALL (%i)", 
1ccd0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
1cce0 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61  } else if (retva
1ccf0 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l == CKR_OK) {..
1cd00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cd10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1cd20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69  CKR_OK (%i)", (i
1cd30 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
1cd40 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f  else {...CACKEY_
1cd50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1cd60 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
1cd70 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  t) retval);..}..
1cd80 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1cd90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1cda0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1cdb0 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
1cdc0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1cdd0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1cde0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1cdf0 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
1ce00 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
1ce10 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
1ce20 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59  Count) {..CACKEY
1ce30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1ce40 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1ce50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1ce60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ce70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ce80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1ce90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1cea0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ceb0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1cec0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1ced0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1cee0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1cef0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1cf00 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1cf10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1cf20 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1cf30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1cf40 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1cf50 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1cf60 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
1cf70 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53  bjectsInit)(CK_S
1cf80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1cf90 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49  ession, CK_ATTRI
1cfa0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
1cfb0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
1cfc0 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  ount) {..CK_SLOT
1cfd0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
1cfe0 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
1cff0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
1d000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d010 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1d020 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1d030 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1d040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d050 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1d060 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1d070 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1d080 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1d090 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1d0a0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1d0b0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1d0c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1d0d0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1d0e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d0f0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1d100 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d110 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1d120 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1d130 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1d140 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1d150 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1d160 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1d170 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1d180 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1d190 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1d1a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1d1b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d1c0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1d1d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1d1e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1d1f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1d200 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1d210 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1d220 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1d230 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1d240 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d250 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d260 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d270 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1d280 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1d290 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1d2a0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1d2b0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1d2c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d2d0 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
1d2e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1d2f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d300 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1d310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d320 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
1d330 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  h already active
1d340 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1d350 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
1d360 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  CTIVE);..}...slo
1d370 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
1d380 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1d390 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
1d3a0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
1d3b0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
1d3c0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1d3d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d3e0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1d3f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d400 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1d410 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1d420 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
1d430 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
1d440 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
1d450 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d460 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
1d470 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1d480 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
1d490 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d4a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d4b0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1d4c0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
1d4d0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
1d4e0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
1d4f0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1d500 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1d510 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1d520 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d530 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1d540 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1d550 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73  slotID].slot_res
1d560 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  et) {...CACKEY_D
1d570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65  EBUG_PRINTF("The
1d580 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72   slot has been r
1d590 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61  eset since we la
1d5a0 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64  st looked for id
1d5b0 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63  entities -- resc
1d5c0 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20  anning");....if 
1d5d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d5e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1d5f0 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
1d600 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
1d610 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
1d620 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1d630 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
1d640 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1d650 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1d660 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
1d670 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1d680 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1d690 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09  tities = NULL;..
1d6a0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1d6b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1d6c0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
1d6d0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
1d6e0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1d6f0 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29  ].label != NULL)
1d700 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
1d710 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1d720 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65  label);....cacke
1d730 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1d740 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
1d750 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
1d760 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
1d770 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  eset = 0;...cack
1d780 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1d790 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  .token_flags = C
1d7a0 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
1d7b0 44 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  D;..}...if (cack
1d7c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d7d0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1d7e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
1d7f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1d800 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1d810 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1d820 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
1d830 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1d840 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
1d850 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1d860 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
1d870 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
1d880 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate != NULL) {..
1d890 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20  .if (ulCount != 
1d8a0 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  0) {....cackey_s
1d8b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d8c0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1d8d0 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a  ount = ulCount;.
1d8e0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1d8f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1d900 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c  rch_query = mall
1d910 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  oc(ulCount * siz
1d920 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
1d930 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ;.....memcpy(cac
1d940 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1d950 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1d960 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20  ery, pTemplate, 
1d970 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
1d980 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09  (*pTemplate));..
1d990 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1d9a0 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69  idx < ulCount; i
1d9b0 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  dx++) {.....if (
1d9c0 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
1d9d0 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20  lValueLen == 0) 
1d9e0 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  {......cackey_se
1d9f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1da00 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
1da10 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  x].pValue = NULL
1da20 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  ;.......continue
1da30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
1da40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1da50 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1da60 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20  ery[idx].pValue 
1da70 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61  = malloc(pTempla
1da80 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
1da90 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 61  en);......if (ca
1daa0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1dab0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
1dac0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
1dad0 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
1dae0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1daf0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1db00 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
1db10 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64  ue, pTemplate[id
1db20 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
1db30 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
1db40 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09  eLen);.....}....
1db50 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
1db60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1db70 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1db80 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
1db90 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1dba0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1dbb0 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55  earch_query = NU
1dbc0 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  LL;...}..} else 
1dbd0 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
1dbe0 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
1dbf0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1dc00 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1dc10 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1dc20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dc30 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73 70   Search query sp
1dc40 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
1dc50 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71   but number of q
1dc60 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73  uery terms not s
1dc70 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 29  pecified as 0.")
1dc80 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
1dc90 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1dca0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
1dcb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1dcc0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1dcd0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  ount = 0;...cack
1dce0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1dcf0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1dd00 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ry = NULL;..}...
1dd10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1dd20 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1dd30 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61  _active = 1;..ca
1dd40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1dd50 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
1dd60 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75  urr_id = 0;...mu
1dd70 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1dd80 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1dd90 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1dda0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1ddb0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1ddc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ddd0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1dde0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1ddf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1de00 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1de10 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1de20 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1de30 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1de40 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1de50 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1de60 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1de70 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
1de80 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f  jects)(CK_SESSIO
1de90 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1dea0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
1deb0 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74  DLE_PTR phObject
1dec0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78  , CK_ULONG ulMax
1ded0 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f  ObjectCount, CK_
1dee0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a  ULONG_PTR pulObj
1def0 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72  ectCount) {..str
1df00 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
1df10 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43  ity *curr_id;..C
1df20 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
1df30 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e  r_attr;..CK_ULON
1df40 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63  G curr_id_idx, c
1df50 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20  urr_out_id_idx, 
1df60 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73  curr_attr_idx, s
1df70 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43  ess_attr_idx;..C
1df80 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f  K_ULONG matched_
1df90 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63  count, prev_matc
1dfa0 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20  hed_count;..int 
1dfb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
1dfc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dfd0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1dfe0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1dff0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1e000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e010 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1e020 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1e030 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1e040 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1e050 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1e060 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74   (pulObjectCount
1e070 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1e080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e090 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62  F("Error.  pulOb
1e0a0 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c  jectCount is NUL
1e0b0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1e0c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1e0d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f  D);..}...if (phO
1e0e0 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  bject == NULL &&
1e0f0 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
1e100 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  t == 0) {.../* S
1e110 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66  hort circuit, if
1e120 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65   zero objects we
1e130 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74  re specified ret
1e140 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69  urn zero items i
1e150 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09  mmediately */...
1e160 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  *pulObjectCount 
1e170 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  = 0;....CACKEY_D
1e180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1e190 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1e1a0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
1e1b0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
1e1c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1e1d0 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65  ..}...if (phObje
1e1e0 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ct == NULL) {...
1e1f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e200 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f  NTF("Error.  phO
1e210 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29  bject is NULL.")
1e220 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e230 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1e240 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62  .}...if (ulMaxOb
1e250 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
1e260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e280 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
1e290 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69  of objects speci
1e2a0 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b  fied as zero.");
1e2b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1e2c0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1e2d0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
1e2e0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
1e2f0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
1e300 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1e310 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1e320 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
1e330 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e340 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1e350 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1e360 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1e370 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1e380 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1e390 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1e3a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1e3b0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1e3c0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1e3d0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1e3e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e3f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e400 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1e410 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e420 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1e430 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1e440 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e450 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
1e460 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1e470 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1e480 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1e490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e4a0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
1e4b0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1e4c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1e4d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1e4e0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
1e4f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e500 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1e510 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
1e520 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1e530 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e540 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1e550 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e560 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74    Search not act
1e570 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1e580 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
1e590 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
1e5a0 44 29 3b 0a 09 7d 0a 0a 09 63 75 72 72 5f 6f 75  D);..}...curr_ou
1e5b0 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66  t_id_idx = 0;..f
1e5c0 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20  or (curr_id_idx 
1e5d0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1e5e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1e5f0 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72  ch_curr_id; curr
1e600 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  _id_idx < cackey
1e610 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e620 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
1e630 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a  ount && ulMaxObj
1e640 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69  ectCount; curr_i
1e650 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  d_idx++) {...cur
1e660 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73  r_id = &cackey_s
1e670 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e680 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72  ].identities[cur
1e690 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41  r_id_idx];....CA
1e6a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e6b0 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64  F("Processing id
1e6c0 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e  entity:%lu", (un
1e6d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1e6e0 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61  r_id_idx);....ma
1e6f0 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b  tched_count = 0;
1e700 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ....for (curr_at
1e710 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72  tr_idx = 0; curr
1e720 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b  _attr_idx < cack
1e730 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1e740 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1e750 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61  ry_count; curr_a
1e760 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
1e770 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
1e780 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  nt = matched_cou
1e790 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  nt;.....curr_att
1e7a0 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  r = &cackey_sess
1e7b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1e7c0 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72  earch_query[curr
1e7d0 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  _attr_idx];.....
1e7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e7f0 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20  NTF("  Checking 
1e800 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78  for attribute 0x
1e810 25 30 38 6c 78 20 69 6e 20 69 64 65 6e 74 69 74  %08lx in identit
1e820 79 3a 25 69 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  y:%i...", (unsig
1e830 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1e840 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29  ttr->type, (int)
1e850 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09   curr_id_idx);..
1e860 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e870 52 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c  RINTBUF("    Val
1e880 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22  ue looking for:"
1e890 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  , curr_attr->pVa
1e8a0 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e  lue, curr_attr->
1e8b0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1e8c0 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
1e8d0 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
1e8e0 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64  tr_idx < curr_id
1e8f0 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
1e900 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
1e910 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63  x++) {.....if (c
1e920 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
1e930 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1e940 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
1e950 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
1e960 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e970 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66  RINTF("    ... f
1e980 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79  ound matching ty
1e990 70 65 20 2e 2e 2e 22 29 3b 0a 09 09 09 09 09 43  pe ...");......C
1e9a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e9b0 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75  TBUF("    ... ou
1e9c0 72 20 76 61 6c 75 65 3a 22 2c 20 63 75 72 72 5f  r value:", curr_
1e9d0 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
1e9e0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
1e9f0 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61  alue, curr_id->a
1ea00 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1ea10 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
1ea20 4c 65 6e 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  Len);.......if (
1ea30 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1ea40 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1ea50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ea60 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
1ea70 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72  .. found wildcar
1ea80 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  d match");......
1ea90 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
1eaa0 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
1eab0 0a 09 09 09 09 09 7d 0a 0a 20 09 09 09 09 09 69  ......}.. .....i
1eac0 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  f (curr_attr->ul
1ead0 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 63 75 72 72  ValueLen == curr
1eae0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1eaf0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
1eb00 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d  lValueLen && mem
1eb10 63 6d 70 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  cmp(curr_attr->p
1eb20 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e  Value, curr_id->
1eb30 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1eb40 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
1eb50 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  , curr_id->attri
1eb60 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1eb70 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
1eb80 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 43   == 0) {.......C
1eb90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eba0 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
1ebb0 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68  ound exact match
1ebc0 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68  ");........match
1ebd0 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09  ed_count++;.....
1ebe0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1ebf0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
1ec00 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62  /* If the attrib
1ec10 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ute could not be
1ec20 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74   matched, do not
1ec30 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64   try to match ad
1ec40 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75  ditional attribu
1ec50 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72  tes */....if (pr
1ec60 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
1ec70 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e   == matched_coun
1ec80 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  t) {.....break;.
1ec90 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1eca0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
1ecb0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1ecc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1ecd0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b  h_query_count) {
1ece0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1ecf0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41  _PRINTF("  ... A
1ed00 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73  ll %i attributes
1ed10 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
1ed20 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74  nd, adding ident
1ed30 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e  ity:%i to return
1ed40 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20  ed list", (int) 
1ed50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ed60 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1ed70 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
1ed80 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
1ed90 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63  ;.....phObject[c
1eda0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20  urr_out_id_idx] 
1edb0 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20  = curr_id_idx + 
1edc0 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65  1;.....ulMaxObje
1edd0 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63  ctCount--;.....c
1ede0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b  urr_out_id_idx++
1edf0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1ee00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ee10 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61  NTF("  ... Not a
1ee20 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e  ll %i (only foun
1ee30 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73  d %i) attributes
1ee40 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
1ee50 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69  nd, not adding i
1ee60 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e  dentity:%i", (in
1ee70 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  t) cackey_sessio
1ee80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1ee90 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c  rch_query_count,
1eea0 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63   (int) matched_c
1eeb0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
1eec0 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d  _id_idx);...}..}
1eed0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1eee0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1eef0 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72  ch_curr_id = cur
1ef00 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f  r_id_idx;..*pulO
1ef10 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72  bjectCount = cur
1ef20 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 09  r_out_id_idx;...
1ef30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1ef40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1ef50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1ef60 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1ef70 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1ef80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ef90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1efa0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1efb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1efc0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1efd0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1efe0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1eff0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c  ing CKR_OK (%i),
1f000 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25   num objects = %
1f010 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75  lu", CKR_OK, *pu
1f020 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a  lObjectCount);..
1f030 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1f040 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1f050 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f060 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
1f070 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1f080 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
1f090 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09  .CK_ULONG idx;..
1f0a0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1f0b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1f0c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f0d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1f0e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f0f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f100 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f110 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f120 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f130 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f140 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f150 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1f160 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1f170 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1f180 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1f190 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1f1a0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1f1b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f1c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1f1d0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1f1e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1f1f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1f200 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1f210 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1f220 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1f230 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1f240 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1f250 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1f260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f270 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1f280 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1f290 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1f2a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1f2b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1f2c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f2d0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
1f2e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f2f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f300 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1f310 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f320 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
1f330 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1f340 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1f350 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1f360 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1f370 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1f380 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
1f390 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1f3a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1f3b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f3c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f3d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f3e0 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76  Search not activ
1f3f0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1f400 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
1f410 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1f420 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
1f430 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f440 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
1f450 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d   0;...for (idx =
1f460 20 30 3b 20 69 64 78 20 3c 20 63 61 63 6b 65 79   0; idx < cackey
1f470 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f480 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1f490 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b  _count; idx++) {
1f4a0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1f4b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f4c0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
1f4d0 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  x].pValue) {....
1f4e0 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
1f4f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1f500 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
1f510 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d  .pValue);...}..}
1f520 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1f530 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f540 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29 20 7b  .search_query) {
1f550 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
1f560 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f570 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29 3b  ].search_query);
1f580 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1f590 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1f5a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1f5b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1f5c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1f5d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f5e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f5f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1f600 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1f610 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1f620 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1f630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f640 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1f650 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1f660 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1f670 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f680 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f690 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 29 28 43  C_EncryptInit)(C
1f6a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1f6b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
1f6c0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
1f6d0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
1f6e0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
1f6f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f700 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1f710 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1f720 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1f730 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f740 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1f750 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1f760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f770 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1f780 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1f790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f7a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1f7b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f7c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1f7d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1f7e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1f7f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1f800 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f810 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1f820 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f830 20 43 5f 45 6e 63 72 79 70 74 29 28 43 4b 5f 53   C_Encrypt)(CK_S
1f840 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1f850 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1f860 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
1f870 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
1f880 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
1f890 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c  yptedData, CK_UL
1f8a0 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
1f8b0 70 74 65 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09  ptedDataLen) {..
1f8c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f8d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f8e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f8f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f910 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f920 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f930 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f940 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f950 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f960 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f970 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f980 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f990 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f9a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f9b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f9c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f9d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f9e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f9f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1fa00 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  _EncryptUpdate)(
1fa10 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1fa20 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1fa30 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
1fa40 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
1fa50 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1fa60 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
1fa70 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
1fa80 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
1fa90 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1faa0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1fab0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1fac0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1fad0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fae0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1faf0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1fb00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fb10 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1fb20 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1fb30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fb40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1fb50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1fb60 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1fb70 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1fb80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1fb90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1fba0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1fbb0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1fbc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1fbd0 56 2c 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61  V, C_EncryptFina
1fbe0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
1fbf0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1fc00 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74  K_BYTE_PTR pLast
1fc10 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
1fc20 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c  K_ULONG_PTR pulL
1fc30 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74  astEncryptedPart
1fc40 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1fc50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1fc60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1fc70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1fc80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1fc90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fca0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1fcb0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1fcc0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1fcd0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1fce0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1fcf0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1fd00 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1fd10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1fd20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1fd30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1fd40 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1fd50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1fd60 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1fd70 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1fd80 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
1fd90 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
1fda0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1fdb0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
1fdc0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
1fdd0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1fde0 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74  hKey) {..int mut
1fdf0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65  ex_retval;...hKe
1fe00 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  y--;...CACKEY_DE
1fe10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1fe20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1fe30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1fe40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fe50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1fe60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1fe70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1fe80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1fe90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1fea0 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
1feb0 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ism == NULL) {..
1fec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fed0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
1fee0 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e  chanism is NULL.
1fef0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ff00 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1ff10 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
1ff20 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
1ff30 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   != CKM_RSA_PKCS
1ff40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ff50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ff60 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  . pMechanism->me
1ff70 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63  chanism not spec
1ff80 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41  ified as CKM_RSA
1ff90 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75  _PKCS");....retu
1ffa0 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d  rn(CKR_MECHANISM
1ffb0 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b  _PARAM_INVALID);
1ffc0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
1ffd0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
1ffe0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
1fff0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
20000 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
20010 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
20020 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20030 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20040 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
20050 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
20060 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20070 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
20080 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
20090 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
200a0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
200b0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
200c0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
200d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
200e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
200f0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
20100 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20110 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20120 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
20130 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20140 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
20150 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20160 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20170 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
20180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20190 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
201a0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
201b0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
201c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
201d0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
201e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
201f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
20200 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
20210 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20220 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20230 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
20240 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20250 72 2e 20 20 44 65 63 72 79 70 74 20 61 6c 72 65  r.  Decrypt alre
20260 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ady in progress.
20270 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
20280 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
20290 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  TIVE);..}...if (
202a0 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73  hKey >= cackey_s
202b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
202c0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
202d0 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  nt) {...cackey_m
202e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
202f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
20300 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20310 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79  NTF("Error.  Key
20320 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
20330 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20  ange (requested 
20340 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c  key %lu, only %l
20350 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61  u identities ava
20360 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69  ilable).", (unsi
20370 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c  gned long) hKey,
20380 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
20390 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
203a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
203b0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
203c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f  .return(CKR_KEY_
203d0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
203e0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
203f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20400 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
20410 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73   1;...cackey_ses
20420 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20430 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
20440 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
20450 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b  mechanism;..cack
20460 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20470 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
20480 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63 68 61  ch_parm = pMecha
20490 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72  nism->pParameter
204a0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
204b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
204c0 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65  rypt_mech_parmle
204d0 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  n = pMechanism->
204e0 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a  ulParameterLen;.
204f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20500 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
20510 70 74 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63  pt_identity = &c
20520 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20530 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
20540 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74  ies[hKey];...mut
20550 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20560 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20570 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20580 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20590 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
205a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
205b0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
205c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
205d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
205e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
205f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20600 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20610 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
20620 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
20630 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
20640 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20650 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
20660 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20670 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20680 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
20690 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  ptedData, CK_ULO
206a0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61  NG ulEncryptedDa
206b0 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
206c0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
206d0 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65  NG_PTR pulDataLe
206e0 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64  n) {..CK_ULONG d
206f0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64  atalen_update, d
20700 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43  atalen_final;..C
20710 4b 5f 52 56 20 64 65 63 72 79 70 74 5f 72 65 74  K_RV decrypt_ret
20720 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
20730 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20740 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20750 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20760 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20770 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20780 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20790 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
207a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
207b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
207c0 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e  ..if (pulDataLen
207d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
207e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
207f0 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74  F("Error. pulDat
20800 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  aLen is NULL.");
20810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
20820 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
20830 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61  }...datalen_upda
20840 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  te = *pulDataLen
20850 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
20860 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
20870 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63  e(hSession, pEnc
20880 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e  ryptedData, ulEn
20890 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
208a0 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
208b0 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65  update);..if (de
208c0 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
208d0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
208e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
208f0 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64  ror.  DecryptUpd
20900 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66  ate() returned f
20910 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
20920 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
20930 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
20940 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63  );....return(dec
20950 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  rypt_ret);..}...
20960 69 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70  if (pData) {...p
20970 44 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f  Data += datalen_
20980 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61  update;..}..data
20990 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c  len_final = *pul
209a0 44 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65  DataLen - datale
209b0 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72  n_update;...decr
209c0 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72  ypt_ret = C_Decr
209d0 79 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f  yptFinal(hSessio
209e0 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c  n, pData, &datal
209f0 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28  en_final);..if (
20a00 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43  decrypt_ret != C
20a10 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
20a20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20a30 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46  Error.  DecryptF
20a40 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
20a50 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
20a60 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
20a70 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65  long) decrypt_re
20a80 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65  t);....return(de
20a90 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a  crypt_ret);..}..
20aa0 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64  .*pulDataLen = d
20ab0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20  atalen_update + 
20ac0 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a  datalen_final;..
20ad0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20ae0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20af0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
20b00 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
20b10 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
20b20 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
20b30 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55  K_RV, C_DecryptU
20b40 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
20b50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20b60 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
20b70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
20b80 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
20b90 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
20ba0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
20bb0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
20bc0 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69  artLen) {..stati
20bd0 63 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36  c CK_BYTE buf[16
20be0 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62  384];..ssize_t b
20bf0 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f  uflen;..CK_SLOT_
20c00 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52  ID slotID;..CK_R
20c10 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  V retval = CKR_G
20c20 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69  ENERAL_ERROR;..i
20c30 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
20c40 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20c50 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
20c60 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
20c70 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
20c80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20c90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
20ca0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
20cb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20cc0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
20cd0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20ce0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
20cf0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
20d00 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
20d10 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
20d20 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
20d30 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
20d40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20d50 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
20d60 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
20d70 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
20d80 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
20d90 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
20da0 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64  ..if (pEncrypted
20db0 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  Part == NULL && 
20dc0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
20dd0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  en == 0) {.../* 
20de0 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66  Short circuit if
20df0 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f   we are asked to
20e00 20 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67   decrypt nothing
20e10 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ... */...CACKEY_
20e20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20e30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
20e40 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
20e50 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
20e60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
20e70 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72  ;..}...if (pEncr
20e80 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c  yptedPart == NUL
20e90 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
20ea0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20eb0 72 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  r. pEncryptedPar
20ec0 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75  t is NULL, but u
20ed0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
20ee0 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a  n is not 0.");..
20ef0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
20f00 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
20f10 0a 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65  ..if (ulEncrypte
20f20 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  dPartLen == 0) {
20f30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20f40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75  PRINTF("Error. u
20f50 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
20f60 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72  n is 0, but pPar
20f70 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  t is not NULL.")
20f80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20f90 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
20fa0 09 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74  .}...if (pulPart
20fb0 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
20fc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20fd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
20fe0 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  PartLen is NULL.
20ff0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21000 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
21010 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21020 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21030 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
21040 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21050 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21060 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21070 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21080 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
21090 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
210a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
210b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
210c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
210d0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
210e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
210f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21100 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21120 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
21130 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
21140 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21150 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
21160 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
21170 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
21180 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
21190 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
211a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
211b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
211c0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
211d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
211e0 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
211f0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
21200 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
21210 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
21220 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  LIZED);..}...slo
21230 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
21240 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21250 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
21260 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
21270 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
21280 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
21290 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
212a0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
212b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
212c0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
212d0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
212e0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
212f0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
21300 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
21310 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21320 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
21330 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21340 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
21350 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21360 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21370 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21380 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21390 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
213a0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
213b0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
213c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
213d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
213e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
213f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
21400 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
21410 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21420 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69  .decrypt_mechani
21430 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  sm) {...case CKM
21440 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
21450 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63   Ask card to dec
21460 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65  rypt */....bufle
21470 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
21480 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
21490 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
214a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
214b0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
214c0 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79  identity, pEncry
214d0 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72  ptedPart, ulEncr
214e0 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75  yptedPartLen, bu
214f0 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20  f, sizeof(buf), 
21500 30 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62  0, 1);.....if (b
21510 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
21520 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20 66  ./* Decryption f
21530 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66  ailed. */.....if
21540 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b   (buflen == CACK
21550 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
21560 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76  GIN) {......retv
21570 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  al = CKR_USER_NO
21580 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09  T_LOGGED_IN;....
21590 09 7d 20 65 6c 73 65 20 69 66 20 28 62 75 66 6c  .} else if (bufl
215a0 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
215b0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
215c0 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
215d0 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
215e0 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  VED;.....} else 
215f0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
21600 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
21610 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  R;.....}....} el
21620 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65  se if (((unsigne
21630 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20  d long) buflen) 
21640 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26  > *pulPartLen &&
21650 20 70 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a   pPart) {...../*
21660 20 44 65 63 72 79 70 74 65 64 20 64 61 74 61 20   Decrypted data 
21670 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09  too large */....
21680 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
21690 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
216a0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
216b0 69 66 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09  if (pPart) {....
216c0 09 09 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20  ..memcpy(pPart, 
216d0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09  buf, buflen);...
216e0 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72  ..}......*pulPar
216f0 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a  tLen = buflen;..
21700 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
21710 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  _OK;....}.....br
21720 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  eak;..}...mutex_
21730 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21740 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21750 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21760 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21770 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21790 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
217a0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
217b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
217c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
217d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
217e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
217f0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
21800 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
21810 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
21820 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
21830 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29   C_DecryptFinal)
21840 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
21850 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
21860 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61  BYTE_PTR pLastPa
21870 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
21880 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29   pulLastPartLen)
21890 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
218a0 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69  tval;..int termi
218b0 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31  nate_decrypt = 1
218c0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
218d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
218e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
218f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
21900 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21910 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21920 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
21930 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21940 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
21950 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21960 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
21970 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
21980 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21990 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
219a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
219b0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
219c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
219d0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
219e0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
219f0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
21a00 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
21a10 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
21a20 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61  ...if (pulLastPa
21a30 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  rtLen == NULL) {
21a40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21a50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
21a60 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73  ulLastPartLen is
21a70 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
21a80 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
21a90 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
21aa0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
21ab0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
21ac0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
21ad0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
21ae0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
21af0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21b00 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
21b10 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21b20 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21b30 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
21b40 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
21b50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
21b60 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
21b70 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21b80 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21b90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21ba0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
21bb0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
21bc0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
21bd0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
21be0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
21bf0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
21c00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21c10 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
21c20 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
21c30 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21c40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
21c50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21c60 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
21c70 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
21c80 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
21c90 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
21ca0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
21cb0 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c  ...*pulLastPartL
21cc0 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c  en = 0;...if (pL
21cd0 61 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29  astPart == NULL)
21ce0 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64   {...terminate_d
21cf0 65 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a  ecrypt = 0;..}..
21d00 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64  .if (terminate_d
21d10 65 63 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b  ecrypt) {...cack
21d20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21d30 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
21d40 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d  tive = 0;..}...m
21d50 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
21d60 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
21d70 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21d80 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
21d90 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
21da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21db0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
21dc0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
21dd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
21de0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
21df0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
21e00 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21e10 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
21e20 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
21e30 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
21e40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21e50 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
21e60 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  tInit)(CK_SESSIO
21e70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
21e80 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
21e90 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20  PTR pMechanism) 
21ea0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
21eb0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21ec0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21ed0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21ee0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21ef0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21f00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21f10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21f20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21f30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21f40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21f50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21f60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21f70 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
21f80 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
21f90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
21fa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
21fb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21fc0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
21fd0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21fe0 2c 20 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53  , C_Digest)(CK_S
21ff0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
22000 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
22010 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
22020 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
22030 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
22040 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
22050 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
22060 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22070 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22080 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22090 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
220a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
220b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
220c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
220d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
220e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
220f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22110 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22120 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22130 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
22140 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22150 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
22160 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
22170 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22180 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22190 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
221a0 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 29   C_DigestUpdate)
221b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
221c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
221d0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
221e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
221f0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
22200 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22210 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
22220 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22230 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22240 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22250 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22260 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22270 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22280 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22290 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
222a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
222b0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
222c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
222d0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
222e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
222f0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22300 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22310 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
22320 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22330 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65  K_RV, C_DigestKe
22340 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
22350 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
22360 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
22370 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
22380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22390 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
223a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
223b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
223c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
223d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
223e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
223f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22400 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22410 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
22420 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22430 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
22440 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22450 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
22460 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22470 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
22480 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22490 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
224a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
224b0 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
224c0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
224d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
224e0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
224f0 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Digest, CK_ULONG
22500 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65  _PTR pulDigestLe
22510 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
22520 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22530 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
22540 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22550 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22560 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22570 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22580 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22590 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
225a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
225b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
225c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
225d0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
225e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
225f0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
22600 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22610 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
22620 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22630 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
22640 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22650 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29  _RV, C_SignInit)
22660 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22670 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
22680 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
22690 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
226a0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
226b0 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
226c0 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
226d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
226e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
226f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22700 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22720 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22730 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22740 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22750 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22760 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22770 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
22780 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
22790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
227a0 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
227b0 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
227c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
227d0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
227e0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
227f0 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
22800 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 26 26 20 70  KM_RSA_PKCS && p
22810 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
22820 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 53 48 41 31  nism != CKM_SHA1
22830 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
22840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22850 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
22860 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
22870 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
22880 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 6f  s CKM_RSA_PKCS o
22890 72 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50  r CKM_SHA1_RSA_P
228a0 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  KCS");....return
228b0 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  (CKR_MECHANISM_P
228c0 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  ARAM_INVALID);..
228d0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
228e0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
228f0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
22900 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
22910 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22920 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
22930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22940 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22950 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
22960 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
22970 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
22980 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22990 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
229a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
229b0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
229c0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
229d0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
229e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
229f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22a00 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
22a10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22a20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
22a30 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
22a40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22a50 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
22a60 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
22a70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22a80 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
22a90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22aa0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
22ab0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
22ac0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
22ad0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
22ae0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
22af0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22b00 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
22b10 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
22b20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
22b30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
22b40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22b50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
22b60 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 70  ign already in p
22b70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09  rogress.");.....
22b80 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
22b90 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09  ATION_ACTIVE);..
22ba0 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20  }...if (hKey >= 
22bb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22bc0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
22bd0 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ties_count) {...
22be0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22bf0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22c00 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
22c10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22c20 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20  or.  Key handle 
22c30 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65  out of range (re
22c40 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c  quested key %lu,
22c50 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69   only %lu identi
22c60 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e  ties available).
22c70 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
22c80 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e  g) hKey, (unsign
22c90 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f  ed long) cackey_
22ca0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22cb0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
22cc0 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
22cd0 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
22ce0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
22cf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22d00 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
22d10 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
22d20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22d30 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
22d40 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
22d50 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63  ->mechanism;...c
22d60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22d70 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
22d80 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63  flen = 128;..cac
22d90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22da0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
22db0 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  sed = 0;..cackey
22dc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22dd0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d  on].sign_buf = m
22de0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
22df0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22e00 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
22e10 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) * cackey_sessi
22e20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
22e30 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41  gn_buflen);...CA
22e40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22e50 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 20 73  F("Session %lu s
22e60 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 73 20  ign_identity is 
22e70 25 70 20 28 69 64 65 6e 74 69 74 79 20 23 25 6c  %p (identity #%l
22e80 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
22e90 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c 20 26  ong) hSession, &
22ea0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22eb0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
22ec0 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73  ties[hKey], (uns
22ed0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
22ee0 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  );..cackey_sessi
22ef0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
22f00 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63  gn_identity = &c
22f10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22f20 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
22f30 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74  ies[hKey];...mut
22f40 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22f50 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
22f60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22f70 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22f80 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22f90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22fa0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
22fb0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
22fc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
22fd0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
22fe0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22ff0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
23000 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
23010 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
23020 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
23030 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23040 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43  CK_RV, C_Sign)(C
23050 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
23060 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
23070 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
23080 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
23090 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
230a0 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
230b0 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
230c0 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  ureLen) {..unsig
230d0 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73  ned long start_s
230e0 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b  ign_bufused;..CK
230f0 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 0a 09  _RV sign_ret;...
23100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23110 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
23120 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
23130 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
23140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23150 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
23160 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
23170 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
23180 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
23190 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
231a0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
231b0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
231c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
231d0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
231e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
231f0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
23200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23210 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
23220 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
23230 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23240 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
23250 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
23260 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
23270 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  d = cackey_sessi
23280 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
23290 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69  gn_bufused;...si
232a0 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55  gn_ret = C_SignU
232b0 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20  pdate(hSession, 
232c0 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e  pData, ulDataLen
232d0 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74  );..if (sign_ret
232e0 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
232f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23300 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
23310 6e 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e  nUpdate() return
23320 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
23330 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
23340 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
23350 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  t);....return(si
23360 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69  gn_ret);..}...si
23370 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46  gn_ret = C_SignF
23380 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
23390 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69  Signature, pulSi
233a0 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66  gnatureLen);..if
233b0 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
233c0 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69  R_OK) {...if (si
233d0 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55  gn_ret == CKR_BU
233e0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
233f0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
23400 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69  G_PRINTF("SignFi
23410 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43  nal() returned C
23420 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
23430 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20  ALL (rv = %lu), 
23440 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70  undoing C_SignUp
23450 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e  date()", (unsign
23460 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
23470 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  t);.....cackey_s
23480 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23490 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
234a0 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
234b0 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  sed;.....return(
234c0 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a  sign_ret);...}..
234d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
234e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
234f0 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72  ignFinal() retur
23500 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
23510 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
23520 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
23530 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73  et);....return(s
23540 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69  ign_ret);..}...i
23550 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d  f (pSignature ==
23560 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
23570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23580 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 69  pSignature speci
23590 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e  fied as NULL, un
235a0 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61  doing C_SignUpda
235b0 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65  te()");....cacke
235c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
235d0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
235e0 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62  d = start_sign_b
235f0 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72  ufused;....retur
23600 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a  n(sign_ret);..}.
23610 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23620 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
23630 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
23640 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
23650 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
23660 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23670 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64  CK_RV, C_SignUpd
23680 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
23690 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
236a0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
236b0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
236c0 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d  artLen) {..int m
236d0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
236e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
236f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23700 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23710 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23720 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23730 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23740 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23750 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23760 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
23770 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
23780 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
23790 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
237a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
237b0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
237c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
237d0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
237e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
237f0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
23800 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
23810 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23820 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
23830 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
23840 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20   (pPart == NULL 
23850 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  && ulPartLen == 
23860 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
23870 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
23880 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20  e asked to sign 
23890 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
238a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
238b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
238c0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
238d0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
238e0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
238f0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
23900 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (pPart == NULL)
23910 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23920 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23930 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20   pPart is NULL, 
23940 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  but ulPartLen is
23950 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
23960 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
23970 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
23980 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30   (ulPartLen == 0
23990 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
239a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
239b0 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30  . ulPartLen is 0
239c0 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
239d0 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
239e0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
239f0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
23a00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
23a10 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
23a20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23a30 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
23a40 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
23a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23a60 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
23a70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
23a80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
23a90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
23aa0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
23ab0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
23ac0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
23ad0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23ae0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23af0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23b00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23b10 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
23b20 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
23b30 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
23b40 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
23b50 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
23b60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23b70 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
23b80 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
23b90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23ba0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
23bb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23bc0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
23bd0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
23be0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
23bf0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
23c00 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
23c10 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
23c20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23c30 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
23c40 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
23c50 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63  A_PKCS:..../* Ac
23c60 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c  cumulate directl
23c70 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63  y */....if ((cac
23c80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23c90 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
23ca0 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29  sed + ulPartLen)
23cb0 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   > cackey_sessio
23cc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
23cd0 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09  n_buflen) {.....
23ce0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23cf0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
23d00 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09  uflen *= 2;.....
23d10 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
23d20 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
23d30 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61  buf = realloc(ca
23d40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23d50 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
23d60 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  , sizeof(*cackey
23d70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23d80 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20  on].sign_buf) * 
23d90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23da0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
23db0 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09  uflen);....}....
23dc0 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
23dd0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23de0 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63  ].sign_buf + cac
23df0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23e00 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
23e10 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61  sed, pPart, ulPa
23e20 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b  rtLen);.....cack
23e30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23e40 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
23e50 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b  ed += ulPartLen;
23e60 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  .....break;...ca
23e70 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f  se CKM_SHA1_RSA_
23e80 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 58 58 58 3a  PKCS:..../* XXX:
23e90 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f   Accumulate into
23ea0 20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a   a SHA1 hash */.
23eb0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23ec0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23ed0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
23ee0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23ef0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
23f00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23f10 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
23f20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23f30 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65  PPORTED);.....re
23f40 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
23f50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23f60 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
23f70 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
23f80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23f90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23fa0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
23fb0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
23fc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23fd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
23fe0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
23ff0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24000 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24010 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24020 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24030 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
24040 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
24050 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
24060 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24070 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
24080 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  nFinal)(CK_SESSI
24090 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
240a0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
240b0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
240c0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
240d0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61  atureLen) {..sta
240e0 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62  tic CK_BYTE sigb
240f0 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65  uf[1024];..ssize
24100 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43  _t sigbuflen;..C
24110 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
24120 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
24130 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
24140 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  ROR;..int termin
24150 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69  ate_sign = 1;..i
24160 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
24170 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24180 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24190 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
241a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
241b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
241c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
241d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
241e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
241f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24200 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24210 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72  .if (pulSignatur
24220 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  eLen == NULL) {.
24230 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24240 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
24250 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73  lSignatureLen is
24260 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
24270 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
24280 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
24290 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
242a0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
242b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
242c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
242d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
242e0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
242f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24300 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
24310 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
24320 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24330 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
24340 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
24350 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24360 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
24370 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24380 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24390 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
243a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
243b0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
243c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
243d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
243e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
243f0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
24400 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
24410 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
24420 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24430 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24440 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24450 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24460 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
24470 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
24480 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
24490 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
244a0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
244b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
244c0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
244d0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
244e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
244f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
24500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24510 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
24520 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
24530 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
24540 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
24550 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c  ALIZED);..}...sl
24560 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
24570 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24580 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
24590 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
245a0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
245b0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
245c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
245d0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
245e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
245f0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
24600 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
24610 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
24620 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
24630 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
24640 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24650 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
24660 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
24670 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
24680 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24690 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
246a0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
246b0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
246c0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
246d0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
246e0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
246f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24700 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
24710 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24720 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
24730 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
24740 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24750 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
24760 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
24770 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
24780 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20  sk card to sign 
24790 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  */....CACKEY_DEB
247a0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e  UG_PRINTF("Askin
247b0 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69  g to sign from i
247c0 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65  dentity %p in se
247d0 73 73 69 6f 6e 20 25 6c 75 22 2c 20 63 61 63 6b  ssion %lu", cack
247e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
247f0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
24800 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ity, (unsigned l
24810 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a  ong) hSession);.
24820 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63  ...sigbuflen = c
24830 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
24840 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
24850 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
24860 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24870 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
24880 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
24890 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
248a0 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73  _buf, cackey_ses
248b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
248c0 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69  sign_bufused, si
248d0 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67  gbuf, sizeof(sig
248e0 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09  buf), 1, 0);....
248f0 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c  .if (sigbuflen <
24900 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67   0) {...../* Sig
24910 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  ning failed. */.
24920 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
24930 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
24940 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a  _E_NEEDLOGIN) {.
24950 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
24960 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45  R_USER_NOT_LOGGE
24970 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65  D_IN;.....} else
24980 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d   if (sigbuflen =
24990 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
249a0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
249b0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
249c0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
249d0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
249e0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
249f0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
24a00 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
24a10 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
24a20 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e  ng) sigbuflen) >
24a30 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
24a40 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 29  n && pSignature)
24a50 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64   {...../* Signed
24a60 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
24a70 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  */.....CACKEY_DE
24a80 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76  BUG_PRINTF("retv
24a90 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
24aa0 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62  TOO_SMALL;  sigb
24ab0 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c  uflen = %lu, pul
24ac0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25  SignatureLen = %
24ad0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
24ae0 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20  ong) sigbuflen, 
24af0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
24b00 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
24b10 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  );......retval =
24b20 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
24b30 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d  SMALL;......term
24b40 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a  inate_sign = 0;.
24b50 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
24b60 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
24b70 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69   0;......if (pSi
24b80 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09  gnature) {......
24b90 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72  memcpy(pSignatur
24ba0 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 75  e, sigbuf, sigbu
24bb0 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72  flen);.......ter
24bc0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
24bd0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c  .....}......*pul
24be0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73  SignatureLen = s
24bf0 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  igbuflen;......r
24c00 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
24c10 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
24c20 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f  ..case CKM_SHA1_
24c30 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
24c40 58 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65 20  XXX: Accumulate 
24c50 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 68  into a SHA1 hash
24c60 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75   */....cackey_mu
24c70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24c80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
24c90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24ca0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24cb0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24cc0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
24cd0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24ce0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
24cf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
24d00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24d10 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  TED);....break;.
24d20 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61  .}...if (termina
24d30 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20  te_sign) {...if 
24d40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
24d50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
24d60 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63  buf) {....free(c
24d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24d80 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
24d90 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  f);...}....cacke
24da0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24db0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
24dc0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
24dd0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24de0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24df0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24e00 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
24e10 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
24e20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24e30 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
24e40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
24e50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24e60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
24e70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24e80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
24e90 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
24ea0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
24eb0 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
24ec0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24ed0 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  , C_SignRecoverI
24ee0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
24ef0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24f00 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
24f10 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
24f20 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
24f30 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
24f40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
24f50 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
24f60 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
24f70 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
24f80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24f90 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24fa0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24fb0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24fc0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24fd0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24fe0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24ff0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
25000 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
25010 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
25020 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25030 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
25040 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25050 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
25060 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25070 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
25080 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  over)(CK_SESSION
25090 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
250a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
250b0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
250c0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
250d0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
250e0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
250f0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
25100 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25110 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25120 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25130 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25150 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25160 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25170 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25180 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25190 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
251a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
251b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
251c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
251d0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
251e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
251f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
25200 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
25210 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25220 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
25230 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25240 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43   C_VerifyInit)(C
25250 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
25260 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
25270 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
25280 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
25290 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
252a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
252b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
252c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
252d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
252e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
252f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25300 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25310 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25320 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25330 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25350 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
25360 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25370 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
25380 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25390 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
253a0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
253b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
253c0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
253d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
253e0 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45   C_Verify)(CK_SE
253f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25400 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
25410 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
25420 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
25430 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
25440 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
25450 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
25460 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25470 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25480 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25490 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
254a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
254b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
254c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
254d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
254e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
254f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25510 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
25520 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25530 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
25540 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25550 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
25560 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
25570 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25580 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
25590 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
255a0 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 29   C_VerifyUpdate)
255b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
255c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
255d0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
255e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
255f0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
25600 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
25610 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
25620 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
25630 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25640 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25650 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
25660 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25670 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
25680 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
25690 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
256a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
256b0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
256c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
256d0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
256e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
256f0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
25700 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25710 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
25720 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
25730 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69  K_RV, C_VerifyFi
25740 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
25750 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
25760 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
25770 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
25780 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
25790 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
257a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
257b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
257c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
257d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
257e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
257f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
25800 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25810 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
25820 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
25830 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25840 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25850 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
25860 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
25870 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
25880 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
25890 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
258a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
258b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
258c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
258d0 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f  RV, C_VerifyReco
258e0 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
258f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
25900 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
25910 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
25920 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
25930 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
25940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25950 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25960 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25970 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25990 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
259a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
259b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
259c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
259d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
259e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
259f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
25a00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25a10 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
25a20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25a30 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
25a40 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
25a50 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
25a60 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25a70 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
25a80 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ifyRecover)(CK_S
25a90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25aa0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
25ab0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
25ac0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
25ad0 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  tureLen, CK_BYTE
25ae0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
25af0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
25b00 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
25b10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25b20 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
25b30 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25b40 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
25b50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25b60 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
25b70 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
25b80 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
25b90 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25ba0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
25bb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25bc0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
25bd0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
25be0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
25bf0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25c00 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
25c10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25c20 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
25c30 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25c40 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45  CK_RV, C_DigestE
25c50 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
25c60 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
25c70 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
25c80 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
25c90 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
25ca0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
25cb0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
25cc0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
25cd0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
25ce0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25cf0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25d00 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25d10 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25d20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25d30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25d40 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25d50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25d60 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25d70 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25d80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25d90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
25da0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25db0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
25dc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25dd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
25de0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
25df0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25e00 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
25e10 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25e20 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74   C_DecryptDigest
25e30 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
25e40 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
25e50 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
25e60 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
25e70 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
25e80 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
25e90 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
25ea0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
25eb0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
25ec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25ed0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25ee0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25ef0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25f10 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
25f20 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
25f30 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
25f40 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25f50 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
25f60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
25f70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
25f80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25f90 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
25fa0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25fb0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
25fc0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
25fd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
25fe0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25ff0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
26000 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  nEncryptUpdate)(
26010 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26020 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
26030 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
26040 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
26050 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
26060 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
26070 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
26080 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
26090 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
260a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
260b0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
260c0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
260d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
260e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
260f0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
26100 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26110 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
26120 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
26130 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26140 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
26150 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26160 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
26170 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
26180 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26190 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
261a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
261b0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
261c0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
261d0 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 69  V, C_DecryptVeri
261e0 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  fyUpdate)(CK_SES
261f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26200 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
26210 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
26220 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
26230 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
26240 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
26250 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
26260 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
26270 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26280 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
26290 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
262a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
262b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
262c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
262d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
262e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
262f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
26300 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
26310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26320 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
26330 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26340 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
26350 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26360 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
26370 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
26380 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26390 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
263a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
263b0 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53  enerateKey)(CK_S
263c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
263d0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
263e0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
263f0 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ism, CK_ATTRIBUT
26400 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
26410 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
26420 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
26430 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
26440 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26450 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26460 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26470 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
264a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
264b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
264c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
264d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
264e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
264f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26500 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26510 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
26520 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26530 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
26540 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
26550 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26560 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26570 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26580 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
26590 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ir)(CK_SESSION_H
265a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
265b0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
265c0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
265d0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
265e0 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65  ublicKeyTemplate
265f0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62  , CK_ULONG ulPub
26600 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 43  licKeyAttributeC
26610 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ount, CK_ATTRIBU
26620 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b  TE_PTR pPrivateK
26630 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55  eyTemplate, CK_U
26640 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65  LONG ulPrivateKe
26650 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
26660 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
26670 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65  E_PTR phPublicKe
26680 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
26690 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 74  DLE_PTR phPrivat
266a0 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eKey) {..CACKEY_
266b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
266c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
266d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
266e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
266f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26700 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
26710 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
26720 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
26730 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26740 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
26750 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26760 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
26770 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26780 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
26790 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
267a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
267b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
267c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
267d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
267e0 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65  (CK_RV, C_WrapKe
267f0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
26800 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
26810 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
26820 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
26830 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72  BJECT_HANDLE hWr
26840 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42  appingKey, CK_OB
26850 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
26860 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57  , CK_BYTE_PTR pW
26870 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c  rappedKey, CK_UL
26880 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70  ONG_PTR pulWrapp
26890 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43  edKeyLen) {..CAC
268a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
268b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
268c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
268d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
268e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
268f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26900 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26910 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26920 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
26930 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
26940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26950 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
26960 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26970 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
26980 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26990 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
269a0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
269b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
269c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
269d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e  TION(CK_RV, C_Un
269e0 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  wrapKey)(CK_SESS
269f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26a00 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
26a10 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
26a20 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
26a30 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65  LE hUnwrappingKe
26a40 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
26a50 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
26a60 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65  LONG ulWrappedKe
26a70 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  yLen, CK_ATTRIBU
26a80 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
26a90 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74  , CK_ULONG ulAtt
26aa0 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
26ab0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
26ac0 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
26ad0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26ae0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26af0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26b00 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
26b10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26b20 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26b30 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
26b40 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
26b50 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26b60 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
26b70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26b80 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
26b90 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26ba0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
26bb0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26bc0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
26bd0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
26be0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
26bf0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26c00 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72  ION(CK_RV, C_Der
26c10 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  iveKey)(CK_SESSI
26c20 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
26c30 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
26c40 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
26c50 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
26c60 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41  E hBaseKey, CK_A
26c70 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
26c80 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
26c90 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
26ca0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
26cb0 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
26cc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26cd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26ce0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26cf0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26d00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26d10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26d20 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26d30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26d40 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26d50 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26d70 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26d80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26d90 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
26da0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26db0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
26dc0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
26dd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26de0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26df0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26e00 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43   C_SeedRandom)(C
26e10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
26e20 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
26e30 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b  TE_PTR pSeed, CK
26e40 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e  _ULONG ulSeedLen
26e50 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
26e60 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
26e70 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
26e80 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
26e90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26ea0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26eb0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
26ec0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26ed0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
26ee0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
26ef0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26f00 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26f10 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
26f20 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
26f30 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
26f40 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26f50 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
26f60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26f70 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
26f80 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
26f90 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61  RV, C_GenerateRa
26fa0 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
26fb0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26fc0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52  , CK_BYTE_PTR pR
26fd0 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c  andomData, CK_UL
26fe0 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29  ONG ulRandomLen)
26ff0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
27000 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
27010 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
27020 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
27030 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27040 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27050 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27060 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27070 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27080 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27090 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
270a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
270b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
270c0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
270d0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
270e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
270f0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
27100 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27110 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72  TED);.}../* Depr
27120 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
27130 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
27140 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
27150 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
27160 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27170 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
27180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27190 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
271a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
271b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
271c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
271d0 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29  OT_PARALLEL (%i)
271e0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
271f0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
27200 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
27210 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
27220 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d  L);...hSession =
27230 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75   hSession; /* Su
27240 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72  press unused var
27250 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f  iable warning */
27260 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
27270 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
27280 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27290 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c  (CK_RV, C_Cancel
272a0 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53  Function)(CK_SES
272b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
272c0 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  sion) {..CACKEY_
272d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
272e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
272f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27300 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
27310 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
27320 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  LEL (%i)", CKR_F
27330 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
27340 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  LLEL);...return(
27350 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27360 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53  _PARALLEL);...hS
27370 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f  ession = hSessio
27380 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  n; /* Supress un
27390 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
273a0 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
273b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
273c0 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74  K_RV, C_GetFunct
273d0 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43  ionList)(CK_FUNC
273e0 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54  TION_LIST_PTR_PT
273f0 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  R ppFunctionList
27400 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e  ) {..CK_FUNCTION
27410 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74  _LIST_PTR pFunct
27420 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
27430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27440 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
27450 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  (ppFunctionList 
27460 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
27470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27480 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74  ("Error. ppFunct
27490 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e  ionList is NULL.
274a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
274b0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
274c0 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  ;..}...pFunction
274d0 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  List = malloc(si
274e0 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c  zeof(*pFunctionL
274f0 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69  ist));...pFuncti
27500 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e  onList->version.
27510 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  major = ((CACKEY
27520 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
27530 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26  N_CODE) >> 16) &
27540 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f   0xff;..pFunctio
27550 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d  nList->version.m
27560 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  inor = ((CACKEY_
27570 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
27580 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30  _CODE) >> 8) & 0
27590 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  xff;...pFunction
275a0 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69  List->C_Initiali
275b0 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a  ze = C_Initializ
275c0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
275d0 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20  t->C_Finalize = 
275e0 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75  C_Finalize;..pFu
275f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
27600 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66  tInfo = C_GetInf
27610 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
27620 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  t->C_GetSlotList
27630 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74   = C_GetSlotList
27640 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27650 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20  ->C_GetSlotInfo 
27660 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b  = C_GetSlotInfo;
27670 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27680 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20  >C_GetTokenInfo 
27690 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  = C_GetTokenInfo
276a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
276b0 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  ->C_WaitForSlotE
276c0 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72  vent = C_WaitFor
276d0 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e  SlotEvent;..pFun
276e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
276f0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20  MechanismList = 
27700 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
27710 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
27720 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69  st->C_GetMechani
27730 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65  smInfo = C_GetMe
27740 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46  chanismInfo;..pF
27750 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
27760 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69  nitToken = C_Ini
27770 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69  tToken;..pFuncti
27780 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49  onList->C_InitPI
27790 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09  N = C_InitPIN;..
277a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
277b0 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50  _SetPIN = C_SetP
277c0 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
277d0 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f  st->C_OpenSessio
277e0 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f  n = C_OpenSessio
277f0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
27800 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  t->C_CloseSessio
27810 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  n = C_CloseSessi
27820 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
27830 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  st->C_CloseAllSe
27840 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65  ssions = C_Close
27850 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46  AllSessions;..pF
27860 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
27870 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20  etSessionInfo = 
27880 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
27890 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
278a0 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_GetOperation
278b0 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65  State = C_GetOpe
278c0 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
278d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
278e0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
278f0 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f   = C_SetOperatio
27900 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  nState;..pFuncti
27910 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20  onList->C_Login 
27920 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e  = C_Login;..pFun
27930 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
27940 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a  out = C_Logout;.
27950 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27960 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d  C_CreateObject =
27970 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b   C_CreateObject;
27980 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27990 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20  >C_CopyObject = 
279a0 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70  C_CopyObject;..p
279b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
279c0 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20  DestroyObject = 
279d0 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b  C_DestroyObject;
279e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
279f0 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65  >C_GetObjectSize
27a00 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69   = C_GetObjectSi
27a10 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
27a20 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75  st->C_GetAttribu
27a30 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41  teValue = C_GetA
27a40 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
27a50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27a60 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
27a70 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62  ue = C_SetAttrib
27a80 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63  uteValue;..pFunc
27a90 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
27aa0 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f  ObjectsInit = C_
27ab0 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b  FindObjectsInit;
27ac0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27ad0 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d  >C_FindObjects =
27ae0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a   C_FindObjects;.
27af0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27b00 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
27b10 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  al = C_FindObjec
27b20 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  tsFinal;..pFunct
27b30 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
27b40 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79  ptInit = C_Encry
27b50 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  ptInit;..pFuncti
27b60 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
27b70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09  t = C_Encrypt;..
27b80 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27b90 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  _EncryptUpdate =
27ba0 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65   C_EncryptUpdate
27bb0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27bc0 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c  ->C_EncryptFinal
27bd0 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61   = C_EncryptFina
27be0 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
27bf0 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74  t->C_DecryptInit
27c00 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74   = C_DecryptInit
27c10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27c20 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f  ->C_Decrypt = C_
27c30 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74  Decrypt;..pFunct
27c40 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
27c50 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63  ptUpdate = C_Dec
27c60 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
27c70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
27c80 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44  cryptFinal = C_D
27c90 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46  ecryptFinal;..pF
27ca0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
27cb0 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69  igestInit = C_Di
27cc0 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  gestInit;..pFunc
27cd0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
27ce0 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09  st = C_Digest;..
27cf0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27d00 5f 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  _DigestUpdate = 
27d10 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a  C_DigestUpdate;.
27d20 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
27d30 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f  C_DigestKey = C_
27d40 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e  DigestKey;..pFun
27d50 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
27d60 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67  estFinal = C_Dig
27d70 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  estFinal;..pFunc
27d80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
27d90 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69  Init = C_SignIni
27da0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
27db0 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69  t->C_Sign = C_Si
27dc0 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  gn;..pFunctionLi
27dd0 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65  st->C_SignUpdate
27de0 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b   = C_SignUpdate;
27df0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27e00 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43  >C_SignFinal = C
27e10 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75  _SignFinal;..pFu
27e20 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
27e30 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20  gnRecoverInit = 
27e40 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
27e50 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
27e60 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
27e70 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
27e80 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27e90 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d  ->C_VerifyInit =
27ea0 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09   C_VerifyInit;..
27eb0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27ec0 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69  _Verify = C_Veri
27ed0 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fy;..pFunctionLi
27ee0 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61  st->C_VerifyUpda
27ef0 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64  te = C_VerifyUpd
27f00 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
27f10 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e  ist->C_VerifyFin
27f20 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e  al = C_VerifyFin
27f30 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
27f40 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
27f50 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69  verInit = C_Veri
27f60 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09  fyRecoverInit;..
27f70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27f80 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d  _VerifyRecover =
27f90 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
27fa0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
27fb0 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  ->C_DigestEncryp
27fc0 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65  tUpdate = C_Dige
27fd0 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  stEncryptUpdate;
27fe0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27ff0 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74  >C_DecryptDigest
28000 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
28010 70 74 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a  ptDigestUpdate;.
28020 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
28030 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
28040 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72  ate = C_SignEncr
28050 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
28060 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
28070 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
28080 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72 69   = C_DecryptVeri
28090 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
280a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
280b0 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65  rateKey = C_Gene
280c0 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74  rateKey;..pFunct
280d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72  ionList->C_Gener
280e0 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47  ateKeyPair = C_G
280f0 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a  enerateKeyPair;.
28100 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
28110 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72  C_WrapKey = C_Wr
28120 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
28130 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b  nList->C_UnwrapK
28140 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79  ey = C_UnwrapKey
28150 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
28160 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20  ->C_DeriveKey = 
28170 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46  C_DeriveKey;..pF
28180 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
28190 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65  eedRandom = C_Se
281a0 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63  edRandom;..pFunc
281b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
281c0 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47  rateRandom = C_G
281d0 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09  enerateRandom;..
281e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
281f0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
28200 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69  us = C_GetFuncti
28210 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63  onStatus;..pFunc
28220 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63  tionList->C_Canc
28230 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43  elFunction = C_C
28240 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09  ancelFunction;..
28250 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
28260 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74  _GetFunctionList
28270 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e   = C_GetFunction
28280 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74  List;...*ppFunct
28290 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74  ionList = pFunct
282a0 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
282b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
282c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
282d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
282e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
282f0 29 3b 0a 7d 0a 0a                                );.}..