Hex Artifact Content

Artifact 375972947e66b1e90d8b81859a6dd0e3d21abe1c:


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 2f 2a 20 41 54 52 20 49 66 20 6e 6f  50../* ATR If no
1340: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 23  t available */.#
1350: 69 66 6e 64 65 66 20 4d 41 58 5f 41 54 52 5f 53  ifndef MAX_ATR_S
1360: 49 5a 45 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  IZE.#define MAX_
1370: 41 54 52 5f 53 49 5a 45 20 31 30 32 34 0a 23 65  ATR_SIZE 1024.#e
1380: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41 43  ndif..#ifdef CAC
1390: 4b 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64  KEY_DEBUG.#  ifd
13a0: 65 66 20 48 41 56 45 5f 54 49 4d 45 5f 48 0a 23  ef HAVE_TIME_H.#
13b0: 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d      include <tim
13c0: 65 2e 68 3e 0a 73 74 61 74 69 63 20 74 69 6d 65  e.h>.static time
13d0: 5f 74 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  _t cackey_debug_
13e0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 30 3b 0a  start_time = 0;.
13f0: 23 20 20 20 20 64 65 66 69 6e 65 20 43 41 43 4b  #    define CACK
1400: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49  EY_DEBUG_PRINTTI
1410: 4d 45 20 7b 20 69 66 20 28 63 61 63 6b 65 79 5f  ME { if (cackey_
1420: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
1430: 20 3d 3d 20 30 29 20 7b 20 63 61 63 6b 65 79 5f   == 0) { cackey_
1440: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
1450: 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 20 7d   = time(NULL); }
1460: 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ; fprintf(stderr
1470: 2c 20 22 5b 25 6c 75 5d 3a 20 22 2c 20 28 75 6e  , "[%lu]: ", (un
1480: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 74 69  signed long) (ti
1490: 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 63 6b 65  me(NULL) - cacke
14a0: 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69  y_debug_start_ti
14b0: 6d 65 29 29 3b 20 7d 0a 23 20 20 65 6c 73 65 0a  me)); }.#  else.
14c0: 23 20 20 20 20 64 65 66 69 6e 65 20 43 41 43 4b  #    define CACK
14d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49  EY_DEBUG_PRINTTI
14e0: 4d 45 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69 66  ME /**/.#  endif
14f0: 0a 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  ..#  define CACK
1500: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1510: 78 2e 2e 2e 29 20 7b 20 43 41 43 4b 45 59 5f 44  x...) { CACKEY_D
1520: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20  EBUG_PRINTTIME; 
1530: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1540: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66  "%s():%i: ", __f
1550: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
1560: 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ; fprintf(stderr
1570: 2c 20 78 29 3b 20 66 70 72 69 6e 74 66 28 73 74  , x); fprintf(st
1580: 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c  derr, "\n"); ffl
1590: 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23  ush(stderr); }.#
15a0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
15b0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66  DEBUG_PRINTBUF(f
15c0: 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67 6e  , x, y) { unsign
15d0: 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46 3b  ed char *TMPBUF;
15e0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
15f0: 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75 6e  dx; TMPBUF = (un
1600: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28  signed char *) (
1610: 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x); CACKEY_DEBUG
1620: 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72 69  _PRINTTIME; fpri
1630: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28  ntf(stderr, "%s(
1640: 29 3a 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c  ):%i: %s  (%s/%l
1650: 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75  u = {%02x", __fu
1660: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20  nc__, __LINE__, 
1670: 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64  f, #x, (unsigned
1680: 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42   long) (y), TMPB
1690: 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78  UF[0]); for (idx
16a0: 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b   = 1; idx < (y);
16b0: 20 69 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74   idx++) { fprint
16c0: 66 28 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32  f(stderr, ", %02
16d0: 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29  x", TMPBUF[idx])
16e0: 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64  ; }; fprintf(std
16f0: 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66 66  err, "})\n"); ff
1700: 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a  lush(stderr); }.
1710: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1720: 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29  _DEBUG_PERROR(x)
1730: 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72   { fprintf(stder
1740: 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20  r, "%s():%i: ", 
1750: 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45  __func__, __LINE
1760: 5f 5f 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55  __); CACKEY_DEBU
1770: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 70 65 72  G_PRINTTIME; per
1780: 72 6f 72 28 78 29 3b 20 66 66 6c 75 73 68 28 73  ror(x); fflush(s
1790: 74 64 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66  tderr); }.#  def
17a0: 69 6e 65 20 66 72 65 65 28 78 29 20 7b 20 43 41  ine free(x) { CA
17b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17c0: 46 28 22 46 52 45 45 28 25 70 29 20 28 25 73 29  F("FREE(%p) (%s)
17d0: 22 2c 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28  ", x, #x); free(
17e0: 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 76 6f  x); }..static vo
17f0: 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  id *CACKEY_DEBUG
1800: 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a  _FUNC_MALLOC(siz
1810: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
1820: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
1830: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
1840: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
1850: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a  = malloc(size);.
1860: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1870: 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 6e  RINTTIME;..fprin
1880: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
1890: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
18a0: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  ne);..fprintf(st
18b0: 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20  derr, "MALLOC() 
18c0: 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a  = %p", retval);.
18d0: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
18e0: 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28   "\n");..fflush(
18f0: 73 74 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72  stderr);...retur
1900: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
1910: 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45  atic void *CACKE
1920: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
1930: 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c 20  LLOC(void *ptr, 
1940: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e  size_t size, con
1950: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69  st char *func, i
1960: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64  nt line) {..void
1970: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
1980: 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72  al = realloc(ptr
1990: 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72  , size);...if (r
19a0: 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a  etval != ptr) {.
19b0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19c0: 52 49 4e 54 54 49 4d 45 3b 0a 09 09 66 70 72 69  RINTTIME;...fpri
19d0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28  ntf(stderr, "%s(
19e0: 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c  ):%i: ", func, l
19f0: 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  ine);...fprintf(
1a00: 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c 4f 43  stderr, "REALLOC
1a10: 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74 72 2c  (%p) = %p", ptr,
1a20: 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70 72 69   retval);...fpri
1a30: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
1a40: 29 3b 0a 09 09 66 66 6c 75 73 68 28 73 74 64 65  );...fflush(stde
1a50: 72 72 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  rr);..}...if (re
1a60: 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tval == NULL) {.
1a70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a80: 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f  RINTF(" *** ERRO
1a90: 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65  R *** realloc re
1aa0: 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a  turned NULL (siz
1ab0: 65 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  e = %lu)", (unsi
1ac0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29  gned long) size)
1ad0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
1ae0: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1af0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
1b00: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28  BUG_FUNC_STRDUP(
1b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c  const char *ptr,
1b20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e   const char *fun
1b30: 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09  c, int line) {..
1b40: 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  char *retval;...
1b50: 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28  retval = strdup(
1b60: 70 74 72 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ptr);...CACKEY_D
1b70: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 0a  EBUG_PRINTTIME;.
1b80: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
1b90: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75   "%s():%i: ", fu
1ba0: 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69  nc, line);..fpri
1bb0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 52  ntf(stderr, "STR
1bc0: 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  DUP_MALLOC() = %
1bd0: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70  p", retval);..fp
1be0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1bf0: 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 64  n");..fflush(std
1c00: 65 72 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  err);...return(r
1c10: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
1c20: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
1c30: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
1c40: 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67  TAG_TO_STR(unsig
1c50: 6e 65 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a  ned char tag) {.
1c60: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
1c70: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1c80: 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75  _CARDID:....retu
1c90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1ca0: 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  RDID");...case G
1cb0: 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52  SCIS_TAG_CCC_VER
1cc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1cd0: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29  IS_TAG_CCC_VER")
1ce0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1cf0: 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72  AG_CCG_VER:....r
1d00: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1d10: 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61  _CCG_VER");...ca
1d20: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
1d30: 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  DURL:....return(
1d40: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55  "GSCIS_TAG_CARDU
1d50: 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RL");...case GSC
1d60: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
1d70: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1d80: 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09  TAG_PKCS15");...
1d90: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52  case GSCIS_TAG_R
1da0: 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09  EG_DATA_MODEL:..
1db0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1dc0: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
1dd0: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  EL");...case GSC
1de0: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
1df0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1e00: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
1e10: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1e20: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a  _TAG_CARD_APDU:.
1e30: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e40: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29  _TAG_CARD_APDU")
1e50: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1e60: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a  AG_REDIRECTION:.
1e70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e80: 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e  _TAG_REDIRECTION
1e90: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1ea0: 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75  _TAG_CT:....retu
1eb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54  rn("GSCIS_TAG_CT
1ec0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1ed0: 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75  _TAG_ST:....retu
1ee0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54  rn("GSCIS_TAG_ST
1ef0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1f00: 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09  _TAG_NEXTCCC:...
1f10: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
1f20: 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09  AG_NEXTCCC");...
1f30: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46  case GSCIS_TAG_F
1f40: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NAME:....return(
1f50: 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45  "GSCIS_TAG_FNAME
1f60: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1f70: 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72  _TAG_MNAME:....r
1f80: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1f90: 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65  _MNAME");...case
1fa0: 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45   GSCIS_TAG_LNAME
1fb0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1fc0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a  IS_TAG_LNAME");.
1fd0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1fe0: 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75  _SUFFIX:....retu
1ff0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55  rn("GSCIS_TAG_SU
2000: 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47  FFIX");...case G
2010: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47  SCIS_TAG_GOVT_AG
2020: 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  ENCY:....return(
2030: 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f  "GSCIS_TAG_GOVT_
2040: 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65  AGENCY");...case
2050: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
2060: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
2070: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29  CIS_TAG_BUREAU")
2080: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2090: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a  AG_BUREAU_CODE:.
20a0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
20b0: 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45  _TAG_BUREAU_CODE
20c0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
20d0: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a  _TAG_DEPT_CODE:.
20e0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
20f0: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 29  _TAG_DEPT_CODE")
2100: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2110: 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74  AG_TITLE:....ret
2120: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54  urn("GSCIS_TAG_T
2130: 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47  ITLE");...case G
2140: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
2150: 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  G:....return("GS
2160: 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47  CIS_TAG_BUILDING
2170: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2180: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2190: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  1:....return("GS
21a0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
21b0: 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47  DDR1");...case G
21c0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
21d0: 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e  ADDR2:....return
21e0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
21f0: 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61  CE_ADDR2");...ca
2200: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2210: 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74  ICE_CITY:....ret
2220: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2230: 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09  FFICE_CITY");...
2240: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2250: 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09  FFICE_STATE:....
2260: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2270: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29  G_OFFICE_STATE")
2280: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2290: 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09  AG_OFFICE_ZIP:..
22a0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
22b0: 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29  TAG_OFFICE_ZIP")
22c0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
22d0: 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52  AG_OFFICE_COUNTR
22e0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
22f0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2300: 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65  OUNTRY");...case
2310: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2320: 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75  E_PHONE:....retu
2330: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2340: 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09  FICE_PHONE");...
2350: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2360: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a  FFICE_PHONE_EXT:
2370: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2380: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2390: 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65  NE_EXT");...case
23a0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
23b0: 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e  E_FAX:....return
23c0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
23d0: 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65  CE_FAX");...case
23e0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
23f0: 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75  E_EMAIL:....retu
2400: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2410: 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09  FICE_EMAIL");...
2420: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2430: 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72  FFICE_ROOM:....r
2440: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2450: 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a  _OFFICE_ROOM");.
2460: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2470: 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a  _NONGOV_AGENCY:.
2480: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2490: 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e  _TAG_NONGOV_AGEN
24a0: 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CY");...case GSC
24b0: 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47  IS_TAG_SSN_DESIG
24c0: 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e  NATOR:....return
24d0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  ("GSCIS_TAG_SSN_
24e0: 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09  DESIGNATOR");...
24f0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2500: 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  SN:....return("G
2510: 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a  SCIS_TAG_SSN");.
2520: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2530: 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28  _DOB:....return(
2540: 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29  "GSCIS_TAG_DOB")
2550: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2560: 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65  AG_GENDER:....re
2570: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2580: 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65  GENDER");...case
2590: 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49   GSCIS_TAG_USERI
25a0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
25b0: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29  CIS_TAG_USERID")
25c0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
25d0: 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65  AG_DOMAIN:....re
25e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
25f0: 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65  DOMAIN");...case
2600: 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57   GSCIS_TAG_PASSW
2610: 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ORD:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
2630: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RD");...case GSC
2640: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a  IS_TAG_ISSUERID:
2650: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2660: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 22 29  S_TAG_ISSUERID")
2670: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2680: 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74  AG_SERNO:....ret
2690: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
26a0: 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47  ERNO");...case G
26b0: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44  SCIS_TAG_ISSUE_D
26c0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
26d0: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f  GSCIS_TAG_ISSUE_
26e0: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
26f0: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f  SCIS_TAG_EXPIRE_
2700: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
2710: 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52  "GSCIS_TAG_EXPIR
2720: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
2730: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f   GSCIS_TAG_CARD_
2740: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
2750: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f  "GSCIS_TAG_CARD_
2760: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47  TYPE");...case G
2770: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54  SCIS_TAG_SECURIT
2780: 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  Y_CODE:....retur
2790: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43  n("GSCIS_TAG_SEC
27a0: 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09  URITY_CODE");...
27b0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
27c0: 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65  ARDID_AID:....re
27d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
27e0: 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09  CARDID_AID");...
27f0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2800: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72  ERTIFICATE:....r
2810: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2820: 5f 43 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a  _CERTIFICATE");.
2830: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2840: 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45  _CERT_ISSUE_DATE
2850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2860: 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55  IS_TAG_CERT_ISSU
2870: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
2880: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
2890: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
28a0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
28b0: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
28c0: 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  TE");..}...retur
28d0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
28e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
28f0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
2900: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
2910: 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f  O_STR(LONG retco
2920: 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72  de) {..switch (r
2930: 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65  etcode) {...case
2940: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
2950: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2960: 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a  RD_S_SUCCESS");.
2970: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43  ..case SCARD_E_C
2980: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
2990: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
29a0: 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65  CELLED");...case
29b0: 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49   SCARD_E_CANT_DI
29c0: 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e  SPOSE:....return
29d0: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44  ("SCARD_E_CANT_D
29e0: 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65  ISPOSE");...case
29f0: 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49   SCARD_E_INSUFFI
2a00: 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09  CIENT_BUFFER:...
2a10: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2a20: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
2a30: 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  FFER");...case S
2a40: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
2a50: 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  TR:....return("S
2a60: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
2a70: 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  TR");...case SCA
2a80: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
2a90: 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DLE:....return("
2aa0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2ab0: 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65  HANDLE");...case
2ac0: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
2ad0: 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72  _PARAMETER:....r
2ae0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
2af0: 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52  NVALID_PARAMETER
2b00: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2b10: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
2b20: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
2b30: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
2b40: 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53  RGET");...case S
2b50: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56  CARD_E_INVALID_V
2b60: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
2b70: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
2b80: 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65  _VALUE");...case
2b90: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f   SCARD_E_NO_MEMO
2ba0: 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RY:....return("S
2bb0: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59  CARD_E_NO_MEMORY
2bc0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2bd0: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
2be0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
2bf0: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
2c00: 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  ADER");...case S
2c10: 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a  CARD_E_TIMEOUT:.
2c20: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2c30: 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09  _E_TIMEOUT");...
2c40: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41  case SCARD_E_SHA
2c50: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a  RING_VIOLATION:.
2c60: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2c70: 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  _E_SHARING_VIOLA
2c80: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53  TION");...case S
2c90: 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43  CARD_E_NO_SMARTC
2ca0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
2cb0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54  SCARD_E_NO_SMART
2cc0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
2cd0: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43  CARD_E_UNKNOWN_C
2ce0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
2cf0: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
2d00: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
2d10: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
2d20: 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e  MATCH:....return
2d30: 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  ("SCARD_E_PROTO_
2d40: 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61  MISMATCH");...ca
2d50: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52  se SCARD_E_NOT_R
2d60: 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  EADY:....return(
2d70: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41  "SCARD_E_NOT_REA
2d80: 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  DY");...case SCA
2d90: 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43  RD_E_SYSTEM_CANC
2da0: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
2db0: 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  ("SCARD_E_SYSTEM
2dc0: 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09  _CANCELLED");...
2dd0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54  case SCARD_E_NOT
2de0: 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09  _TRANSACTED:....
2df0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2e00: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29  NOT_TRANSACTED")
2e10: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2e20: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
2e30: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
2e40: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
2e50: 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09  NAVAILABLE");...
2e60: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53  case SCARD_W_UNS
2e70: 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09  UPPORTED_CARD:..
2e80: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2e90: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
2ea0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
2eb0: 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56  RD_W_UNRESPONSIV
2ec0: 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  E_CARD:....retur
2ed0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53  n("SCARD_W_UNRES
2ee0: 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a  PONSIVE_CARD");.
2ef0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55  ..case SCARD_W_U
2f00: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09  NPOWERED_CARD:..
2f10: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2f20: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
2f30: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2f40: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09  _W_RESET_CARD:..
2f50: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2f60: 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a  W_RESET_CARD");.
2f70: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52  ..case SCARD_W_R
2f80: 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09  EMOVED_CARD:....
2f90: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
2fa0: 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a  REMOVED_CARD");.
2fb0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50  ..case SCARD_E_P
2fc0: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09  CI_TOO_SMALL:...
2fd0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2fe0: 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  _PCI_TOO_SMALL")
2ff0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3000: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
3010: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
3020: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3030: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
3040: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50  case SCARD_E_DUP
3050: 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09  LICATE_READER:..
3060: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3070: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
3080: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
3090: 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50  RD_E_CARD_UNSUPP
30a0: 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ORTED:....return
30b0: 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  ("SCARD_E_CARD_U
30c0: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
30d0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
30e0: 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75  SERVICE:....retu
30f0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  rn("SCARD_E_NO_S
3100: 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65  ERVICE");...case
3110: 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45   SCARD_E_SERVICE
3120: 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74  _STOPPED:....ret
3130: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52  urn("SCARD_E_SER
3140: 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a  VICE_STOPPED");.
3150: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
3160: 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55  NSUPPORTED_FEATU
3170: 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RE:....return("S
3180: 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54  CARD_E_UNSUPPORT
3190: 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a 23 69  ED_FEATURE");.#i
31a0: 66 64 65 66 20 53 43 41 52 44 5f 57 5f 49 4e 53  fdef SCARD_W_INS
31b0: 45 52 54 45 44 5f 43 41 52 44 0a 09 09 63 61 73  ERTED_CARD...cas
31c0: 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  e SCARD_W_INSERT
31d0: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
31e0: 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45  rn("SCARD_W_INSE
31f0: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e  RTED_CARD");.#en
3200: 64 69 66 0a 23 69 66 64 65 66 20 53 43 41 52 44  dif.#ifdef SCARD
3210: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3220: 41 49 4c 41 42 4c 45 0a 09 09 63 61 73 65 20 53  AILABLE...case S
3230: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52  CARD_E_NO_READER
3240: 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09  S_AVAILABLE:....
3250: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3260: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3270: 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09  ABLE");.#endif..
3280: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3290: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
32a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
32b0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
32c0: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74  BJID_TO_STR(uint
32d0: 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73  16_t objid) {..s
32e0: 77 69 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a  witch (objid) {.
32f0: 09 09 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09  ..case 0x2000:..
3300: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3310: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
3320: 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65  ALINFO");...case
3330: 20 30 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75   0x2100:....retu
3340: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3350: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c  BJID_PROPERSONAL
3360: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3370: 78 33 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x3000:....return
3380: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3390: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c  ID_ACCESSCONTROL
33a0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30  ");...case 0x400
33b0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
33c0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c  CKEY_TLV_OBJID_L
33d0: 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  OGIN");...case 0
33e0: 78 35 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x5000:....return
33f0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3400: 49 44 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09  ID_CARDINFO");..
3410: 09 63 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09  .case 0x6000:...
3420: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3430: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54  TLV_OBJID_BIOMET
3440: 52 49 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30  RICS");...case 0
3450: 78 37 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x7000:....return
3460: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3470: 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52  ID_DIGITALSIGCER
3480: 54 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  T");...case 0x02
3490: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
34a0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
34b0: 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09  CAC_PERSON");...
34c0: 63 61 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09  case 0x0202:....
34d0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
34e0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e  LV_OBJID_CAC_BEN
34f0: 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  EFITS");...case 
3500: 30 78 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72  0x0203:....retur
3510: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3520: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
3530: 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  EFITS");...case 
3540: 30 78 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72  0x0201:....retur
3550: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3560: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
3570: 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  L");...case 0x02
3580: 46 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  FE:....return("C
3590: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
35a0: 43 41 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09  CAC_PKICERT");..
35b0: 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  }....return("UNK
35c0: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  NOWN");.}..stati
35d0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
35e0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
35f0: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75  APPTYPE_TO_STR(u
3600: 69 6e 74 38 5f 74 20 61 70 70 74 79 70 65 29 20  int8_t apptype) 
3610: 7b 0a 09 73 77 69 74 63 68 20 28 61 70 70 74 79  {..switch (appty
3620: 70 65 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30  pe) {...case 0x0
3630: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f  0:....return("NO
3640: 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  NE");...case 0x0
3650: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  1:....return("CA
3660: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
3670: 45 52 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30  ERIC");...case 0
3680: 78 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x02:....return("
3690: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
36a0: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
36b0: 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  3:....return("CA
36c0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
36d0: 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c  ERIC | CACKEY_TL
36e0: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63  V_APP_SKI");...c
36f0: 61 73 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74  ase 0x04:....ret
3700: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3710: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
3720: 65 20 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72  e 0x05:....retur
3730: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3740: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3750: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
3760: 3b 0a 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09  ;...case 0x06:..
3770: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3780: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43  _TLV_APP_SKI | C
3790: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
37a0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37  I");...case 0x07
37b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
37c0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
37d0: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
37e0: 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45  _APP_SKI | CACKE
37f0: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b  Y_TLV_APP_PKI");
3800: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e  ..}...return("IN
3810: 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 23 20 20 64  VALID");.}..#  d
3820: 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20  efine malloc(x) 
3830: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3840: 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75  C_MALLOC(x, __fu
3850: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a  nc__, __LINE__).
3860: 23 20 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f  #  define reallo
3870: 63 28 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44  c(x, y) CACKEY_D
3880: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
3890: 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f  C(x, y, __func__
38a0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69  , __LINE__).#  i
38b0: 66 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 20  fdef strdup.#   
38c0: 20 75 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20   undef strdup.# 
38d0: 20 65 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65   endif.#  define
38e0: 20 73 74 72 64 75 70 28 78 29 20 43 41 43 4b 45   strdup(x) CACKE
38f0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52  Y_DEBUG_FUNC_STR
3900: 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c  DUP(x, __func__,
3910: 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65   __LINE__).#else
3920: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
3930: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78  Y_DEBUG_PRINTF(x
3940: 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66  ...) /**/.#  def
3950: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
3960: 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20  _PRINTBUF(f, x, 
3970: 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  y) /**/.#  defin
3980: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
3990: 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20  ERROR(x) /**/.# 
39a0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
39b0: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
39c0: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
39d0: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
39e0: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
39f0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
3a00: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
3a10: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
3a20: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
3a30: 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
3a40: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
3a50: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
3a60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3a70: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
3a80: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
3a90: 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72  LED".#endif..str
3aa0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
3ab0: 69 64 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69  identity {..unsi
3ac0: 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74  gned char applet
3ad0: 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66  [7];..uint16_t f
3ae0: 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65  ile;...size_t ce
3af0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
3b00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
3b10: 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73  ertificate;...ss
3b20: 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 7d  ize_t keysize;.}
3b30: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
3b40: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72  _identity {..str
3b50: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
3b60: 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
3b70: 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54  dentity;...CK_AT
3b80: 54 52 49 42 55 54 45 20 2a 61 74 74 72 69 62 75  TRIBUTE *attribu
3b90: 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61  tes;..CK_ULONG a
3ba0: 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
3bb0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
3bc0: 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e  ey_session {..in
3bd0: 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53  t active;...CK_S
3be0: 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a  LOT_ID slotID;..
3bf0: 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b  .CK_STATE state;
3c00: 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  ..CK_FLAGS flags
3c10: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65  ;..CK_ULONG ulDe
3c20: 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56  viceError;..CK_V
3c30: 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61  OID_PTR pApplica
3c40: 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59  tion;..CK_NOTIFY
3c50: 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63   Notify;...struc
3c60: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
3c70: 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  y *identities;..
3c80: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
3c90: 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a  entities_count;.
3ca0: 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74  ..int search_act
3cb0: 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  ive;..CK_ATTRIBU
3cc0: 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75  TE_PTR search_qu
3cd0: 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73  ery;..CK_ULONG s
3ce0: 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
3cf0: 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  t;..unsigned lon
3d00: 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  g search_curr_id
3d10: 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74  ;...int sign_act
3d20: 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49  ive;..CK_MECHANI
3d30: 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63  SM_TYPE sign_mec
3d40: 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45  hanism;..CK_BYTE
3d50: 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09  _PTR sign_buf;..
3d60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
3d70: 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69  gn_buflen;..unsi
3d80: 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62  gned long sign_b
3d90: 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20  ufused;..struct 
3da0: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
3db0: 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a  *sign_identity;.
3dc0: 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63  ..int decrypt_ac
3dd0: 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e  tive;..CK_MECHAN
3de0: 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74  ISM_TYPE decrypt
3df0: 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f  _mechanism;..CK_
3e00: 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70 74  VOID_PTR decrypt
3e10: 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f  _mech_parm;..CK_
3e20: 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65  ULONG decrypt_me
3e30: 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72  ch_parmlen;..str
3e40: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
3e50: 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65  ity *decrypt_ide
3e60: 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63  ntity;.};..struc
3e70: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a  t cackey_slot {.
3e80: 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63  .int active;...c
3e90: 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72  har *pcsc_reader
3ea0: 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72  ;...int pcsc_car
3eb0: 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43  d_connected;..SC
3ec0: 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63  ARDHANDLE pcsc_c
3ed0: 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73  ard;...int trans
3ee0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09 69  action_depth;..i
3ef0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  nt transaction_n
3f00: 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69  eed_hw_lock;...i
3f10: 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a  nt slot_reset;..
3f20: 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f  .CK_FLAGS token_
3f30: 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65  flags;...unsigne
3f40: 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a  d char *label;..
3f50: 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b  .DWORD protocol;
3f60: 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .};..typedef enu
3f70: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
3f80: 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78  APP_GENERIC = 0x
3f90: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
3fa0: 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78  APP_SKI     = 0x
3fb0: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
3fc0: 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78  APP_PKI     = 0x
3fd0: 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f  04.} cackey_tlv_
3fe0: 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65  apptype;..typede
3ff0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
4000: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
4010: 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30  ALINFO       = 0
4020: 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2000,..CACKEY_T
4030: 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53  LV_OBJID_PROPERS
4040: 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32  ONALINFO   = 0x2
4050: 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  100,..CACKEY_TLV
4060: 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e  _OBJID_ACCESSCON
4070: 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30  TROL     = 0x300
4080: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
4090: 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20  BJID_LOGIN      
40a0: 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c         = 0x4000,
40b0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
40c0: 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20  ID_CARDINFO     
40d0: 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09       = 0x5000,..
40e0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
40f0: 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20  _BIOMETRICS     
4100: 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41     = 0x6000,..CA
4110: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44  CKEY_TLV_OBJID_D
4120: 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20 20  IGITALSIGCERT   
4130: 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b   = 0x7000,..CACK
4140: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
4150: 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d  _PERSON        =
4160: 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59   0x0200,..CACKEY
4170: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42  _TLV_OBJID_CAC_B
4180: 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20 30  ENEFITS      = 0
4190: 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54  x0202,..CACKEY_T
41a0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
41b0: 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30  ERBENEFITS = 0x0
41c0: 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  203,..CACKEY_TLV
41d0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
41e0: 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30  NNEL     = 0x020
41f0: 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  1,..CACKEY_TLV_O
4200: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
4210: 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a         = 0x02FE.
4220: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  } cackey_tlv_obj
4230: 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20  ectid;..typedef 
4240: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50  enum {..CACKEY_P
4250: 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
4260: 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b  NT    = 1,..CACK
4270: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
4280: 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a 09            = 0,..
4290: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
42a0: 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d 20  NERIC         = 
42b0: 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -1,..CACKEY_PCSC
42c0: 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20 20  _E_BADPIN       
42d0: 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59     = -2,..CACKEY
42e0: 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20  _PCSC_E_LOCKED  
42f0: 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09 43          = -3,..C
4300: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
4310: 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d 20 2d  DLOGIN       = -
4320: 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  4,..CACKEY_PCSC_
4330: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 20  E_TOKENABSENT   
4340: 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59 5f    = -6,..CACKEY_
4350: 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20 20  PCSC_E_RETRY    
4360: 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63 61         = -7.} ca
4370: 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63  ckey_ret;..struc
4380: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
4390: 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64  durl {..unsigned
43a0: 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69 64   char        rid
43b0: 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  [5];..cackey_tlv
43c0: 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74 79  _apptype   appty
43d0: 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  pe;..cackey_tlv_
43e0: 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74  objectid  object
43f0: 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  id;..cackey_tlv_
4400: 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b  objectid  appid;
4410: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
4420: 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b         pinid;.};
4430: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
4440: 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75  tlv_entity;.stru
4450: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
4460: 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20  tity {..uint8_t 
4470: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
4480: 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09  gth;...union {..
4490: 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09  .void *value;...
44a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
44b0: 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65  v_cardurl *value
44c0: 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74  _cardurl;...uint
44d0: 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a  8_t value_byte;.
44e0: 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  .};...struct cac
44f0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
4500: 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41  _next;.};../* CA
4510: 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64  CKEY Global Hand
4520: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  les */.static vo
4530: 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f  id *cackey_biglo
4540: 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69  ck = NULL;.stati
4550: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
4560: 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73  session cackey_s
4570: 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74  essions[128];.st
4580: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
4590: 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73  ey_slot cackey_s
45a0: 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69  lots[128];.stati
45b0: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69  c int cackey_ini
45c0: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74  tialized = 0;.st
45d0: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
45e0: 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30  biglock_init = 0
45f0: 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a  ;.CK_C_INITIALIZ
4600: 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72  E_ARGS cackey_ar
4610: 67 73 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f  gs;../* PCSC Glo
4620: 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73  bal Handles */.s
4630: 74 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e  tatic LPSCARDCON
4640: 54 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63  TEXT cackey_pcsc
4650: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
4660: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
4670: 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74   long cackey_get
4680: 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a  version(void) {.
4690: 09 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
46a0: 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32   long retval = 2
46b0: 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  55;..unsigned lo
46c0: 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75  ng major = 0;..u
46d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e  nsigned long min
46e0: 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d  or = 0;..char *m
46f0: 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  ajor_str = NULL;
4700: 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74  ..char *minor_st
4710: 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b  r = NULL;...CACK
4720: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4730: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
4740: 20 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29   (retval != 255)
4750: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
4760: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
4770: 69 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65  ing 0x%lx (cache
4780: 64 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  d).", retval);..
4790: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
47a0: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
47b0: 30 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41  0;..#ifdef PACKA
47c0: 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20  GE_VERSION.     
47d0: 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50     major_str = P
47e0: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a  ACKAGE_VERSION;.
47f0: 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20  .if (major_str) 
4800: 7b 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  {..        major
4810: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72   = strtoul(major
4820: 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72  _str, &minor_str
4830: 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69  , 10);....if (mi
4840: 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69  nor_str) {....mi
4850: 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69  nor = strtoul(mi
4860: 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c  nor_str + 1, NUL
4870: 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  L, 10);...}..}..
4880: 09 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72  .retval = (major
4890: 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72   << 16) | (minor
48a0: 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a   << 8);.#endif..
48b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
48c0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
48d0: 30 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b  0x%lx", retval);
48e0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
48f0: 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52  );.}../* PC/SC R
4900: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
4910: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
4920: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
4930: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
4940: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29  onnect_all(void)
4950: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
4960: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
4970: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
4980: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
4990: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
49a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
49b0: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61  sconnects from a
49c0: 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f  ll cards.. *. */
49d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
49e0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
49f0: 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b  nect_all(void) {
4a00: 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a  ..uint32_t idx;.
4a10: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4a20: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
4a30: 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
4a40: 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
4a50: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
4a60: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
4a70: 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
4a80: 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
4a90: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
4aa0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
4ab0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
4ac0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44  G_PRINTF("SCardD
4ad0: 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63  isconnect(%lu) c
4ae0: 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65  alled", (unsigne
4af0: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09  d long) idx);...
4b00: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
4b10: 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  t(cackey_slots[i
4b20: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53  dx].pcsc_card, S
4b30: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
4b40: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
4b50: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
4b60: 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28  abel) {....free(
4b70: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
4b80: 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61  ].label);.....ca
4b90: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
4ba0: 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
4bb0: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
4bc0: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
4bd0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
4be0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
4bf0: 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
4c00: 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
4c10: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
4c20: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
4c30: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09  hw_lock = 0;....
4c40: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
4c50: 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
4c60: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4c70: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
4c80: 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20  active slot %lu 
4c90: 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c  as being reset",
4ca0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
4cb0: 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61   idx);...}....ca
4cc0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
4cd0: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
4ce0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
4cf0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
4d00: 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ing");...return;
4d10: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
4d20: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
4d30: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
4d40: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  _connect(void);.
4d50: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
4d60: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
4d70: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
4d80: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
4d90: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
4da0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
4db0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
4dc0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
4dd0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
4de0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
4df0: 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20  ion connects to 
4e00: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
4e10: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64  tion Manager and
4e20: 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20   updates the. * 
4e30: 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c      global handl
4e40: 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  e.. *. */.static
4e50: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
4e60: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
4e70: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
4e80: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4e90: 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45  ret;.#ifdef HAVE
4ea0: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
4eb0: 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64  TEXT..LONG scard
4ec0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65  _isvalid_ret;.#e
4ed0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
4ee0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
4ef0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
4f00: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
4f10: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  == NULL) {...cac
4f20: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
4f30: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
4f40: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
4f50: 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63  dle));...if (cac
4f60: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
4f70: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41  == NULL) {....CA
4f80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4f90: 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f  F("Call to mallo
4fa0: 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  c() failed, retu
4fb0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
4fc0: 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
4fd0: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
4fe0: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
4ff0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
5000: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
5010: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5020: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62  INTF("SCardEstab
5030: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61  lishContext() ca
5040: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f  lled");...scard_
5050: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
5060: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  = SCardEstablish
5070: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43  Context(SCARD_SC
5080: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c  OPE_SYSTEM, NULL
5090: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70  , NULL, cackey_p
50a0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69  csc_handle);...i
50b0: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  f (scard_est_con
50c0: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
50d0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
50e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
50f0: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53  RINTF("Call to S
5100: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
5110: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74  text failed (ret
5120: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72  urned %s/%li), r
5130: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
5140: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ure", CACKEY_DEB
5150: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
5160: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73  _TO_STR(scard_es
5170: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20  t_context_ret), 
5180: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74  (long) scard_est
5190: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
51a0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
51b0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09  csc_handle);....
51c0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
51d0: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  le = NULL;.....c
51e0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
51f0: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
5200: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5210: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
5220: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
5230: 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49  HAVE_SCARDISVALI
5240: 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59  DCONTEXT..CACKEY
5250: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
5260: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
5270: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
5280: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
5290: 74 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64  t = SCardIsValid
52a0: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
52b0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69  pcsc_handle);..i
52c0: 66 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  f (scard_isvalid
52d0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
52e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
52f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5300: 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63  ("Handle has bec
5310: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61  ome invalid (SCa
5320: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
5330: 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69   = %s/%li), tryi
5340: 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69  ng to re-establi
5350: 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  sh...", CACKEY_D
5360: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
5370: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
5380: 69 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c  isvalid_ret), (l
5390: 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c  ong) scard_isval
53a0: 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b  id_ret);....CACK
53b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
53c0: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
53d0: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
53e0: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
53f0: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
5400: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
5410: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
5420: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
5430: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
5440: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
5450: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
5460: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
5470: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
5480: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5490: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
54a0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
54b0: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
54c0: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
54d0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
54e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
54f0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
5500: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
5510: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
5520: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
5530: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
5540: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
5550: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
5560: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
5570: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
5580: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
5590: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
55a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
55b0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
55c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
55d0: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
55e0: 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62  as been re-estab
55f0: 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e  lished");..}.#en
5600: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
5610: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
5620: 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64  sfully connected
5630: 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72   to PC/SC, retur
5640: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22  ning in success"
5650: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
5660: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
5670: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
5680: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
5690: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  et cackey_pcsc_d
56a0: 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  isconnect(void);
56b0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
56c0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
56d0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
56e0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
56f0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5700: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
5710: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
5720: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
5730: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
5740: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
5750: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
5760: 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20   from the PC/SC 
5770: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  Connection manag
5780: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20  er and updates. 
5790: 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c  *     the global
57a0: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
57b0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
57c0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
57d0: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  sconnect(void) {
57e0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c  ..LONG scard_rel
57f0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09  _context_ret;...
5800: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5810: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
5820: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
5830: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
5840: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
5850: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
5860: 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63  .}...scard_rel_c
5870: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
5880: 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74  rdReleaseContext
5890: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
58a0: 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63  ndle);...if (cac
58b0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
58c0: 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
58d0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
58e0: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
58f0: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  andle = NULL;..}
5900: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c  ...if (scard_rel
5910: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
5920: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
5930: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
5940: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5950: 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  C);..}...return(
5960: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
5970: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
5980: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
5990: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
59a0: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
59b0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
59c0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
59d0: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
59e0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
59f0: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
5a00: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
5a10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
5a20: 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20  arks a slot has 
5a30: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
5a40: 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63  t, to later be c
5a50: 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20  leaned up.. *   
5a60: 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68    Cleanup only h
5a70: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b  appens when a PK
5a80: 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c  CS#11 client cal
5a90: 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  ls C_FindObjects
5aa0: 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  Init.. *. */.sta
5ab0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
5ac0: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
5ad0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5ae0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20  ot *slot) {..if 
5af0: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
5b00: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
5b10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5b20: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
5b30: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63  ..if (slot->pcsc
5b40: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
5b50: 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e   {...SCardDiscon
5b60: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
5b70: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
5b80: 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c  E_CARD);..}...sl
5b90: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ot->slot_reset =
5ba0: 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f   1;..slot->pcsc_
5bb0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
5bc0: 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   0;..slot->token
5bd0: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
5be0: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 43  IN_REQUIRED;...C
5bf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5c00: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 2e 22 29  TF("Returning.")
5c10: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
5c20: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
5c30: 20 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79       LONG cackey
5c40: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
5c50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5c60: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20  ot *slot, DWORD 
5c70: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
5c80: 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74  , LPDWORD select
5c90: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a  ed_protocol);. *
5ca0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
5cb0: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
5cc0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
5cd0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
5ce0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
5cf0: 20 20 20 20 20 44 57 4f 52 44 20 64 65 66 61 75       DWORD defau
5d00: 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20  lt_protocol. *  
5d10: 20 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20         Protocol 
5d20: 74 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73 74  to attempt first
5d30: 0a 20 2a 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f  . *. *     LPDWO
5d40: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
5d50: 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  ocol. *         
5d60: 5b 4f 55 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73  [OUT] Protocol s
5d70: 65 6c 65 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45  elected. *. * RE
5d80: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
5d90: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
5da0: 75 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63  ue from SCardRec
5db0: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e  onnect(). *. * N
5dc0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
5dd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
5de0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43  rapper around SC
5df0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20  ardReconnect(). 
5e00: 2a 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43 61  *. *     The SCa
5e10: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75  rdReconnect() fu
5e20: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c  nction call will
5e30: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
5e40: 20 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20   with the. *    
5e50: 20 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74   dwPreferredProt
5e60: 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c  ocols of "defaul
5e70: 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66  t_protocol".  If
5e80: 20 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72   that call retur
5e90: 6e 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f  ns. *     SCARD_
5ea0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
5eb0: 20 74 72 79 20 61 67 61 69 6e 20 77 69 74 68 20   try again with 
5ec0: 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d  a protocol of T=
5ed0: 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20  0, and failing. 
5ee0: 2a 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a  *     that T=1..
5ef0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f   *. */.static LO
5f00: 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e  NG cackey_reconn
5f10: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
5f20: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
5f30: 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74  t, DWORD default
5f40: 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f  _protocol, LPDWO
5f50: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
5f60: 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  ocol) {..LONG sc
5f70: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
5f80: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
5f90: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
5fa0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
5fb0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
5fc0: 52 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f  RED, default_pro
5fd0: 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53  tocol, SCARD_RES
5fe0: 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65  ET_CARD, selecte
5ff0: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69  d_protocol);...i
6000: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
6010: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
6020: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
6030: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6040: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e  INTF("SCardRecon
6050: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
6060: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
6070: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
6080: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
6090: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
60a0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
60b0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
60c0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
60d0: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
60e0: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52  OCOL_T0, SCARD_R
60f0: 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63  ESET_CARD, selec
6100: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  ted_protocol);..
6110: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
6120: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
6130: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
6140: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
6150: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52  G_PRINTF("SCardR
6160: 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  econnect() retur
6170: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
6180: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
6190: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31  ng with just T=1
61a0: 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ")....scard_conn
61b0: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f  _ret = SCardReco
61c0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
61d0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41  _card, SCARD_SHA
61e0: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
61f0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43  _PROTOCOL_T1, SC
6200: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
6210: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
6220: 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  l);...}..}...ret
6230: 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  urn(scard_conn_r
6240: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
6250: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
6260: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6270: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
6280: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
6290: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
62a0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
62b0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
62c0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
62d0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
62e0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
62f0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
6300: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
6310: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
6320: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
6330: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
6340: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
6350: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
6360: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
6370: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
6380: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
6390: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
63a0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
63b0: 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
63c0: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
63d0: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e  D protocol;..LON
63e0: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
63f0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
6400: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
6410: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29  ");...if (!slot)
6420: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
6430: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
6440: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64  d slot specified
6450: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
6460: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
6470: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6480: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
6490: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
64a0: 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
64b0: 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
64c0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
64d0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
64e0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
64f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6500: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
6510: 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  SC failed, retur
6520: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6530: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
6540: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6550: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e  IC);..}.../* Con
6560: 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20  nect to reader, 
6570: 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66  if needed */..if
6580: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
6590: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
65a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
65b0: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
65c0: 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c  ect(%s) called",
65d0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
65e0: 65 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e  er);...scard_con
65f0: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
6600: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
6610: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
6620: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
6630: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
6640: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
6650: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
6660: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
6670: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
6680: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
6690: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
66a0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
66b0: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
66c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
66d0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
66e0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
66f0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
6700: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
6710: 74 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64  t T=0")....scard
6720: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
6730: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
6740: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
6750: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
6760: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
6770: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
6780: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
6790: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
67a0: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
67b0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
67c0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
67d0: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
67e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
67f0: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
6800: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
6810: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
6820: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
6830: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63  ust T=1").....sc
6840: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
6850: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
6860: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
6870: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
6880: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
6890: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
68a0: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
68b0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
68c0: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09  otocol);....}...
68d0: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
68e0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
68f0: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
6900: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
6910: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
6920: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
6930: 72 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50  rned SCARD_W_UNP
6940: 4f 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79  OWERED_CARD, try
6950: 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63  ing to re-connec
6960: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  t...");.....scar
6970: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
6980: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
6990: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
69a0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
69b0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49  , SCARD_SHARE_DI
69c0: 52 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54  RECT, SCARD_PROT
69d0: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
69e0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
69f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
6a00: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
6a10: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
6a20: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
6a30: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
6a40: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6a50: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
6a60: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
6a70: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
6a80: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
6a90: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
6aa0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
6ab0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
6ac0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
6ad0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
6ae0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
6af0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
6b00: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
6b10: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
6b20: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
6b30: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
6b40: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
6b50: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
6b60: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
6b70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
6b80: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
6b90: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
6ba0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
6bb0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
6bc0: 31 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63  1")......scard_c
6bd0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
6be0: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
6bf0: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
6c00: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
6c10: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
6c20: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
6c30: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
6c40: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
6c50: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  l);.....}....}..
6c60: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
6c70: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
6c80: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
6c90: 70 72 6f 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f  protocol, &proto
6ca0: 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  col);...}....if 
6cb0: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
6cc0: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6cd0: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
6ce0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
6cf0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64  nnection to card
6d00: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
6d10: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53  ng in failure (S
6d20: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20  CardConnect() = 
6d30: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
6d40: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
6d50: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
6d60: 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f  d_conn_ret), (lo
6d70: 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ng) scard_conn_r
6d80: 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
6d90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6da0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73  NERIC);...}....s
6db0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
6dc0: 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09  onnected = 1;...
6dd0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
6de0: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73  n_depth = 0;...s
6df0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
6e00: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
6e10: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  0;...slot->proto
6e20: 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
6e30: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
6e40: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
6e50: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
6e60: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
6e70: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
6e80: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
6e90: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
6ea0: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
6eb0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
6ec0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
6ed0: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
6ee0: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
6ef0: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
6f00: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
6f10: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
6f20: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
6f30: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6f40: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6f50: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6f60: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6f70: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68  e transaction sh
6f80: 6f 75 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74  ould be terminat
6f90: 65 64 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79  ed using "cackey
6fa0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
6fb0: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ". *. */.static 
6fc0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
6fd0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
6fe0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
6ff0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
7000: 09 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b  .cackey_ret cack
7010: 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f  ey_conn_ret;..LO
7020: 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  NG scard_trans_r
7030: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
7040: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
7050: 64 2e 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63  d.");...cackey_c
7060: 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  onn_ret = cackey
7070: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
7080: 6f 74 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79  ot);..if (cackey
7090: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43  _conn_ret != CAC
70a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
70b0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
70c0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
70d0: 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
70e0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
70f0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
7100: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
7110: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
7120: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7130: 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20  n_depth++;...if 
7140: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
7150: 6f 6e 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20  on_depth > 1 && 
7160: 21 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  !slot->transacti
7170: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29  on_need_hw_lock)
7180: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7190: 47 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64  G_PRINTF("Alread
71a0: 79 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  y in a transacti
71b0: 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e  on, performing n
71c0: 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65  o action (new de
71d0: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
71e0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
71f0: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
7200: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7210: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
7220: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
7230: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63  w_lock = 0;...sc
7240: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20  ard_trans_ret = 
7250: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61  SCardBeginTransa
7260: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
7270: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61  _card);..if (sca
7280: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20  rd_trans_ret != 
7290: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
72a0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
72b0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
72c0: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61   to begin transa
72d0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
72e0: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
72f0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7300: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7310: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
7320: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
7330: 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73  ully began trans
7340: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
7350: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
7360: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
7370: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
7380: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
7390: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
73a0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
73b0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
73c0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
73d0: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
73e0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
73f0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
7400: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
7410: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
7420: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
7430: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
7440: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
7450: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
7460: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
7470: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7480: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
7490: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
74a0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
74b0: 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65   requires "cacke
74c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
74d0: 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65  ion" to be calle
74e0: 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73  d first. *. */.s
74f0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
7500: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
7510: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
7520: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7530: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
7540: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
7550: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7560: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
7570: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  f (!slot->pcsc_c
7580: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
7590: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
75a0: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
75b0: 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75  not connected, u
75c0: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
75d0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64  nsaction on card
75e0: 22 29 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d  ");....if (slot-
75f0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
7600: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43  th > 0) {....CAC
7610: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7620: 28 22 44 65 63 72 65 61 73 69 6e 67 20 74 72 61  ("Decreasing tra
7630: 6e 73 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61  nsaction depth a
7640: 6e 64 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20  nd asking for a 
7650: 68 61 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e  hardware lock on
7660: 20 74 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20   the next begin 
7670: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72  transaction (cur
7680: 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29  rent depth = %i)
7690: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
76a0: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
76b0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
76c0: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09  on_depth--;.....
76d0: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
76e0: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
76f0: 20 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61   {.....slot->tra
7700: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
7710: 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a  _lock = 1;....}.
7720: 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ..}....return(CA
7730: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7740: 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  RIC);..}...if (s
7750: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
7760: 5f 64 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09  _depth == 0) {..
7770: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7780: 49 4e 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e  INTF("Terminatin
7790: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
77a0: 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67  that has not beg
77b0: 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  un!");....return
77c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
77d0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c  ENERIC);..}...sl
77e0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
77f0: 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73  depth--;...if (s
7800: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
7810: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
7820: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7830: 4e 54 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e  NTF("Transaction
7840: 73 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72  s still in progr
7850: 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61  ess, not termina
7860: 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61  ting on-card Tra
7870: 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e  nsaction (curren
7880: 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  t depth = %i)", 
7890: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
78a0: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74  n_depth);....ret
78b0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
78c0: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  S_OK);..}...scar
78d0: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
78e0: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  ardEndTransactio
78f0: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
7900: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
7910: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ARD);..if (scard
7920: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
7930: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
7940: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7950: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
7960: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
7970: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
7980: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
7990: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
79a0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
79b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
79c0: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
79d0: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e   terminated tran
79e0: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
79f0: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
7a00: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
7a10: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
7a20: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44  S_OK);.}../* APD
7a30: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  U Related Functi
7a40: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
7a50: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
7a60: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
7a70: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
7a80: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7a90: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
7aa0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
7ab0: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
7ac0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
7ad0: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
7ae0: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
7af0: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
7b00: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
7b10: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
7b20: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
7b30: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
7b40: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
7b50: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
7b60: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
7b70: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
7b80: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
7b90: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
7ba0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
7bb0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
7bc0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20  ned char class. 
7bd0: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43  *         APDU C
7be0: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53  lass (GSCIS_CLAS
7bf0: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43  S_ISO7816 or GSC
7c00: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
7c10: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20  PLATFORM. *     
7c20: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43      usually), (C
7c30: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  LA). *. *     un
7c40: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
7c50: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20  ruction. *      
7c60: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74     APDU Instruct
7c70: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20  ion (INS). *. * 
7c80: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7c90: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20  r p1. *         
7ca0: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31  APDU Parameter 1
7cb0: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P1). *. *     
7cc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
7cd0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
7ce0: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32   Parameter 2 (P2
7cf0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
7d00: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20  gned char lc. * 
7d10: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
7d20: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28  gth of Content (
7d30: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Lc) -- this is t
7d40: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61  he length of "da
7d50: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70  ta". *         p
7d60: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64  arameter.  If "d
7d70: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65  ata" is specifie
7d80: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
7d90: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20  parameter will. 
7da0: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e  *         be ign
7db0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
7dc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
7dd0: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50  ata. *         P
7de0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
7df0: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68   to send.  It sh
7e00: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74  ould be "Lc" byt
7e10: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20  es long.  If. * 
7e20: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
7e30: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20  d as NULL, "Lc" 
7e40: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74  will not be sent
7e50: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65  , and this buffe
7e60: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20  r will be. *    
7e70: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a       ignored.. *
7e80: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
7e90: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20   char le. *     
7ea0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
7eb0: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28  of Expectation (
7ec0: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Le) -- this is t
7ed0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
7ee0: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65  . *         expe
7ef0: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20  cted reply.  If 
7f00: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
7f10: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77  d as 0 then it w
7f20: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20  ill not. *      
7f30: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20     be sent.. *. 
7f40: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a  *     uint16_t *
7f50: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20  respcode. *     
7f60: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
7f70: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
7f80: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f  APDU response co
7f90: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  de.  If this is.
7fa0: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
7fb0: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
7fc0: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20  e response code 
7fd0: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
7fe0: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
7ff0: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
8000: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
8010: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
8020: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
8030: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20   response data. 
8040: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
8050: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
8060: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
8070: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c  sponse data will
8080: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
8090: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  If. *         th
80a0: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22  e "respdata_len"
80b0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70   parameter is sp
80c0: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
80d0: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20   this buffer. * 
80e0: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74          will not
80f0: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a   be updated.. *.
8100: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72   *     size_t *r
8110: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20  espdata_len. *  
8120: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d         [IN, OUT]
8130: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c   Pointer initial
8140: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
8150: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
8160: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20  respdata". *    
8170: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65       buffer.  Be
8180: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
8190: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76  the pointed to v
81a0: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20  alue is updated 
81b0: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  to the. *       
81c0: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
81d0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
81e0: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69   buffer.  If thi
81f0: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
8200: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c  s. *         NUL
8210: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  L, it will not b
8220: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22  e updated, and "
8230: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62  respdata" will b
8240: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e  e ignored causin
8250: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  g. *         the
8260: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74   response data t
8270: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  o be discarded..
8280: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
8290: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
82a0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
82b0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
82c0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
82d0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
82e0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20    On error. *   
82f0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
8300: 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20  TOKENABSENT  If 
8310: 74 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c  the sending fail
8320: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20 74  ed because the t
8330: 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20  oken is. *      
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 20 20 20 61 62 73 65 6e 74            absent
8360: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
8370: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
8380: 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  n will connect t
8390: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  o the PC/SC Conn
83a0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76  ection Manager v
83b0: 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  ia. *     cackey
83c0: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20  _pcsc_connect() 
83d0: 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a  if needed.. *. *
83e0: 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e       It will con
83f0: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64  nect to the card
8400: 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 20 61   in the reader a
8410: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73  ttached to the s
8420: 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69  lot. *     speci
8430: 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72  fied.  It will r
8440: 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20  econnect to the 
8450: 63 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e  card if the conn
8460: 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f  ection. *     go
8470: 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a  es away.. *. */.
8480: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
8490: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
84a0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
84b0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
84c0: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
84d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
84e0: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
84f0: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
8500: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
8510: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
8520: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
8530: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
8540: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
8550: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
8560: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
8570: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
8580: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
8590: 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63  uint8_t major_rc
85a0: 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a  , minor_rc;..siz
85b0: 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  e_t bytes_to_cop
85c0: 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  y, tmp_respdata_
85d0: 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49  len;..LPCSCARD_I
85e0: 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e  O_REQUEST pioSen
85f0: 64 50 63 69 3b 0a 09 44 57 4f 52 44 20 70 72 6f  dPci;..DWORD pro
8600: 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d  tocol;..DWORD xm
8610: 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e  it_len, recv_len
8620: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d  ;..LONG scard_xm
8630: 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65  it_ret, scard_re
8640: 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20  conn_ret;..BYTE 
8650: 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20  xmit_buf[1024], 
8660: 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a  recv_buf[1024];.
8670: 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  .int pcsc_connec
8680: 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74 72  t_ret, pcsc_getr
8690: 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64  esp_ret;..int id
86a0: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
86b0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
86c0: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
86d0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
86e0: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
86f0: 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65  id slot specifie
8700: 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
8710: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8720: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
8730: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
8740: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
8750: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
8760: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
8770: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
8780: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
8790: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
87a0: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
87b0: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
87c0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
87d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
87e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
87f0: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  C);..}.../* Dete
8800: 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72 6f 74  rmine which prot
8810: 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73 69  ocol to send usi
8820: 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 73  ng */..switch (s
8830: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b  lot->protocol) {
8840: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52  ...case SCARD_PR
8850: 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 70 69  OTOCOL_T0:....pi
8860: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
8870: 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65  _PCI_T0;.....bre
8880: 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ak;...case SCARD
8890: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09  _PROTOCOL_T1:...
88a0: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
88b0: 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09  ARD_PCI_T1;.....
88c0: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
88d0: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
88e0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
88f0: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
8900: 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a  , aborting.");..
8910: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8920: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
8930: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d  ;..}.../* Transm
8940: 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20  it */..xmit_len 
8950: 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  = 0;..xmit_buf[x
8960: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61  mit_len++] = cla
8970: 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ss;..xmit_buf[xm
8980: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74  it_len++] = inst
8990: 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62  ruction;..xmit_b
89a0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
89b0: 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78   p1;..xmit_buf[x
89c0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b  mit_len++] = p2;
89d0: 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09  ..if (data) {...
89e0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
89f0: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f 72  n++] = lc;...for
8a00: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
8a10: 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09   lc; idx++) {...
8a20: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
8a30: 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78  en++] = data[idx
8a40: 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  ];...}..}...if (
8a50: 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  le != 0x00) {...
8a60: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
8a70: 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09  n++] = le;..}...
8a80: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
8a90: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
8aa0: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
8ab0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
8ac0: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d  );...if (class =
8ad0: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
8ae0: 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63  O7816 && instruc
8af0: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
8b00: 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31  STR_VERIFY && p1
8b10: 20 3d 3d 20 30 78 30 30 20 26 26 20 70 32 20 3d   == 0x00 && p2 =
8b20: 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43 4b  = 0x00) {...CACK
8b30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8b40: 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c  "Sending APDU: <
8b50: 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09  <censored>>");..
8b60: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
8b70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
8b80: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22  ("Sending APDU:"
8b90: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
8ba0: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76  _len);..}...recv
8bb0: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65  _len = sizeof(re
8bc0: 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64 5f  cv_buf);..scard_
8bd0: 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64  xmit_ret = SCard
8be0: 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70  Transmit(slot->p
8bf0: 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e  csc_card, pioSen
8c00: 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20  dPci, xmit_buf, 
8c10: 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20  xmit_len, NULL, 
8c20: 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f  recv_buf, &recv_
8c30: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63 61 72  len);...if (scar
8c40: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
8c50: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
8c60: 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  CTED) {...CACKEY
8c70: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
8c80: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
8c90: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
8ca0: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
8cb0: 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20  /%lx), will ask 
8cc0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
8cd0: 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 20 72   to retry (not r
8ce0: 65 73 65 74 74 69 6e 67 20 63 61 72 64 29 2e 2e  esetting card)..
8cf0: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
8d00: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
8d10: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
8d20: 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64  _ret), (unsigned
8d30: 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69   long) scard_xmi
8d40: 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 42 65  t_ret);..../* Be
8d50: 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72  gin Smartcard Tr
8d60: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
8d70: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
8d80: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
8d90: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8da0: 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a  SC_E_RETRY);..}.
8db0: 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
8dc0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
8dd0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
8de0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8df0: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
8e00: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
8e10: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
8e20: 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45   %s/%lx)", CACKE
8e30: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
8e40: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
8e50: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
8e60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
8e70: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
8e80: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8e90: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 73  RINTF("Marking s
8ea0: 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62 65  lot as having be
8eb0: 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 63 61  en reset");...ca
8ec0: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
8ed0: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69  eset(slot);....i
8ee0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
8ef0: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
8f00: 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
8f10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8f20: 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
8f30: 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
8f40: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
8f50: 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
8f60: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
8f70: 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
8f80: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
8f90: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
8fa0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
8fb0: 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  f (scard_reconn_
8fc0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
8fd0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a  UCCESS) {...../*
8fe0: 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c   Update protocol
8ff0: 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72   */.....slot->pr
9000: 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f  otocol = protoco
9010: 6c 3b 0a 09 09 09 09 73 77 69 74 63 68 20 28 73  l;.....switch (s
9020: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b  lot->protocol) {
9030: 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44  ......case SCARD
9040: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09  _PROTOCOL_T0:...
9050: 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
9060: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a   SCARD_PCI_T0;..
9070: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
9080: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
9090: 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09  TOCOL_T1:.......
90a0: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
90b0: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09  RD_PCI_T1;......
90c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65  ..break;......de
90d0: 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43  fault:.......CAC
90e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
90f0: 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63  ("Invalid protoc
9100: 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f  ol found, but to
9110: 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79  o late to do any
9120: 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e  thing about it n
9130: 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79  ow -- trying any
9140: 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62  way.");........b
9150: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
9160: 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68  ./* Re-establish
9170: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
9180: 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20   it was present 
9190: 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d  */.....if (slot-
91a0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
91b0: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  th > 0) {......s
91c0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
91d0: 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73  _depth--;......s
91e0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
91f0: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
9200: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62  1;......cackey_b
9210: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
9220: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  (slot);.....}...
9230: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9240: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75  PRINTF("Reset su
9250: 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e  ccessful, retran
9260: 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09  smitting");.....
9270: 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65  .recv_len = size
9280: 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09  of(recv_buf);...
9290: 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
92a0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
92b0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
92c0: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d  , pioSendPci, xm
92d0: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
92e0: 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66  , NULL, recv_buf
92f0: 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  , &recv_len);...
9300: 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ...if (scard_xmi
9310: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
9320: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
9330: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9340: 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74  INTF("Retransmit
9350: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
9360: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66  ng in failure af
9370: 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e  ter disconnectin
9380: 67 20 74 68 65 20 63 61 72 64 20 28 53 43 61 72  g the card (SCar
9390: 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25  dTransmit = %s/%
93a0: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
93b0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
93c0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d  _TO_STR(scard_xm
93d0: 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  it_ret), (long) 
93e0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
93f0: 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 73 63  .......SCardDisc
9400: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
9410: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
9420: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09  AVE_CARD);......
9430: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
9440: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
9450: 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
9460: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
9470: 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  n */......slot->
9480: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
9490: 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b  h = 1;......cack
94a0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
94b0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09  on(slot);.......
94c0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
94d0: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
94e0: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  );.....}....} el
94f0: 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  se {.....CACKEY_
9500: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69  DEBUG_PRINTF("Di
9510: 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64  sconnecting card
9520: 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69  ");......SCardDi
9530: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
9540: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
9550: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
9560: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
9570: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
9580: 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
9590: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
95a0: 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  n */.....slot->t
95b0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
95c0: 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79   = 1;.....cackey
95d0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
95e0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43  (slot);......CAC
95f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9600: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  ("Returning in f
9610: 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65  ailure");.....re
9620: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9630: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
9640: 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
9650: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9660: 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e  _PRINTF("Disconn
9670: 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a  ecting card");..
9680: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
9690: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
96a0: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
96b0: 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e  CARD);....slot->
96c0: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
96d0: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20  ted = 0;...../* 
96e0: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
96f0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
9700: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9710: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
9720: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
9730: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
9740: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9750: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
9760: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09   in failure");..
9770: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9780: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
9790: 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  NT);...}..}...CA
97a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
97b0: 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61  BUF("Returned Va
97c0: 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c  lue:", recv_buf,
97d0: 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66   recv_len);...if
97e0: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20   (recv_len < 2) 
97f0: 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72  {.../* Minimal r
9800: 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69  esponse length i
9810: 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72  s 2 bytes, retur
9820: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
9830: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
9840: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
9850: 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  se too small, re
9860: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
9870: 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25  re (recv_len = %
9880: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
9890: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
98a0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
98b0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
98c0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
98d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
98e0: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  t);....return(CA
98f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
9900: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RIC);..}.../* De
9910: 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63  termine result c
9920: 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63  ode */..major_rc
9930: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
9940: 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f  _len - 2];..mino
9950: 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b  r_rc = recv_buf[
9960: 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09  recv_len - 1];..
9970: 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a  if (respcode) {.
9980: 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d  ..*respcode = (m
9990: 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20  ajor_rc << 8) | 
99a0: 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f  minor_rc;..}.../
99b0: 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65  * Adjust message
99c0: 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76   buffer */..recv
99d0: 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20  _len -= 2;.../* 
99e0: 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74  Add bytes to ret
99f0: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d  urn value */..tm
9a00: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  p_respdata_len =
9a10: 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74   0;..if (respdat
9a20: 61 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65  a && respdata_le
9a30: 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64  n) {...tmp_respd
9a40: 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64  ata_len = *respd
9a50: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65  ata_len;....byte
9a60: 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73  s_to_copy = *res
9a70: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66  pdata_len;....if
9a80: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74   (recv_len < byt
9a90: 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
9aa0: 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
9ab0: 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a   recv_len;...}..
9ac0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9ad0: 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25  RINTF("Copying %
9ae0: 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20  lu bytes to the 
9af0: 62 75 66 66 65 72 20 28 72 65 63 76 27 64 20 25  buffer (recv'd %
9b00: 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e  lu bytes, but on
9b10: 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66  ly %lu bytes lef
9b20: 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29  t in our buffer)
9b30: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
9b40: 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  g) bytes_to_copy
9b50: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
9b60: 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73  ) recv_len, (uns
9b70: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73  igned long) *res
9b80: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d  pdata_len);....m
9b90: 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20  emcpy(respdata, 
9ba0: 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f  recv_buf, bytes_
9bb0: 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70  to_copy);...resp
9bc0: 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f  data += bytes_to
9bd0: 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64  _copy;....*respd
9be0: 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f  ata_len = bytes_
9bf0: 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72  to_copy;...tmp_r
9c00: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62  espdata_len -= b
9c10: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d  ytes_to_copy;..}
9c20: 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65   else {...if (re
9c30: 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09  cv_len != 0) {..
9c40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9c50: 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20  RINTF("Throwing 
9c60: 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20  away %lu bytes, 
9c70: 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74  nowhere to put t
9c80: 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64  hem!", (unsigned
9c90: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29   long) recv_len)
9ca0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d  ;...}..}...if (m
9cb0: 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29  ajor_rc == 0x61)
9cc0: 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20   {.../* We need 
9cd0: 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43  to READ */...CAC
9ce0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9cf0: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65  ("Buffer read re
9d00: 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20  quired");....if 
9d10: 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30  (minor_rc == 0x0
9d20: 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63  0) {....minor_rc
9d30: 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
9d40: 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f  TU;...}....pcsc_
9d50: 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61  getresp_ret = ca
9d60: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
9d70: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
9d80: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
9d90: 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e  INSTR_GET_RESPON
9da0: 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  SE, 0x00, 0x00, 
9db0: 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72  0, NULL, minor_r
9dc0: 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73  c, respcode, res
9dd0: 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70  pdata, &tmp_resp
9de0: 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  data_len);....if
9df0: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
9e00: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
9e10: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
9e20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9e30: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 66 61  ("Buffer read fa
9e40: 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67  iled!  Returning
9e50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
9e60: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
9e70: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
9e80: 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
9e90: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
9ea0: 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63  t);.....if (pcsc
9eb0: 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20  _getresp_ret == 
9ec0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
9ed0: 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72  TRY) {.....retur
9ee0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
9ef0: 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09  RETRY);....}....
9f00: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9f10: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
9f20: 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64  ..}....if (respd
9f30: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72  ata_len) {....*r
9f40: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74  espdata_len += t
9f50: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
9f60: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53  ...}..../* End S
9f70: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
9f80: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
9f90: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
9fa0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45  (slot);....CACKE
9fb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9fc0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
9fd0: 63 65 73 73 20 28 62 75 66 66 65 72 20 72 65 61  cess (buffer rea
9fe0: 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09  d complete)");..
9ff0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
a000: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
a010: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
a020: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
a030: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
a040: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
a050: 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d  .if (major_rc ==
a060: 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75   0x90) {.../* Su
a070: 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45  ccess */...CACKE
a080: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a090: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
a0a0: 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d  cess (major_rc =
a0b0: 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74   0x90)");....ret
a0c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
a0d0: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43  S_OK);..}....CAC
a0e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a0f0: 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 64 20  ("APDU Returned 
a100: 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  an error, return
a110: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
a120: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
a130: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
a140: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
a150: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
a160: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  e_t cackey_read_
a170: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61  buffer(struct ca
a180: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
a190: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a1a0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63  buffer, size_t c
a1b0: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  ount, unsigned c
a1c0: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65  har t_or_v, size
a1d0: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
a1e0: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
a1f0: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
a200: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
a210: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
a220: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
a230: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
a240: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a250: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20  *buffer. *      
a260: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a     [OUT] Buffer.
a270: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
a280: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20   count. *       
a290: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
a2a0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
a2b0: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
a2c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
a2d0: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53  r_v. *         S
a2e0: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66  elect the T-buff
a2f0: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66  er (01) or V-buf
a300: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64  fer (02) to read
a310: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20   from.  . *. *  
a320: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61     size_t initia
a330: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20  l_offset. *     
a340: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20      Specify the 
a350: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20  offset to begin 
a360: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a  the read from. *
a370: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
a380: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
a390: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a3a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
a3b0: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
a3c0: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
a3d0: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
a3e0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
a3f0: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
a400: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  t cackey_read_bu
a410: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b  ffer(struct cack
a420: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
a430: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
a440: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75  ffer, size_t cou
a450: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nt, unsigned cha
a460: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74  r t_or_v, size_t
a470: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29   initial_offset)
a480: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
a490: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a  r *init_buffer;.
a4a0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75  .size_t init_cou
a4b0: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  nt;..size_t init
a4c0: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b  _initial_offset;
a4d0: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  ...size_t offset
a4e0: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74   = 0, max_offset
a4f0: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e  , max_count;..un
a500: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
a510: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  2];..uint16_t re
a520: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e  spcode;..int sen
a530: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
a540: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
a550: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f  lled.");...init_
a560: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b  buffer = buffer;
a570: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63  ..init_count = c
a580: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74  ount;..init_init
a590: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69  ial_offset = ini
a5a0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d  tial_offset;...m
a5b0: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e  ax_offset = coun
a5c0: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  t;..max_count = 
a5d0: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
a5e0: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d  ...if (t_or_v !=
a5f0: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20   1 && t_or_v != 
a600: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
a610: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
a620: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d  lid T or V param
a630: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20  eter specified, 
a640: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
a650: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
a660: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b  n(-1);..}...cmd[
a670: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77  0] = t_or_v;...w
a680: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20  hile (1) {...if 
a690: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f  (offset >= max_o
a6a0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  ffset) {....CACK
a6b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a6c0: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c  "Buffer too smal
a6d0: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61  l, returning wha
a6e0: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a  t we got...");..
a6f0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
a700: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66  .count = max_off
a710: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09  set - offset;...
a720: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  if (count > max_
a730: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e  count) {....coun
a740: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  t = max_count;..
a750: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63  .}....cmd[1] = c
a760: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  ount;....send_re
a770: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
a780: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
a790: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
a7a0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
a7b0: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c  STR_READ_BUFFER,
a7c0: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65   ((initial_offse
a7d0: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38  t + offset) >> 8
a7e0: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69  ) & 0xff, (initi
a7f0: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
a800: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65  et) & 0xff, size
a810: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78  of(cmd), cmd, 0x
a820: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62  00, &respcode, b
a830: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20  uffer + offset, 
a840: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28  &count);....if (
a850: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
a860: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
a870: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
a880: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
a890: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
a8a0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
a8b0: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75  ffer");.....retu
a8c0: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  rn(cackey_read_b
a8d0: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74  uffer(slot, init
a8e0: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f  _buffer, init_co
a8f0: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69  unt, t_or_v, ini
a900: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
a910: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ));...}....if (s
a920: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
a930: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
a940: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
a950: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09  = 0x6A86) {.....
a960: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d  if (max_count ==
a970: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   1) {......break
a980: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78  ;.....}......max
a990: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  _count = max_cou
a9a0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e  nt / 2;......con
a9b0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
a9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a9d0: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64  NTF("cackey_send
a9e0: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20  _apdu() failed, 
a9f0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
aa00: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  lure");.....retu
aa10: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f  rn(-1);...}....o
aa20: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a  ffset += count;.
aa30: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d  ...if (count < m
aa40: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ax_count) {....C
aa50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
aa60: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d  TF("Short read -
aa70: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d  - count = %i, cm
aa80: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74  d[1] = %i", (int
aa90: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  ) count, (int) c
aaa0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61  md[1]);.....brea
aab0: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  k;...}..}..#ifde
aac0: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
aad0: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
aae0: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
aaf0: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58  (offset > _POSIX
ab00: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
ab10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ab20: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65  NTF("Offset exce
ab30: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
ab40: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
ab50: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
ab60: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c  %li, offset = %l
ab70: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
ab80: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
ab90: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
aba0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  fset);....return
abb0: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
abc0: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  f.#endif...CACKE
abd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
abe0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
abf0: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
ac00: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
ac10: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
ac20: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29  ..return(offset)
ac30: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
ac40: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
ac50: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
ac60: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
ac70: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
ac80: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
ac90: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
aca0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  aid_len);. *. * 
acb0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
acc0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
acd0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
ace0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
acf0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
ad00: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
ad10: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20   char *aid. *   
ad20: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e        Buffer con
ad30: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49  taining Applet I
ad40: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  D to select. *. 
ad50: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64  *     size_t aid
ad60: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
ad70: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
ad80: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70  in the "aid" (Ap
ad90: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74  plet ID) paramet
ada0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  er. *. * RETURN 
adb0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
adc0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
add0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
ade0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
adf0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
ae00: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
ae10: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
ae20: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
ae30: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
ae40: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
ae50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
ae60: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
ae70: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
ae80: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a  ze_t aid_len) {.
ae90: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
aea0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
aeb0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
aec0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aed0: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74  PRINTBUF("Select
aee0: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69  ing applet:", ai
aef0: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73  d, aid_len);...s
af00: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
af10: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
af20: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
af30: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
af40: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f  R_SELECT, GSCIS_
af50: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
af60: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c  LET, 0x00, aid_l
af70: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e  en, aid, 0x00, N
af80: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
af90: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
afa0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
afb0: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43  E_RETRY) {...CAC
afc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
afd0: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
afe0: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
aff0: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b  select applet");
b000: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
b010: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
b020: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c  slot, aid, aid_l
b030: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  en));..}...if (s
b040: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
b050: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
b060: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b070: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
b080: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
b090: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b0a0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
b0b0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
b0c0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
b0d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b0e0: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
b0f0: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
b100: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b110: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
b120: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
b130: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
b140: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
b150: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
b160: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
b170: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20  16_t ef);. *. * 
b180: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
b190: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
b1a0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
b1b0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
b1c0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
b1d0: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
b1e0: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45   ef. *         E
b1f0: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f  lemental File to
b200: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45   select. *. * RE
b210: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
b220: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
b230: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
b240: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
b250: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
b260: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
b270: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
b280: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61    This selects a
b290: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c  n Elementary Fil
b2a0: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65  e (EF) under the
b2b0: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63   currently selec
b2c0: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63  ted. *     Dedic
b2d0: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20  ated File (DF). 
b2e0: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c  *. *     Typical
b2f0: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  ly this is calle
b300: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e  d after selectin
b310: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70  g the correct Ap
b320: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20  plet (using. *  
b330: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74     cackey_select
b340: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20  _applet) for VM 
b350: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61  cards. *. */.sta
b360: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
b370: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
b380: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
b390: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
b3a0: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69  16_t ef) {..unsi
b3b0: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75  gned char fid_bu
b3c0: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  f[2];..int send_
b3d0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
b3e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
b3f0: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ed.");.../* Open
b400: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20   the elementary 
b410: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66  file */..fid_buf
b420: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20  [0] = (ef >> 8) 
b430: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66  & 0xff;..fid_buf
b440: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b  [1] = ef & 0xff;
b450: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b460: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
b470: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20  g file: %04lx", 
b480: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b490: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  ef);...send_ret 
b4a0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
b4b0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
b4c0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
b4d0: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
b4e0: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69  , 0x02, 0x0C, si
b4f0: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66  zeof(fid_buf), f
b500: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55  id_buf, 0x00, NU
b510: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
b520: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
b530: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
b540: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
b550: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
b560: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
b570: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
b580: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
b590: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b5a0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
b5b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b5c0: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
b5d0: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
b5e0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
b5f0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
b600: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
b610: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
b620: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
b630: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
b640: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20  entity *root);. 
b650: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
b660: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
b670: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
b680: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  root. *         
b690: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20  Root of the TLV 
b6a0: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72  list to start fr
b6b0: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55  eeing. *. * RETU
b6c0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
b6d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
b6e0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
b6f0: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20  ction frees the 
b700: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65  TLV linked liste
b710: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a  d returned from.
b720: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72   *     "cackey_r
b730: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a  ead_tlv". *. */.
b740: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
b750: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
b760: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
b770: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73  tity *root) {..s
b780: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
b790: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a  _entity *curr, *
b7a0: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74  next;...if (root
b7b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
b7c0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
b7d0: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72  curr = root; cur
b7e0: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20  r; curr = next) 
b7f0: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d  {...next = curr-
b800: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63  >_next;....switc
b810: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a  h (curr->tag) {.
b820: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
b830: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
b840: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
b850: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
b860: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29  if (curr->value)
b870: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
b880: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d  r->value);.....}
b890: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
b8a0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
b8b0: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63  RDURL:.....if (c
b8c0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
b8d0: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  rl) {......free(
b8e0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
b8f0: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  url);.....}.....
b900: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72  break;...}....fr
b910: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72  ee(curr);..}...r
b920: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
b930: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
b940: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
b950: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
b960: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
b970: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
b980: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
b990: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
b9a0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
b9b0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b  tlv_entity *cack
b9c0: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75  ey_read_tlv(stru
b9d0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
b9e0: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  slot) {..struct 
b9f0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
ba00: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20  y *curr_entity, 
ba10: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  *root = NULL, *l
ba20: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73  ast = NULL;..uns
ba30: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f  igned char tlen_
ba40: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66  buf[2], tval_buf
ba50: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09  [1024], *tval;..
ba60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c  unsigned char vl
ba70: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f  en_buf[2], vval_
ba80: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c  buf[8192], *vval
ba90: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
baa0: 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67   *tmpbuf;..unsig
bab0: 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c  ned long tmpbufl
bac0: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65  en;..ssize_t tle
bad0: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  n, vlen;..ssize_
bae0: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
baf0: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30  e_t offset_t = 0
bb00: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a  , offset_v = 0;.
bb10: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
bb20: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
bb30: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  th;.#ifdef HAVE_
bb40: 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70  LIBZ..int uncomp
bb50: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66  ress_ret;.#endif
bb60: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bb70: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
bb80: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  );...read_ret = 
bb90: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
bba0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75  er(slot, tlen_bu
bbb0: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62  f, sizeof(tlen_b
bbc0: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  uf), 1, offset_t
bbd0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
bbe0: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f   != sizeof(tlen_
bbf0: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
bc00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
bc10: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
bc20: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
bc30: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
bc40: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d  LL);..}...tlen =
bc50: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (tlen_buf[1] <<
bc60: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30   8) | tlen_buf[0
bc70: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  ];...read_ret = 
bc80: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
bc90: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75  er(slot, vlen_bu
bca0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62  f, sizeof(vlen_b
bcb0: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  uf), 2, offset_v
bcc0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
bcd0: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f   != sizeof(vlen_
bce0: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
bcf0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
bd00: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
bd10: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
bd20: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
bd30: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d  LL);..}...vlen =
bd40: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (vlen_buf[1] <<
bd50: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30   8) | vlen_buf[0
bd60: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ];...CACKEY_DEBU
bd70: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65  G_PRINTF("Tag Le
bd80: 6e 67 74 68 20 3d 20 25 69 2c 20 56 61 6c 75 65  ngth = %i, Value
bd90: 20 4c 65 6e 67 74 68 20 3d 20 25 69 22 2c 20 74   Length = %i", t
bda0: 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66  len, vlen);...of
bdb0: 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66  fset_t += 2;..of
bdc0: 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69  fset_v += 2;...i
bdd0: 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (tlen > sizeof
bde0: 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (tval_buf)) {...
bdf0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
be00: 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20  NTF("Tag length 
be10: 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65  is too large, re
be20: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
be30: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
be40: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
be50: 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76  vlen > sizeof(vv
be60: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  al_buf)) {...CAC
be70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
be80: 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69  ("Value length i
be90: 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74  s too large, ret
bea0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
beb0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
bec0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  ULL);..}...read_
bed0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
bee0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74  d_buffer(slot, t
bef0: 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31  val_buf, tlen, 1
bf00: 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66  , offset_t);..if
bf10: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c   (read_ret != tl
bf20: 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
bf30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
bf40: 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69  ble to read enti
bf50: 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74  re T-buffer, ret
bf60: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bf70: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
bf80: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  ULL);..}...read_
bf90: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
bfa0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76  d_buffer(slot, v
bfb0: 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32  val_buf, vlen, 2
bfc0: 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66  , offset_v);..if
bfd0: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c   (read_ret != vl
bfe0: 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
bff0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
c000: 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69  ble to read enti
c010: 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74  re V-buffer, ret
c020: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
c030: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
c040: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20  ULL);..}...tval 
c050: 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61  = tval_buf;..vva
c060: 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77  l = vval_buf;..w
c070: 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26  hile (tlen > 0 &
c080: 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09  & vlen > 0) {...
c090: 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74  tag = *tval;...t
c0a0: 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b  val++;...tlen--;
c0b0: 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d  ....if (*tval ==
c0c0: 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67   0xff) {....leng
c0d0: 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c  th = (tval[2] <<
c0e0: 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09   8) | tval[1];..
c0f0: 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09  ..tval += 3;....
c100: 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65  tlen -= 3;...} e
c110: 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20  lse {....length 
c120: 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c  = *tval;....tval
c130: 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09  ++;....tlen--;..
c140: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
c150: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20  UG_PRINTF("Tag: 
c160: 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b  %s (%02x)", CACK
c170: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
c180: 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28  G_TO_STR(tag), (
c190: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61  unsigned int) ta
c1a0: 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  g);...CACKEY_DEB
c1b0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c  UG_PRINTBUF("Val
c1c0: 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  ue:", vval, leng
c1d0: 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74  th);....curr_ent
c1e0: 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77  ity = NULL;...sw
c1f0: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09  itch (tag) {....
c200: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
c210: 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72  ARDURL:.....curr
c220: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
c230: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
c240: 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72  tity));.....curr
c250: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
c260: 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28  ardurl = malloc(
c270: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
c280: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
c290: 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  rl));......memcp
c2a0: 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  y(curr_entity->v
c2b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
c2c0: 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09  d, vval, 5);....
c2d0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
c2e0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
c2f0: 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a  type = vval[5];.
c300: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
c310: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
c320: 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c  objectid = (vval
c330: 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [6] << 8) | vval
c340: 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [7];.....curr_en
c350: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
c360: 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76  url->appid = (vv
c370: 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[8] << 8) | vv
c380: 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72  al[9];......curr
c390: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
c3a0: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
c3b0: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
c3c0: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
c3d0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
c3e0: 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09  _ACR_TABLE:.....
c3f0: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
c400: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
c410: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  r_entity));.....
c420: 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
c430: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65  length);......me
c440: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
c450: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  l, length);.....
c460: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
c470: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
c480: 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68  r_entity->length
c490: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63   = length;.....c
c4a0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
c4b0: 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  e = tmpbuf;.....
c4c0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65  curr_entity->_ne
c4d0: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  xt = NULL;......
c4e0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
c4f0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
c500: 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  CATE:.....curr_e
c510: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
c520: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
c530: 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41  ty));..#ifdef HA
c540: 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62  VE_LIBZ.....tmpb
c550: 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a  uflen = length *
c560: 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d   2;.....tmpbuf =
c570: 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
c580: 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72  n);......uncompr
c590: 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70  ess_ret = uncomp
c5a0: 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d  ress(tmpbuf, &tm
c5b0: 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c  pbuflen, vval, l
c5c0: 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28  ength);.....if (
c5d0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21  uncompress_ret !
c5e0: 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43  = Z_OK) {......C
c5f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c600: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65  TF("Failed to de
c610: 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70  compress, uncomp
c620: 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20  ress() returned 
c630: 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20  %i -- resorting 
c640: 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c  to direct copy",
c650: 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29   uncompress_ret)
c660: 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65  ;.......tmpbufle
c670: 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  n = length;.....
c680: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
c690: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09  vval, length);..
c6a0: 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
c6b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
c6c0: 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f  "Decompressed to
c6d0: 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62  :", tmpbuf, tmpb
c6e0: 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09  uflen);.#else...
c6f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c700: 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a  RINTF("Missing Z
c710: 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69  LIB Support, thi
c720: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  s certificate is
c730: 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e   likely useless.
c740: 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75  ..");......tmpbu
c750: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
c760: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
c770: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
c780: 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72  .#endif......cur
c790: 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20  r_entity->tag = 
c7a0: 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  tag;.....curr_en
c7b0: 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74  tity->length = t
c7c0: 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75  mpbuflen;.....cu
c7d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
c7e0: 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63   = tmpbuf;.....c
c7f0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
c800: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
c810: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
c820: 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a  CIS_TAG_PKCS15:.
c830: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
c840: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
c850: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
c860: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
c870: 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09  ->tag = tag;....
c880: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
c890: 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b  lue_byte = vval[
c8a0: 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  0];.....curr_ent
c8b0: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
c8c0: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
c8d0: 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65  .}....vval += le
c8e0: 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20  ngth;...vlen -= 
c8f0: 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63  length;....if (c
c900: 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55  urr_entity != NU
c910: 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f  LL) {....if (roo
c920: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t == NULL) {....
c930: 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74  .root = curr_ent
c940: 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ity;....}.....if
c950: 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20   (last != NULL) 
c960: 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78  {.....last->_nex
c970: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
c980: 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d  ....}.....last =
c990: 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
c9a0: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f  }..}...return(ro
c9b0: 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ot);.}../*. * SY
c9c0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
c9d0: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
c9e0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
c9f0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
ca00: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ca10: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
ca20: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
ca30: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
ca40: 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61  _certs(struct ca
ca50: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
ca60: 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f  ty *start, size_
ca70: 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65  t count, int fre
ca80: 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65  e_start) {..size
ca90: 5f 74 20 69 64 78 3b 0a 0a 09 66 6f 72 20 28 69  _t idx;...for (i
caa0: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f  dx = 0; idx < co
cab0: 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
cac0: 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63  if (start[idx].c
cad0: 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09  ertificate) {...
cae0: 09 66 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d  .free(start[idx]
caf0: 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09  .certificate);..
cb00: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65  .}..}...if (free
cb10: 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65  _start) {...free
cb20: 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65  (start);..}...re
cb30: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  turn;.}../*. * S
cb40: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
cb50: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
cb60: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
cb70: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
cb80: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
cb90: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
cba0: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
cbb0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
cbc0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
cbd0: 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
cbe0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
cbf0: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
cc00: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
cc10: 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e  ntity *certs, un
cc20: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75  signed long *cou
cc30: 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nt) {..struct ca
cc40: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
cc50: 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74  ty *curr_id;..st
cc60: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
cc70: 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c  entity *ccc_tlv,
cc80: 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70   *ccc_curr, *app
cc90: 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b  _tlv, *app_curr;
cca0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
ccb0: 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43  ccc_aid[] = {GSC
ccc0: 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 75 6e  IS_AID_CCC};..un
ccd0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72  signed char curr
cce0: 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e  _aid[7];..unsign
ccf0: 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d  ed long outidx =
cd00: 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20   0;..cackey_ret 
cd10: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b  transaction_ret;
cd20: 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69  ..int certs_resi
cd30: 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64  zable;..int send
cd40: 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74  _ret, select_ret
cd50: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
cd60: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
cd70: 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20  ");...if (count 
cd80: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
cd90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cda0: 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c  ("count is NULL,
cdb0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
cdc0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
cdd0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
cde0: 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c  f (certs != NULL
cdf0: 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74  ) {...if (*count
ce00: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   == 0) {....CACK
ce10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ce20: 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65  "Requested we re
ce30: 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20  turn 0 objects, 
ce40: 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b  short-circuit");
ce50: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
ce60: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  s);...}..}.../* 
ce70: 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43 61 72  Begin a SmartCar
ce80: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d transaction */
ce90: 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65  ..transaction_re
cea0: 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  t = cackey_begin
ceb0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
cec0: 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73 61 63  t);..if (transac
ced0: 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  tion_ret != CACK
cee0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
cef0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cf00: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 62 65  RINTF("Unable be
cf10: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  gin transaction,
cf20: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
cf30: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
cf40: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
cf50: 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c  f (certs == NULL
cf60: 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 6d 61  ) {...certs = ma
cf70: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65 72  lloc(sizeof(*cer
cf80: 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75  ts) * 5);...*cou
cf90: 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f  nt = 5;...certs_
cfa0: 72 65 73 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09  resizable = 1;..
cfb0: 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65 72 74 73  } else {...certs
cfc0: 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a  _resizable = 0;.
cfd0: 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74  .}.../* Select t
cfe0: 68 65 20 43 43 43 20 41 70 70 6c 65 74 20 2a 2f  he CCC Applet */
cff0: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
d000: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
d010: 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c  t(slot, ccc_aid,
d020: 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69 64 29   sizeof(ccc_aid)
d030: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
d040: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
d050: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
d060: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
d070: 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20  nable to select 
d080: 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65 74 75  CCC Applet, retu
d090: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d0a0: 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72 6d 69 6e  ");..../* Termin
d0b0: 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
d0c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
d0d0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
d0e0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
d0f0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
d100: 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74  .../* Read all t
d110: 68 65 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20  he applets from 
d120: 74 68 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f  the CCC's TLV */
d130: 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b  ..ccc_tlv = cack
d140: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74  ey_read_tlv(slot
d150: 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  );.../* Look for
d160: 20 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63   CARDURLs that c
d170: 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49  oorespond to PKI
d180: 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 66 6f 72   applets */..for
d190: 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63   (ccc_curr = ccc
d1a0: 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20  _tlv; ccc_curr; 
d1b0: 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63  ccc_curr = ccc_c
d1c0: 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
d1d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d1e0: 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20  NTF("Found tag: 
d1f0: 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59  %s ... ", CACKEY
d200: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
d210: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
d220: 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66 20 28 63  >tag));....if (c
d230: 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20  cc_curr->tag != 
d240: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
d250: 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  L) {....CACKEY_D
d260: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
d270: 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
d280: 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
d290: 75 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a  ut CARDURLs)");.
d2a0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
d2b0: 7d 0a 0a 09 09 69 66 20 28 28 63 63 63 5f 63 75  }....if ((ccc_cu
d2c0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
d2d0: 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41 43  l->apptype & CAC
d2e0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29  KEY_TLV_APP_PKI)
d2f0: 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41   != CACKEY_TLV_A
d300: 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 43 41 43  PP_PKI) {....CAC
d310: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d320: 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67  ("  ... skipping
d330: 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72   it (we only car
d340: 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c  e about PKI appl
d350: 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74  ets, this applet
d360: 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30   supports: %s/%0
d370: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
d380: 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
d390: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
d3a0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
d3b0: 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67  apptype), (unsig
d3c0: 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72  ned int) ccc_cur
d3d0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
d3e0: 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09  ->apptype);.....
d3f0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
d400: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d410: 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63  INTBUF("RID:", c
d420: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
d430: 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a  ardurl->rid, siz
d440: 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  eof(ccc_curr->va
d450: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
d460: 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ));...CACKEY_DEB
d470: 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44  UG_PRINTF("AppID
d480: 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41   = %s/%04lx", CA
d490: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
d4a0: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63  OBJID_TO_STR(ccc
d4b0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
d4c0: 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75  durl->appid), (u
d4d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63  nsigned long) cc
d4e0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
d4f0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09  rdurl->appid);..
d500: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d510: 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d  INTF("ObjectID =
d520: 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b   %s/%04lx", CACK
d530: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42  EY_DEBUG_FUNC_OB
d540: 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  JID_TO_STR(ccc_c
d550: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
d560: 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28  rl->objectid), (
d570: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
d580: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
d590: 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
d5a0: 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 63 75 72  );....memcpy(cur
d5b0: 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d  r_aid, ccc_curr-
d5c0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
d5d0: 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f  rid, sizeof(ccc_
d5e0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
d5f0: 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 63 75  url->rid));...cu
d600: 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75  rr_aid[sizeof(cu
d610: 72 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28  rr_aid) - 2] = (
d620: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
d630: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e  cardurl->appid >
d640: 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 63  > 8) & 0xff;...c
d650: 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63  urr_aid[sizeof(c
d660: 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20  urr_aid) - 1] = 
d670: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
d680: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26  cardurl->appid &
d690: 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c   0xff;..../* Sel
d6a0: 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74  ect found applet
d6b0: 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65 63 74   ... */...select
d6c0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
d6d0: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
d6e0: 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65  , curr_aid, size
d6f0: 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09  of(curr_aid));..
d700: 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
d710: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
d720: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
d730: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
d740: 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20  ailed to select 
d750: 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67  applet, skipping
d760: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
d770: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
d780: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
d790: 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62  .../* ... and ob
d7a0: 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09  ject (file) */..
d7b0: 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
d7c0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
d7d0: 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d  (slot, ccc_curr-
d7e0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
d7f0: 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 69 66 20  objectid);...if 
d800: 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43  (select_ret != C
d810: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
d820: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
d830: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
d840: 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65  d to select file
d850: 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65  , skipping proce
d860: 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62  ssing of this ob
d870: 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74  ject");.....cont
d880: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  inue;...}..../* 
d890: 50 72 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c  Process this fil
d8a0: 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20  e's TLV looking 
d8b0: 66 6f 72 20 63 65 72 74 69 66 69 63 61 74 65 73  for certificates
d8c0: 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76 20 3d 20   */...app_tlv = 
d8d0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
d8e0: 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72 20 28 61  slot);....for (a
d8f0: 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c  pp_curr = app_tl
d900: 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70  v; app_curr; app
d910: 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72  _curr = app_curr
d920: 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41  ->_next) {....CA
d930: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d940: 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
d950: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
d960: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
d970: 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  app_curr->tag));
d980: 0a 09 09 09 69 66 20 28 61 70 70 5f 63 75 72 72  ....if (app_curr
d990: 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54  ->tag != GSCIS_T
d9a0: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  AG_CERTIFICATE) 
d9b0: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
d9c0: 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
d9d0: 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
d9e0: 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
d9f0: 20 43 45 52 54 49 46 49 43 41 54 45 73 29 22 29   CERTIFICATEs)")
da00: 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
da10: 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69  ....}.....curr_i
da20: 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64  d = &certs[outid
da30: 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b  x];....outidx++;
da40: 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
da50: 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72  _id->applet, cur
da60: 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75  r_aid, sizeof(cu
da70: 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b  rr_id->applet));
da80: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 66 69 6c  ....curr_id->fil
da90: 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  e = ccc_curr->va
daa0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
dab0: 65 63 74 69 64 3b 0a 09 09 09 63 75 72 72 5f 69  ectid;....curr_i
dac0: 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b  d->keysize = -1;
dad0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
dae0: 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e  G_PRINTF("Fillin
daf0: 67 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  g curr_id->apple
db00: 74 20 28 25 70 29 20 77 69 74 68 20 25 6c 75 20  t (%p) with %lu 
db10: 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f 69 64  bytes:", curr_id
db20: 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67  ->applet, (unsig
db30: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66  ned long) sizeof
db40: 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
db50: 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ));....CACKEY_DE
db60: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 41  BUG_PRINTBUF("VA
db70: 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70  L:", curr_id->ap
db80: 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72  plet, sizeof(cur
db90: 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a  r_id->applet));.
dba0: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
dbb0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61  tificate_len = a
dbc0: 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b  pp_curr->length;
dbd0: 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
dbe0: 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
dbf0: 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  oc(curr_id->cert
dc00: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
dc10: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d  .memcpy(curr_id-
dc20: 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61 70  >certificate, ap
dc30: 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63  p_curr->value, c
dc40: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
dc50: 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66  ate_len);.....if
dc60: 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75   (outidx >= *cou
dc70: 6e 74 29 20 7b 0a 09 09 09 09 69 66 20 28 63 65  nt) {.....if (ce
dc80: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b  rts_resizable) {
dc90: 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20  ......*count *= 
dca0: 32 3b 0a 09 09 09 09 09 63 65 72 74 73 20 3d 20  2;......certs = 
dcb0: 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73  realloc(certs, s
dcc0: 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
dcd0: 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 7d  (*count));.....}
dce0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 62 72 65   else {......bre
dcf0: 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09  ak;.....}....}..
dd00: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65  .}....cackey_fre
dd10: 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a  e_tlv(app_tlv);.
dd20: 0a 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d  ...if (outidx >=
dd30: 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72   *count) {....br
dd40: 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61  eak;...}..}...ca
dd50: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63  ckey_free_tlv(cc
dd60: 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74  c_tlv);...*count
dd70: 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20   = outidx;...if 
dd80: 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
dd90: 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65  ) {...certs = re
dda0: 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a  alloc(certs, siz
ddb0: 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a  eof(*certs) * (*
ddc0: 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 2f 2a  count));..}.../*
ddd0: 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74   Terminate Smart
dde0: 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  Card Transaction
ddf0: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
de00: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
de10: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74  );...return(cert
de20: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  s);.}../*. * SYN
de30: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
de40: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
de50: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
de60: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
de70: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
de80: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
de90: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
dea0: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69  size_t cackey_si
deb0: 67 6e 64 65 63 72 79 70 74 28 73 74 72 75 63 74  gndecrypt(struct
dec0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
ded0: 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ot, struct cacke
dee0: 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
def0: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  tity, unsigned c
df00: 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74  har *buf, size_t
df10: 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65   buflen, unsigne
df20: 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20  d char *outbuf, 
df30: 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e  size_t outbuflen
df40: 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20  , int padInput, 
df50: 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29  int unpadOutput)
df60: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
df70: 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62  r *tmpbuf, *tmpb
df80: 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 3b  uf_s, *outbuf_s;
df90: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
dfa0: 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70  bytes_to_send, p
dfb0: 31 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  1;..unsigned cha
dfc0: 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61  r blocktype;..ca
dfd0: 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 65  ckey_ret send_re
dfe0: 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  t;..uint16_t res
dff0: 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20  pcode;..ssize_t 
e000: 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61  retval = 0, unpa
e010: 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74  doffset;..size_t
e020: 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c   tmpbuflen, padl
e030: 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e  en, tmpoutbuflen
e040: 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d 70 62  ;..int free_tmpb
e050: 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b  uf = 0;..int le;
e060: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e070: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
e080: 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d  );...if (slot ==
e090: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
e0a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e0b0: 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20  Error.  slot is 
e0c0: 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
e0d0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
e0e0: 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
e0f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e100: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62 75  INTF("Error.  bu
e110: 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  f is NULL");....
e120: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
e130: 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e  .if (outbuf == N
e140: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
e150: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
e160: 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73 20  ror.  outbuf is 
e170: 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
e180: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
e190: 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
e1a0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
e1b0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
e1c0: 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73 20 4e  .  identity is N
e1d0: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
e1e0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69  (-1);..}...if (i
e1f0: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
e200: 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20  entity == NULL) 
e210: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
e220: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
e230: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
e240: 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c  identity is NULL
e250: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
e260: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
e270: 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65  mine identity Ke
e280: 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69  y size */..if (i
e290: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
e2a0: 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
e2b0: 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74  < 0) {...identit
e2c0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
e2d0: 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39  ->keysize = x509
e2e0: 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e  _to_keysize(iden
e2f0: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
e300: 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
e310: 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
e320: 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
e330: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a  ficate_len);..}.
e340: 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65  ../* Pad message
e350: 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a   to key size */.
e360: 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b  .if (padInput) {
e370: 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
e380: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
e390: 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09  keysize > 0) {..
e3a0: 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20  ..if (buflen != 
e3b0: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
e3c0: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
e3d0: 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c  ) {.....if (bufl
e3e0: 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e  en > (identity->
e3f0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
e400: 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09  eysize + 3)) {..
e410: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
e420: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
e430: 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   Message is too 
e440: 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65  large to sign/de
e450: 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72  crypt");.......r
e460: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d  eturn(-1);.....}
e470: 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
e480: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  = identity->pcsc
e490: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
e4a0: 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  ze;.....tmpbuf =
e4b0: 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
e4c0: 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  n);.....free_tmp
e4d0: 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61  buf = 1;......pa
e4e0: 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e  dlen = tmpbuflen
e4f0: 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a   - buflen - 3;..
e500: 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23  ..../* RSA PKCS#
e510: 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f  1 EMSA-PKCS1-v1_
e520: 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09  5 Padding */....
e530: 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30  .tmpbuf[0] = 0x0
e540: 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d  0;.....tmpbuf[1]
e550: 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d   = 0x01;.....mem
e560: 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20  set(&tmpbuf[2], 
e570: 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09  0xFF, padlen);..
e580: 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  ...tmpbuf[padlen
e590: 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09   + 2]= 0x00;....
e5a0: 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b  .memcpy(&tmpbuf[
e5b0: 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66  padlen + 3], buf
e5c0: 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  , buflen);......
e5d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e5e0: 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
e5f0: 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ", buf, buflen);
e600: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
e610: 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
e620: 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  ed:", tmpbuf, tm
e630: 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65  pbuflen);....} e
e640: 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66  lse {.....tmpbuf
e650: 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62   = buf;.....tmpb
e660: 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
e670: 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
e680: 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20  = 0;.....padlen 
e690: 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  = 0;....}...} el
e6a0: 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
e6b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
e6c0: 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
e6d0: 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e   key size, hopin
e6e0: 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73  g the message is
e6f0: 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64   properly padded
e700: 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20  !");.....tmpbuf 
e710: 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66  = buf;....tmpbuf
e720: 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
e730: 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
e740: 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  ;....padlen = 0;
e750: 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
e760: 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
e770: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
e780: 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62  len;...free_tmpb
e790: 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e  uf = 0;...padlen
e7a0: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65   = 0;..}.../* Be
e7b0: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
e7c0: 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  */..cackey_begin
e7d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
e7e0: 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20  t);.../* Select 
e7f0: 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a  correct applet *
e800: 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  /..CACKEY_DEBUG_
e810: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
e820: 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61  g applet found a
e830: 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74  t %p ...", ident
e840: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
e850: 74 79 2d 3e 61 70 70 6c 65 74 29 3b 0a 09 63 61  ty->applet);..ca
e860: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
e870: 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  et(slot, identit
e880: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
e890: 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  ->applet, sizeof
e8a0: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
e8b0: 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74  identity->applet
e8c0: 29 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20  ));.../* Select 
e8d0: 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a  correct file */.
e8e0: 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66  .cackey_select_f
e8f0: 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  ile(slot, identi
e900: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
e910: 79 2d 3e 66 69 6c 65 29 3b 0a 0a 09 74 6d 70 62  y->file);...tmpb
e920: 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09  uf_s = tmpbuf;..
e930: 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75  outbuf_s = outbu
e940: 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75  f;..while (tmpbu
e950: 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20 28 74 6d  flen) {...if (tm
e960: 70 62 75 66 6c 65 6e 20 3e 20 32 34 35 29 20 7b  pbuflen > 245) {
e970: 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e  ....bytes_to_sen
e980: 64 20 3d 20 32 34 35 3b 0a 09 09 09 70 31 20 3d  d = 245;....p1 =
e990: 20 30 78 38 30 3b 0a 09 09 09 6c 65 20 3d 20 30   0x80;....le = 0
e9a0: 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  x00;...} else {.
e9b0: 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ...bytes_to_send
e9c0: 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09   = tmpbuflen;...
e9d0: 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 6c  .p1 = 0x00;....l
e9e0: 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 0a 0a 09  e = 0x00;...}...
e9f0: 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20  .tmpoutbuflen = 
ea00: 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 73 65  outbuflen;....se
ea10: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
ea20: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
ea30: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42  GSCIS_CLASS_GLOB
ea40: 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43  AL_PLATFORM, GSC
ea50: 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45 43  IS_INSTR_SIGNDEC
ea60: 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c 20  RYPT, p1, 0x00, 
ea70: 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74  bytes_to_send, t
ea80: 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70  mpbuf, le, &resp
ea90: 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74  code, outbuf, &t
eaa0: 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09  mpoutbuflen);...
eab0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
eac0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
ead0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
eae0: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
eaf0: 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20   Sending Failed 
eb00: 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  -- returning in 
eb10: 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66  error.");.....if
eb20: 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b   (free_tmpbuf) {
eb30: 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f  .....if (tmpbuf_
eb40: 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74  s) {......free(t
eb50: 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a  mpbuf_s);.....}.
eb60: 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  ...}...../* End 
eb70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
eb80: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
eb90: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
eba0: 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65  ....if (respcode
ebb0: 20 3d 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09   == 0x6982) {...
ebc0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ebd0: 52 49 4e 54 46 28 22 53 65 63 75 72 69 74 79 20  RINTF("Security 
ebe0: 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73  status not satis
ebf0: 69 66 69 65 64 2e 20 20 52 65 74 75 72 6e 69 6e  ified.  Returnin
ec00: 67 20 4e 45 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a  g NEEDLOGIN");..
ec10: 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
ec20: 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
ec30: 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65  ;.....slot->toke
ec40: 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
ec50: 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09  GIN_REQUIRED;...
ec60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
ec70: 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
ec80: 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  N);....}.....if 
ec90: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
eca0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
ecb0: 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 43 41  ABSENT) {.....CA
ecc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ecd0: 46 28 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e  F("Token absent.
ece0: 20 20 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45    Returning TOKE
ecf0: 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09  NABSENT");......
ed00: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
ed10: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09  _reset(slot);...
ed20: 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c  ..slot->token_fl
ed30: 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
ed40: 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72  REQUIRED;......r
ed50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
ed60: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
ed70: 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
ed80: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d  n(-1);...}....tm
ed90: 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f  pbuf += bytes_to
eda0: 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c  _send;...tmpbufl
edb0: 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73  en -= bytes_to_s
edc0: 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b  end;....outbuf +
edd0: 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a  = tmpoutbuflen;.
ede0: 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74  ..outbuflen -= t
edf0: 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72  mpoutbuflen;...r
ee00: 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62  etval += tmpoutb
ee10: 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28  uflen;..}...if (
ee20: 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09  free_tmpbuf) {..
ee30: 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b  .if (tmpbuf_s) {
ee40: 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f  ....free(tmpbuf_
ee50: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74  s);...}..}...out
ee60: 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a  buf = outbuf_s;.
ee70: 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63  ../* End transac
ee80: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
ee90: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
eea0: 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43  slot);..#ifdef C
eeb0: 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
eec0: 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
eed0: 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75  SIZE_MAX..if (ou
eee0: 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58  tbuflen > _POSIX
eef0: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
ef00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ef10: 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65  NTF("Outbuflen e
ef20: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
ef30: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
ef40: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
ef50: 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65   = %li, outbufle
ef60: 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  n = %lu)", (long
ef70: 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
ef80: 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
ef90: 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  ng) outbuflen);.
efa0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
efb0: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
efc0: 66 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70  f.../* Unpad rep
efd0: 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64  ly */..if (unpad
efe0: 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28  Output) {...if (
eff0: 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09  retval < 3) {...
f000: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f010: 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74  INTF("Reply is t
f020: 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65  oo small, we are
f030: 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70   not able to unp
f040: 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61  ad -- passing ba
f050: 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f  ck and hoping fo
f060: 72 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a  r the best!");..
f070: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f080: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
f090: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
f0a0: 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65  tval = %li (byte
f0b0: 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76  s)", (long) retv
f0c0: 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72  al);....return(r
f0d0: 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69  etval);...}....i
f0e0: 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20  f (outbuf[0] != 
f0f0: 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  0x00) {....CACKE
f100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f110: 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64  Unrecognized pad
f120: 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70  ding scheme -- p
f130: 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
f140: 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
f150: 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b  est!");.....CACK
f160: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f170: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
f180: 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
f190: 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
f1a0: 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09  ong) retval);...
f1b0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
f1c0: 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70  ...}....blocktyp
f1d0: 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09  e = outbuf[1];..
f1e0: 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30  .unpadoffset = 0
f1f0: 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f  ;....switch (blo
f200: 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  cktype) {....cas
f210: 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50  e 0x00:...../* P
f220: 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c  adding Scheme 1,
f230: 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a   the first non-z
f240: 65 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20  ero byte is the 
f250: 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f  start of data */
f260: 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f  .....for (unpado
f270: 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64  ffset = 2; unpad
f280: 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b  offset < retval;
f290: 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20   unpadoffset++) 
f2a0: 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75  {......if (outbu
f2b0: 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21  f[unpadoffset] !
f2c0: 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09  = 0x00) {.......
f2d0: 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09  break;......}...
f2e0: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
f2f0: 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09  ..case 0x01:....
f300: 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65  ./* Padding Sche
f310: 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20  me 2, pad bytes 
f320: 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65  are 0xFF followe
f330: 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09  d by 0x00 */....
f340: 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
f350: 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
f360: 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
f370: 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
f380: 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
f390: 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78  padoffset] != 0x
f3a0: 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  FF) {.......if (
f3b0: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
f3c0: 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09  et] == 0x00) {..
f3d0: 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65  ......unpadoffse
f3e0: 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65  t++;.........bre
f3f0: 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65  ak;.......} else
f400: 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59   {........CACKEY
f410: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
f420: 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64  nvalid padding d
f430: 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  ata found, retur
f440: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c  ning in failure,
f450: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
f460: 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25  n 0x00 found 0x%
f470: 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  02x", (unsigned 
f480: 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61  int) outbuf[unpa
f490: 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09  doffset]);......
f4a0: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f4b0: 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c  .....}......} el
f4c0: 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  se {.......CACKE
f4d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f4e0: 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20  Invalid padding 
f4f0: 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75  data found, retu
f500: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
f510: 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  , should have be
f520: 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78  en 0xFF found 0x
f530: 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64  %02x", (unsigned
f540: 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70   int) outbuf[unp
f550: 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09  adoffset]);.....
f560: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f570: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09  ....}.....}.....
f580: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30  break;....case 0
f590: 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64  x02:...../* Padd
f5a0: 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61  ing Scheme 3, pa
f5b0: 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d  d bytes are non-
f5c0: 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20  zero first zero 
f5d0: 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68  byte found is th
f5e0: 65 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65  e seperator byte
f5f0: 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70   */.....for (unp
f600: 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e  adoffset = 2; un
f610: 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76  padoffset < retv
f620: 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b  al; unpadoffset+
f630: 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75  +) {......if (ou
f640: 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
f650: 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] == 0x00) {....
f660: 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  ...unpadoffset++
f670: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
f680: 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
f690: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
f6a0: 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e  f (unpadoffset >
f6b0: 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41   retval) {....CA
f6c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f6d0: 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65  F("Offset greate
f6e0: 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a  r than reply siz
f6f0: 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75  e, aborting.  (u
f700: 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75  npadoffset = %lu
f710: 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22  , retval = %lu)"
f720: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
f730: 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28  ) unpadoffset, (
f740: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
f750: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
f760: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43  rn(-1);...}....C
f770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f780: 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20  TBUF("Padded:", 
f790: 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b  outbuf, retval);
f7a0: 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e  ....retval -= un
f7b0: 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d  padoffset;...mem
f7c0: 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74  move(outbuf, out
f7d0: 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65  buf + unpadoffse
f7e0: 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43  t, retval);....C
f7f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f800: 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22  TBUF("Unpadded:"
f810: 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c  , outbuf, retval
f820: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f  );..}....CACKEY_
f830: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f840: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
f850: 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69  ss, retval = %li
f860: 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67   (bytes)", (long
f870: 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
f880: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
f890: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
f8a0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
f8b0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
f8c0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
f8d0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
f8e0: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
f8f0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
f900: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
f910: 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  et cackey_login(
f920: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f930: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
f940: 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e  ed char *pin, un
f950: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f  signed long pin_
f960: 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f  len, int *tries_
f970: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
f980: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61  unsigned char ca
f990: 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
f9a0: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
f9b0: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
f9c0: 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69  0xFF, 0xFF};..ui
f9d0: 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f  nt16_t response_
f9e0: 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73  code;..int tries
f9f0: 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74  _remaining;..int
fa00: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20   send_ret;.../* 
fa10: 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65  Indicate that we
fa20: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f   do not know abo
fa30: 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65  ut how many trie
fa40: 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20  s are remaining 
fa50: 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65  */..if (tries_re
fa60: 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a  maining_p) {...*
fa70: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
fa80: 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  p = -1;..}.../* 
fa90: 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20  Apparently, CAC 
faa0: 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c  PINs are *EXACTL
fab0: 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20  Y* 8 bytes long 
fac0: 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46  -- pad with 0xFF
fad0: 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f   if too short */
fae0: 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d  ..if (pin_len >=
faf0: 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63   8) {...memcpy(c
fb00: 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b  ac_pin, pin, 8);
fb10: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
fb20: 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
fb30: 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  , pin_len);..}..
fb40: 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65  ./* Issue PIN Ve
fb50: 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  rify */..send_re
fb60: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
fb70: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
fb80: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
fb90: 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
fba0: 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  FY, 0x00, 0x00, 
fbb0: 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c  sizeof(cac_pin),
fbc0: 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20   cac_pin, 0x00, 
fbd0: 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
fbe0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
fbf0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
fc00: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
fc10: 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73  {...if ((respons
fc20: 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29  e_code & 0x63C0)
fc30: 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09   == 0x63C0) {...
fc40: 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  .tries_remaining
fc50: 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64   = (response_cod
fc60: 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41  e & 0xF);.....CA
fc70: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fc80: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
fc90: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74  ion failed, %i t
fca0: 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c  ries remaining",
fcb0: 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
fcc0: 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  );.....if (tries
fcd0: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
fce0: 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  ....*tries_remai
fcf0: 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72  ning_p = tries_r
fd00: 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a  emaining;....}..
fd10: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
fd20: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
fd30: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70  ...}....if (resp
fd40: 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36  onse_code == 0x6
fd50: 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  983) {....CACKEY
fd60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
fd70: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
fd80: 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69  failed, device i
fd90: 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09  s locked");.....
fda0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
fdb0: 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  SC_E_LOCKED);...
fdc0: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  }....return(CACK
fdd0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
fde0: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
fdf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
fe00: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73  N Verification s
fe10: 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65  ucceeded");...re
fe20: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
fe30: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
fe40: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
fe50: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
fe60: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
fe70: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
fe80: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
fe90: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
fea0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
feb0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
fec0: 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
fed0: 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  nt(struct cackey
fee0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
fef0: 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f  cackey_ret pcsc_
ff00: 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57  connect_ret;..DW
ff10: 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e 2c 20  ORD reader_len, 
ff20: 73 74 61 74 65 2c 20 70 72 6f 74 6f 63 6f 6c 2c  state, protocol,
ff30: 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20   atr_len;..BYTE 
ff40: 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45  atr[MAX_ATR_SIZE
ff50: 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f  ];..LONG status_
ff60: 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
ff70: 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  n_ret;...CACKEY_
ff80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
ff90: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 70 63 73 63 5f  lled.");...pcsc_
ffa0: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
ffb0: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
ffc0: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63  d(slot);..if (pc
ffd0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
ffe0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
fff0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
10000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
10010 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74  ble to connect t
10020 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
10030 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29  g token absent")
10040 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
10050 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
10060 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72  BSENT);..}...atr
10070 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
10080 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20  r);..status_ret 
10090 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
100a0 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e  ot->pcsc_card, N
100b0 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e  ULL, &reader_len
100c0 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f  , &state, &proto
100d0 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c  col, atr, &atr_l
100e0 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75  en);...if (statu
100f0 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  s_ret == SCARD_E
10100 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29  _INVALID_HANDLE)
10110 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
10120 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 53  G_PRINTF("SCardS
10130 74 61 74 75 73 28 29 20 72 65 74 75 72 6e 65 64  tatus() returned
10140 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
10150 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67  _HANDLE, marking
10160 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
10170 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72  connected and tr
10180 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09  ying again");...
10190 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
101a0 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
101b0 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
101c0 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
101d0 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
101e0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
101f0 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
10200 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
10210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10220 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
10230 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
10240 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
10250 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65  absent");.....re
10260 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
10270 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
10280 0a 09 09 7d 0a 0a 09 09 61 74 72 5f 6c 65 6e 20  ...}....atr_len 
10290 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09  = sizeof(atr);..
102a0 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43  .status_ret = SC
102b0 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e  ardStatus(slot->
102c0 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c  pcsc_card, NULL,
102d0 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73   &reader_len, &s
102e0 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c  tate, &protocol,
102f0 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b   atr, &atr_len);
10300 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73  ..}...if (status
10310 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
10320 53 55 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63  SUCCESS) {...cac
10330 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
10340 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66  set(slot);....if
10350 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20   (status_ret == 
10360 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
10370 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  RD) {....CACKEY_
10380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10390 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c  set required, pl
103a0 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a  ease hold...");.
103b0 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e  ....scard_reconn
103c0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ret = cackey_re
103d0 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
103e0 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  t, SCARD_PROTOCO
103f0 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f  L_T0 | SCARD_PRO
10400 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f  TOCOL_T1, &proto
10410 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61  col);....if (sca
10420 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d  rd_reconn_ret ==
10430 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
10440 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74  ) {...../* Updat
10450 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09  e protocol */...
10460 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  ..slot->protocol
10470 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09   = protocol;....
10480 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73  ../* Re-establis
10490 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  h transaction, i
104a0 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74  f it was present
104b0 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74   */.....if (slot
104c0 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
104d0 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  pth > 0) {......
104e0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
104f0 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09  n_depth--;......
10500 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
10510 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
10520 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
10530 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
10540 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
10550 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10560 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
10570 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65  uccessful, reque
10580 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61  rying");.....sta
10590 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
105a0 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
105b0 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
105c0 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
105d0 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
105e0 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09  , &atr_len);....
105f0 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
10600 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
10610 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  SS) {......CACKE
10620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10630 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20  Still unable to 
10640 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
10650 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
10660 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
10670 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
10680 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
10690 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
106a0 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
106b0 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
106c0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
106d0 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
106e0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
106f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10700 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72  NTF("Unable to r
10710 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64  econnect to card
10720 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
10730 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
10740 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  Reconnect() = %s
10750 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
10760 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
10770 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e  _STR(scard_recon
10780 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65  n_ret));......re
10790 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
107a0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
107b0 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
107c0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
107d0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
107e0 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
107f0 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
10800 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
10810 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
10820 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
10830 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
10840 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
10850 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ));.....return(C
10860 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
10870 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
10880 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26  }...if ((state &
10890 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d   SCARD_ABSENT) =
108a0 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20  = SCARD_ABSENT) 
108b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
108c0 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73  _PRINTF("Card is
108d0 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69   absent, returni
108e0 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
108f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
10900 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
10910 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
10920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10930 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b  F("Returning tok
10940 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a  en present.");..
10950 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
10960 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
10970 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  NT);.}../*. * SY
10980 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
10990 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
109a0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
109b0 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
109c0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
109d0 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
109e0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
109f0 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70  ssize_t cackey_p
10a00 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
10a10 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63  label(struct cac
10a20 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
10a30 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
10a40 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65  igned char *labe
10a50 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20  l_buf, unsigned 
10a60 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  long label_buf_l
10a70 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
10a80 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  long certificate
10a90 5f 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61 62  _len;..char *lab
10aa0 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a  el_asn1;..void *
10ab0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e  certificate;..in
10ac0 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  t x509_read_ret;
10ad0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
10ae0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
10af0 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
10b00 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
10b10 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
10b20 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
10b30 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29  ificate_len < 0)
10b40 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
10b50 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f  ..}...x509_read_
10b60 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75  ret = x509_to_su
10b70 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74  bject(certificat
10b80 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
10b90 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c  en, (void **) &l
10ba0 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20  abel_asn1);..if 
10bb0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
10bc0 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
10bd0 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65  1);..}...x509_re
10be0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e  ad_ret = x509_dn
10bf0 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c  _to_string(label
10c00 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64  _asn1, x509_read
10c10 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c  _ret, (char *) l
10c20 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f  abel_buf, label_
10c30 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a  buf_len, "CN");.
10c40 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
10c50 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30  et <= 0) {...x50
10c60 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
10c70 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
10c80 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
10c90 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
10ca0 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
10cb0 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c  bel_buf_len, NUL
10cc0 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f  L);....if (x509_
10cd0 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
10ce0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
10cf0 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
10d00 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
10d10 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
10d20 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35  SIZE_MAX..if (x5
10d30 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50  09_read_ret > _P
10d40 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
10d50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
10d60 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65  _PRINTF("x509_re
10d70 61 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d  ad_ret exceeds m
10d80 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
10d90 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10da0 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
10db0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
10dc0 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
10dd0 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
10de0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10df0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a  x509_read_ret);.
10e00 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
10e10 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
10e20 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f  f...return(x509_
10e30 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a  read_ret);.}../*
10e40 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
10e50 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
10e60 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
10e70 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d  _create(void **m
10e80 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
10e90 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
10ea0 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
10eb0 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
10ec0 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
10ed0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
10ee0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
10ef0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
10f00 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
10f10 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
10f20 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
10f30 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
10f40 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61  hread_mutex = ma
10f50 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68  lloc(sizeof(*pth
10f60 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09  read_mutex));...
10f70 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74  if (!pthread_mut
10f80 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ex) {....CACKEY_
10f90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
10fa0 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
10fb0 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09   memory.");.....
10fc0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
10fd0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
10fe0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
10ff0 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d  x_init(pthread_m
11000 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69  utex, NULL);...i
11010 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
11020 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
11030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11040 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
11050 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20  init() returned 
11060 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
11070 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
11080 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11090 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70  .}....*mutex = p
110a0 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d  thread_mutex;..}
110b0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
110c0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
110d0 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
110e0 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
110f0 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
11100 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
11110 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
11120 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
11130 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11140 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
11150 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28  rgs.CreateMutex(
11160 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
11170 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
11180 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
11190 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
111a0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
111b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
111c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
111d0 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
111e0 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
111f0 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
11200 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
11210 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
11220 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a  utex_lock(void *
11230 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
11240 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
11250 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
11260 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
11270 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
11280 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
11290 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
112a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
112b0 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
112c0 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
112d0 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
112e0 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
112f0 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
11300 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
11310 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
11320 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68  d_mutex_lock(pth
11330 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
11340 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
11350 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
11360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11370 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
11380 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
11390 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
113a0 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
113b0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
113c0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
113d0 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  f (cackey_args.L
113e0 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
113f0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
11400 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
11410 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
11420 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
11430 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
11440 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11450 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
11460 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29  args.LockMutex()
11470 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
11480 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
11490 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
114a0 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
114b0 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
114c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
114d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
114e0 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
114f0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
11500 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
11510 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
11520 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
11530 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20  tex_unlock(void 
11540 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
11550 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
11560 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
11570 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
11580 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
11590 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
115a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
115b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
115c0 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
115d0 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
115e0 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
115f0 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
11600 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
11610 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61  mutex;....pthrea
11620 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
11630 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
11640 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a  pthread_mutex);.
11650 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
11660 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
11670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11680 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
11690 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75  ex_unlock() retu
116a0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
116b0 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
116c0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
116d0 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
116e0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
116f0 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29  rgs.UnlockMutex)
11700 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
11710 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
11720 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75  s.UnlockMutex(mu
11730 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
11740 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
11750 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
11760 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11770 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  ("cackey_args.Un
11780 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  lockMutex() retu
11790 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
117a0 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
117b0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
117c0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
117d0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
117e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
117f0 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
11800 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
11810 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
11820 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ic CK_ATTRIBUTE_
11830 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  PTR cackey_get_a
11840 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a  ttributes(CK_OBJ
11850 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74  ECT_CLASS object
11860 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61  class, struct ca
11870 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
11880 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e  ty *identity, un
11890 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
118a0 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f  tity_num, CK_ULO
118b0 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
118c0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42   {..static CK_BB
118d0 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b  OOL ck_true = 1;
118e0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f  ..static CK_BBOO
118f0 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a  L ck_false = 0;.
11900 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74  .CK_ULONG numatt
11910 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63  rs = 0, retval_c
11920 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42  ount;..CK_ATTRIB
11930 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74  UTE_TYPE curr_at
11940 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54  tr_type;..CK_ATT
11950 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72  RIBUTE curr_attr
11960 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56  , *retval;..CK_V
11970 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a  OID_PTR pValue;.
11980 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75  .CK_ULONG ulValu
11990 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54  eLen;..CK_OBJECT
119a0 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74  _CLASS ck_object
119b0 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54  _class;..CK_CERT
119c0 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f  IFICATE_TYPE ck_
119d0 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
119e0 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63  ;..CK_KEY_TYPE c
119f0 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f  k_key_type;..CK_
11a00 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75  UTF8CHAR ucTmpBu
11a10 66 5b 31 30 32 34 5d 3b 0a 09 75 6e 73 69 67 6e  f[1024];..unsign
11a20 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69  ed char *certifi
11a30 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63  cate;..ssize_t c
11a40 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
11a50 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72   -1, x509_read_r
11a60 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f  et;..int pValue_
11a70 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  free;...CACKEY_D
11a80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
11a90 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73  led (objectClass
11aa0 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79   = %lu, identity
11ab0 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28  _num = %lu).", (
11ac0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
11ad0 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e  bjectclass, iden
11ae0 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 69 66 20  tity_num);...if 
11af0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
11b00 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
11b10 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
11b20 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
11b30 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
11b40 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
11b50 45 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  EY) {...CACKEY_D
11b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
11b70 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
11b80 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
11b90 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
11ba0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
11bb0 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65  ;..}.../* Get Ce
11bc0 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  rt */..if (ident
11bd0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
11be0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11bf0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
11c00 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
11c10 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69  , invalid identi
11c20 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09  y provided");...
11c30 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
11c40 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  }...certificate 
11c50 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
11c60 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
11c70 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
11c80 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
11c90 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
11ca0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20  tificate_len == 
11cb0 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74  -1 || certificat
11cc0 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
11cd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ce0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
11cf0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
11d00 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f  this identity do
11d10 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58  es not have an X
11d20 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
11d30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11d40 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74   it and will not
11d50 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75   work");....retu
11d60 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
11d70 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65  * Verify that ce
11d80 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e  rtificate is ASN
11d90 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39  .1 encoded X.509
11da0 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
11db0 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72  .if (x509_to_ser
11dc0 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
11dd0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
11de0 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09  , NULL) < 0) {..
11df0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11e00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
11e10 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
11e20 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74  , the X.509 cert
11e30 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
11e40 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65  ed with this ide
11e50 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c  ntity is not val
11e60 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  id");....return(
11e70 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  NULL);..}...retv
11e80 61 6c 5f 63 6f 75 6e 74 20 3d 20 31 36 3b 0a 09  al_count = 16;..
11e90 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
11ea0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
11eb0 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
11ec0 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
11ed0 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72  r_type = 0; curr
11ee0 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63  _attr_type < 0xc
11ef0 65 35 33 36 33 35 66 3b 20 63 75 72 72 5f 61 74  e53635f; curr_at
11f00 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69  tr_type++) {...i
11f10 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f (curr_attr_typ
11f20 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09  e == 0x800) {...
11f30 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  .curr_attr_type 
11f40 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09  = 0xce536300;...
11f50 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65  }....pValue_free
11f60 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d   = 0;...pValue =
11f70 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
11f80 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
11f90 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  -1;....switch (c
11fa0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b  urr_attr_type) {
11fb0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  ....case CKA_CLA
11fc0 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SS:.....CACKEY_D
11fd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
11fe0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
11ff0 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25  e CKA_CLASS (0x%
12000 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
12010 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
12020 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
12030 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  ..ck_object_clas
12040 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b  s = objectclass;
12050 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
12060 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
12070 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
12080 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65  = sizeof(ck_obje
12090 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09  ct_class);......
120a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
120b0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
120c0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
120d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
120e0 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f  g) *((CK_OBJECT_
120f0 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29  CLASS *) pValue)
12100 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
12110 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
12120 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
12130 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
12140 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  OKEN:.....CACKEY
12150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12160 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
12170 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30  ute CKA_TOKEN (0
12180 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
12190 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
121a0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
121b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
121c0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
121d0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
121e0 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
121f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12200 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
12210 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
12220 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12230 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
12240 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
12250 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12260 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
12270 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
12280 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09  e CKA_TRUSTED:..
12290 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
122a0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
122b0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
122c0 5f 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c  _TRUSTED (0x%08l
122d0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
122e0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
122f0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
12300 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
12310 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
12320 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
12330 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
12340 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
12350 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
12360 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
12370 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
12380 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
12390 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
123a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
123b0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
123c0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
123d0 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09  _MODIFIABLE:....
123e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
123f0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
12400 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
12410 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38  ODIFIABLE (0x%08
12420 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
12430 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
12440 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
12450 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
12460 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
12470 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
12480 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
12490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
124a0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
124b0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
124c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
124d0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
124e0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
124f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
12500 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
12510 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
12520 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43  CKA_LABEL:.....C
12530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12540 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
12550 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42  ttribute CKA_LAB
12560 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  EL (0x%08lx) ...
12570 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
12580 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
12590 65 29 3b 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a  e);....../* XXX:
125a0 20 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20   Determine name 
125b0 2a 2f 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  */.....ulValueLe
125c0 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68  n = snprintf((ch
125d0 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20  ar *) ucTmpBuf, 
125e0 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29  sizeof(ucTmpBuf)
125f0 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75  , "Identity #%lu
12600 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
12610 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29  g) identity_num)
12620 3b 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75  ;.....pValue = u
12630 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 66  cTmpBuf;......if
12640 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20   (ulValueLen >= 
12650 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29  sizeof(ucTmpBuf)
12660 29 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ) {......ulValue
12670 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 56  Len = 0;......pV
12680 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
12690 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
126a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
126b0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
126c0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
126d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
126e0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
126f0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
12700 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43  CKA_VALUE:.....C
12710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12720 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
12730 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c  ttribute CKA_VAL
12740 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  UE (0x%08lx) ...
12750 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
12760 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
12770 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20  e);......switch 
12780 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a  (objectclass) {.
12790 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52  .....case CKO_PR
127a0 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09  IVATE_KEY:......
127b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
127c0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
127d0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
127e0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70  cause we are a p
127f0 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a  rivate key.");..
12800 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
12810 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49  ..case CKO_PUBLI
12820 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20  C_KEY:......./* 
12830 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09  XXX: TODO */....
12840 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
12850 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49  case CKO_CERTIFI
12860 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c  CATE:.......pVal
12870 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  ue = certificate
12880 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  ;.......ulValueL
12890 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  en = certificate
128a0 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65  _len;........bre
128b0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ak;.....}......C
128c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
128d0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
128e0 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
128f0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
12900 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
12910 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
12920 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a  case CKA_ISSUER:
12930 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12940 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
12950 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
12960 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38  KA_ISSUER (0x%08
12970 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
12980 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
12990 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
129a0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
129b0 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
129c0 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
129d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
129e0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
129f0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
12a00 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
12a10 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09  tificate.");....
12a20 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
12a30 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
12a40 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
12a50 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
12a60 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73  ret = x509_to_is
12a70 73 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65  suer(certificate
12a80 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
12a90 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
12aa0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
12ab0 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
12ac0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
12ad0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
12ae0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
12af0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
12b00 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
12b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12b20 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
12b30 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
12b40 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
12b50 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
12b60 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
12b70 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49  ...case CKA_SERI
12b80 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43  AL_NUMBER:.....C
12b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12ba0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
12bb0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52  ttribute CKA_SER
12bc0 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30  IAL_NUMBER (0x%0
12bd0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
12be0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
12bf0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
12c00 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
12c10 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
12c20 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
12c30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12c40 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
12c50 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
12c60 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
12c70 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09  rtificate.");...
12c80 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
12c90 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
12ca0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
12cb0 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
12cc0 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73  _ret = x509_to_s
12cd0 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74  erial(certificat
12ce0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
12cf0 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
12d00 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
12d10 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
12d20 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
12d30 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
12d40 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
12d50 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
12d60 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
12d70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12d80 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
12d90 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
12da0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
12db0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
12dc0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
12dd0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
12de0 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b  UBJECT:.....CACK
12df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12e00 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
12e10 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43  ibute CKA_SUBJEC
12e20 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  T (0x%08lx) ..."
12e30 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12e40 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
12e50 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
12e60 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
12e70 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
12e80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12e90 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
12ea0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
12eb0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
12ec0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
12ed0 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
12ee0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
12ef0 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
12f00 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
12f10 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
12f20 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
12f30 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
12f40 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
12f50 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
12f60 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
12f70 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
12f80 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
12f90 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
12fa0 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
12fb0 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
12fc0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
12fd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12fe0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
12ff0 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
13000 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
13010 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
13020 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
13030 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43   CKA_ID:.....CAC
13040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13050 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
13060 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30  ribute CKA_ID (0
13070 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13080 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13090 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
130a0 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20  ....ucTmpBuf[0] 
130b0 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d  = ((identity_num
130c0 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78   + 1) >> 8) & 0x
130d0 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66  ff;.....ucTmpBuf
130e0 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79  [1] =  (identity
130f0 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66  _num + 1) & 0xff
13100 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
13110 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75  &ucTmpBuf;.....u
13120 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a  lValueLen = 2;..
13130 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13140 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
13150 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
13160 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
13170 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
13180 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
13190 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
131a0 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a  RTIFICATE_TYPE:.
131b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
131c0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
131d0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
131e0 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
131f0 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PE (0x%08lx) ...
13200 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13210 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
13220 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
13230 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
13240 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
13250 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13260 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
13270 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
13280 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
13290 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
132a0 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  e.");.......brea
132b0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
132c0 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
132d0 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65   one certificate
132e0 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f   type */.....ck_
132f0 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
13300 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09   = CKC_X_509;...
13310 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
13320 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
13330 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
13340 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72   = sizeof(ck_cer
13350 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a  tificate_type);.
13360 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13370 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
13380 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35  eturning CKC_X_5
13390 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75  09 (%lu) (%p/%lu
133a0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
133b0 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46  ng) *((CK_CERTIF
133c0 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56  ICATE_TYPE *) pV
133d0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
133e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
133f0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13400 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13410 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09  CKA_KEY_TYPE:...
13420 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13430 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
13440 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
13450 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c  KEY_TYPE (0x%08l
13460 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
13470 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
13480 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
13490 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
134a0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
134b0 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
134c0 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
134d0 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  EY) {......CACKE
134e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
134f0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
13500 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
13510 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79  we are not a key
13520 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
13530 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
13540 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
13550 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a  one key type */.
13560 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20  ....ck_key_type 
13570 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09  = CKK_RSA;......
13580 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79  pValue = &ck_key
13590 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _type;.....ulVal
135a0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
135b0 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09  k_key_type);....
135c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
135d0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
135e0 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25  rning CKK_RSA (%
135f0 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
13600 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
13610 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
13620 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
13630 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13640 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13650 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13660 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
13670 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  IGN:.....CACKEY_
13680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
13690 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
136a0 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25  te CKA_SIGN (0x%
136b0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
136c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
136d0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
136e0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
136f0 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
13700 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
13710 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
13720 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
13730 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
13740 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
13750 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
13760 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
13770 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
13780 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
13790 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
137a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
137b0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
137c0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
137d0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
137e0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
137f0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
13800 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
13810 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
13820 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
13830 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09  SIGN_RECOVER:...
13840 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13850 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
13860 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
13870 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78  SIGN_RECOVER (0x
13880 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
13890 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
138a0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
138b0 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74  .../* We current
138c0 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ly only support 
138d0 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e  "Sign with Appen
138e0 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c  dix" */.....pVal
138f0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
13900 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
13910 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
13920 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
13930 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
13940 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
13950 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
13960 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
13970 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
13980 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
13990 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
139a0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
139b0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
139c0 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43  DECRYPT:.....CAC
139d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
139e0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
139f0 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59  ribute CKA_DECRY
13a00 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PT (0x%08lx) ...
13a10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13a20 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
13a30 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
13a40 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
13a50 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f  PRIVATE_KEY || o
13a60 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
13a70 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a  O_PUBLIC_KEY) {.
13a80 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
13a90 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
13aa0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
13ab0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
13ac0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
13ad0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
13ae0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
13af0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
13b00 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
13b10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13b20 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
13b30 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
13b40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13b50 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
13b60 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
13b70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
13b80 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
13b90 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
13ba0 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56  ase CKA_SENSITIV
13bb0 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
13bc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
13bd0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
13be0 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28   CKA_SENSITIVE (
13bf0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
13c00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
13c10 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
13c20 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
13c30 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
13c40 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
13c50 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
13c60 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
13c70 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
13c80 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
13c90 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
13ca0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
13cb0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
13cc0 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
13cd0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
13ce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13cf0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
13d00 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
13d10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
13d20 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
13d30 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
13d40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
13d50 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
13d60 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
13d70 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a  KA_EXTRACTABLE:.
13d80 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13d90 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
13da0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
13db0 41 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 30  A_EXTRACTABLE (0
13dc0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13dd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13de0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
13df0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
13e00 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
13e10 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
13e20 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
13e30 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
13e40 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
13e50 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
13e60 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
13e70 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
13e80 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
13e90 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
13ea0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
13eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
13ec0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
13ed0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
13ee0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
13ef0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
13f00 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
13f10 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13f20 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
13f30 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
13f40 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43  A_MODULUS:.....C
13f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13f60 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
13f70 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44  ttribute CKA_MOD
13f80 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e  ULUS (0x%08lx) .
13f90 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
13fa0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
13fb0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 63  ype);......if (c
13fc0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
13fd0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
13fe0 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
13ff0 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74  _to_modulus(cert
14000 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
14010 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
14020 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
14030 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
14040 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
14050 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
14060 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
14070 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
14080 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
14090 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
140a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
140b0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
140c0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
140d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
140e0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
140f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
14100 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
14110 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  NENT:.....CACKEY
14120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14130 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
14140 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ute CKA_PUBLIC_E
14150 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78  XPONENT (0x%08lx
14160 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
14170 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
14180 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
14190 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
141a0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
141b0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
141c0 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28  509_to_exponent(
141d0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
141e0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
141f0 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
14200 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
14210 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
14220 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
14230 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
14240 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
14250 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
14260 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
14270 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14280 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
14290 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
142a0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
142b0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
142c0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
142d0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53  case CKA_TRUST_S
142e0 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 09  ERVER_AUTH:.....
142f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14300 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
14310 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
14320 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 20  UST_SERVER_AUTH 
14330 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
14340 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14350 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
14360 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
14370 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
14380 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
14390 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
143a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
143b0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
143c0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
143d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
143e0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
143f0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
14400 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
14410 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
14420 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
14430 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c  ase CKA_TRUST_CL
14440 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 09 43  IENT_AUTH:.....C
14450 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14460 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
14470 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
14480 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20 28  ST_CLIENT_AUTH (
14490 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
144a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
144b0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
144c0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
144d0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
144e0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
144f0 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
14500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14510 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
14520 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
14530 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14540 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
14550 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
14560 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14570 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
14580 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14590 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  se CKA_TRUST_COD
145a0 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 09 43  E_SIGNING:.....C
145b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
145c0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
145d0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
145e0 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20  ST_CODE_SIGNING 
145f0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
14600 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14610 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
14620 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
14630 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
14640 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
14650 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
14660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14670 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
14680 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
14690 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
146a0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
146b0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
146c0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
146d0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
146e0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
146f0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ase CKA_TRUST_EM
14700 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a  AIL_PROTECTION:.
14710 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14720 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
14730 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
14740 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
14750 4f 54 45 43 54 49 4f 4e 20 28 30 78 25 30 38 6c  OTECTION (0x%08l
14760 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
14770 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
14780 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
14790 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
147a0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
147b0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
147c0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
147d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
147e0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
147f0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
14800 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
14810 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
14820 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
14830 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
14840 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
14850 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a  eak;....default:
14860 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
14870 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  LL;.....ulValueL
14880 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
14890 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
148a0 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f  }....if (((CK_LO
148b0 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20  NG) ulValueLen) 
148c0 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  != ((CK_LONG) -1
148d0 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20  )) {..../* Push 
148e0 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74  curr_attr onto t
148f0 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63  he stack */....c
14900 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20  urr_attr.type = 
14910 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a  curr_attr_type;.
14920 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  ...curr_attr.ulV
14930 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
14940 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61  eLen;.....curr_a
14950 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  ttr.pValue = mal
14960 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c  loc(curr_attr.ul
14970 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65  ValueLen);....me
14980 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70  mcpy(curr_attr.p
14990 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63  Value, pValue, c
149a0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
149b0 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56  Len);.....if (pV
149c0 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61  alue_free && pVa
149d0 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28  lue) {.....free(
149e0 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09  pValue);....}...
149f0 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e  ..if (numattrs >
14a00 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20  = retval_count) 
14a10 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f 63 6f 75  {.....retval_cou
14a20 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72 65 74  nt *= 2;.....ret
14a30 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
14a40 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
14a50 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
14a60 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  val));....}.....
14a70 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e  memcpy(&retval[n
14a80 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f  umattrs], &curr_
14a90 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72  attr, sizeof(cur
14aa0 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d  r_attr));....num
14ab0 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  attrs++;...}..}.
14ac0 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21  ..if (numattrs !
14ad0 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f  = 0) {...retval_
14ae0 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  count = numattrs
14af0 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
14b00 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
14b10 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
14b20 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d  of(*retval));..}
14b30 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72   else {...free(r
14b40 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61  etval);....retva
14b50 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a  l = NULL;..}...*
14b60 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  pulCount = numat
14b70 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  trs;...CACKEY_DE
14b80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
14b90 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74  rning %lu object
14ba0 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74  s (%p).", numatt
14bb0 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  rs, retval);...r
14bc0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
14bd0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
14be0 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
14bf0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
14c00 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
14c10 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
14c20 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65  d long identitie
14c30 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  s_count) {..CK_A
14c40 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
14c50 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ttr;..unsigned l
14c60 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72  ong id_idx, attr
14c70 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e  _idx;...if (iden
14c80 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c  tities == NULL |
14c90 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  | identities_cou
14ca0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  nt == 0) {...ret
14cb0 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  urn;..}...for (i
14cc0 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64  d_idx = 0; id_id
14cd0 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63  x < identities_c
14ce0 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20  ount; id_idx++) 
14cf0 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  {...if (identiti
14d00 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
14d10 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20  butes) {....for 
14d20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
14d30 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
14d40 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
14d50 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61  ributes_count; a
14d60 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
14d70 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64  .curr_attr = &id
14d80 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
14d90 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72  .attributes[attr
14da0 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28  _idx];......if (
14db0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
14dc0 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
14dd0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
14de0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
14df0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
14e00 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
14e10 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28  tes) {.....free(
14e20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
14e30 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a  x].attributes);.
14e40 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
14e50 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74  free_certs(ident
14e60 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
14e70 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20  sc_identity, 1, 
14e80 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65  1);...}..}...fre
14e90 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d  e(identities);.}
14ea0 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
14eb0 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
14ec0 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65  *cackey_read_ide
14ed0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
14ee0 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
14ef0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
14f00 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73  *ids_found) {..s
14f10 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
14f20 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
14f30 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74  _identities;..st
14f40 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
14f50 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
14f60 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
14f70 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78   num_ids, id_idx
14f80 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a  , curr_id_type;.
14f90 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
14fa0 75 6d 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69  um_certs, cert_i
14fb0 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
14fc0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
14fd0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f  d.");...if (ids_
14fe0 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  found == NULL) {
14ff0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15000 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15010 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c  ids_found is NUL
15020 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  L");....return(N
15030 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  ULL);..}...pcsc_
15040 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
15050 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
15060 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  lot, NULL, &num_
15070 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73  certs);..if (pcs
15080 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
15090 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e  NULL) {.../* Con
150a0 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43  vert number of C
150b0 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f  erts to number o
150c0 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e  f objects */...n
150d0 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52  um_ids = (CKO_PR
150e0 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f  IVATE_KEY - CKO_
150f0 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29  CERTIFICATE + 1)
15100 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09   * num_certs;...
15110 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
15120 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
15130 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
15140 73 29 29 3b 0a 0a 09 09 69 64 5f 69 64 78 20 3d  s));....id_idx =
15150 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f   0;...for (cert_
15160 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64  idx = 0; cert_id
15170 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63  x < num_certs; c
15180 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ert_idx++) {....
15190 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70  for (curr_id_typ
151a0 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  e = CKO_CERTIFIC
151b0 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  ATE; curr_id_typ
151c0 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  e <= CKO_PRIVATE
151d0 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79  _KEY; curr_id_ty
151e0 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e  pe++) {.....iden
151f0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
15200 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
15210 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
15220 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20  s(curr_id_type, 
15230 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  &pcsc_identities
15240 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74  [cert_idx], cert
15250 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
15260 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
15270 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  utes_count);....
15280 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
15290 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
152a0 74 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tes == NULL) {..
152b0 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
152c0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
152d0 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  s_count = 0;....
152e0 09 7d 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  .}......identiti
152f0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
15300 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  identity = mallo
15310 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  c(sizeof(*identi
15320 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
15330 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09  c_identity));...
15340 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
15350 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
15360 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63  _identity, &pcsc
15370 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
15380 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69  _idx], sizeof(*i
15390 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
153a0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29  ].pcsc_identity)
153b0 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  );......identiti
153c0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
153d0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
153e0 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70  icate = malloc(p
153f0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
15400 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
15410 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d  cate_len);.....m
15420 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
15430 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
15440 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
15450 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
15460 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
15470 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
15480 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
15490 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
154a0 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f  e_len);......id_
154b0 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  idx++;....}...}.
154c0 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
154d0 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
154e0 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
154f0 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75   1);....*ids_fou
15500 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 09  nd = num_ids;...
15510 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65  return(identitie
15520 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f  s);..}...*ids_fo
15530 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  und = 0;..return
15540 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  (NULL);.}..CK_DE
15550 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
15560 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a  _RV, C_Initializ
15570 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
15580 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f  InitArgs) {..CK_
15590 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
155a0 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09  S CK_PTR args;..
155b0 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69  uint32_t idx;..i
155c0 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  nt mutex_init_re
155d0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
155e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
155f0 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
15600 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
15610 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15620 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15630 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69  Already initiali
15640 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
15650 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41  n(CKR_CRYPTOKI_A
15660 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a  LREADY_INITIALIZ
15670 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49  ED);..}...if (pI
15680 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29  nitArgs != NULL)
15690 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69   {...args = pIni
156a0 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28  tArgs;...memcpy(
156b0 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72  &cackey_args, ar
156c0 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  gs, sizeof(cacke
156d0 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20  y_args));....if 
156e0 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74  (args->CreateMut
156f0 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
15700 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78  gs->DestroyMutex
15710 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
15720 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e  ->LockMutex == N
15730 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c  ULL || args->Unl
15740 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
15750 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d  ) {....if (args-
15760 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20  >CreateMutex != 
15770 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
15780 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55  stroyMutex != NU
15790 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
157a0 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
157b0 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
157c0 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex != NULL) {...
157d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
157e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f  RINTF("Error. So
157f0 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20  me, but not All 
15800 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74  threading primit
15810 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29  ives provided.")
15820 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
15830 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
15840 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c  ;....}...}..} el
15850 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72  se {...cackey_ar
15860 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d  gs.CreateMutex =
15870 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
15880 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65  args.DestroyMute
15890 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
158a0 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
158b0 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
158c0 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
158d0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
158e0 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
158f0 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  = 0;..}...for (i
15900 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
15910 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
15920 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
15930 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
15940 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
15950 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
15960 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30  [idx].active = 0
15970 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
15980 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
15990 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
159a0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
159b0 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
159c0 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
159d0 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  lots[idx].active
159e0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
159f0 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
15a00 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
15a10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
15a20 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ].transaction_de
15a30 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  pth = 0;...cacke
15a40 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
15a50 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
15a60 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63  _lock = 0;...cac
15a70 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73  key_slots[idx].s
15a80 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
15a90 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
15aa0 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  x].token_flags =
15ab0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
15ac0 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
15ad0 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
15ae0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
15af0 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  1;...if (!cackey
15b00 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b  _biglock_init) {
15b10 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  ...mutex_init_re
15b20 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  t = cackey_mutex
15b30 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f  _create(&cackey_
15b40 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20  biglock);....if 
15b50 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  (mutex_init_ret 
15b60 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
15b70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15b80 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e  Error.  Mutex in
15b90 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
15ba0 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  led.");.....retu
15bb0 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b  rn(CKR_CANT_LOCK
15bc0 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
15bd0 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
15be0 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  1;..}...CACKEY_D
15bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15c00 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
15c10 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
15c20 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
15c30 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
15c40 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
15c50 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  inalize)(CK_VOID
15c60 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
15c70 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
15c80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15c90 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
15ca0 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
15cb0 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
15cc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15cd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
15ce0 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
15cf0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
15d00 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
15d10 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
15d20 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
15d30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15d40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15d50 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
15d60 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15d70 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
15d80 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
15d90 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
15da0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
15db0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
15dc0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
15dd0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
15de0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
15df0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
15e00 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
15e10 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
15e20 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  (idx);...}..}...
15e30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
15e40 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
15e50 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
15e60 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
15e70 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
15e80 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
15e90 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
15ea0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
15eb0 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
15ec0 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63  der) {....free(c
15ed0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
15ee0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
15ef0 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70  .}..}...cackey_p
15f00 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
15f10 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69  ;...cackey_initi
15f20 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41  alized = 0;...CA
15f30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15f40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
15f50 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
15f60 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
15f70 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
15f80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
15f90 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b  V, C_GetInfo)(CK
15fa0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
15fb0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
15fc0 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
15fd0 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
15fe0 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
15ff0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
16000 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74   libraryDescript
16010 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22  ion[] = "CACKey"
16020 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
16030 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
16040 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
16050 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
16060 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16070 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
16080 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
16090 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
160a0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
160b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
160c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
160d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
160e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
160f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
16100 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
16110 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
16120 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ED);..}...pInfo-
16130 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
16140 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45  .major = ((CACKE
16150 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
16160 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20  ON_CODE) >> 16) 
16170 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
16180 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e  cryptokiVersion.
16190 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  minor = ((CACKEY
161a0 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
161b0 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20  N_CODE) >> 8) & 
161c0 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0xff;...memset(p
161d0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
161e0 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
161f0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
16200 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
16210 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
16220 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
16230 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
16240 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
16250 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   - 1);...pInfo->
16260 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09  flags = 0x00;...
16270 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69  memset(pInfo->li
16280 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
16290 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
162a0 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
162b0 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
162c0 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  py(pInfo->librar
162d0 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69  yDescription, li
162e0 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
162f0 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79  , sizeof(library
16300 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31  Description) - 1
16310 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  );...pInfo->libr
16320 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  aryVersion.major
16330 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
16340 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
16350 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c   0xff;..pInfo->l
16360 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69  ibraryVersion.mi
16370 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
16380 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
16390 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
163a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
163b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
163c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
163d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
163e0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63  );.}../*. * Proc
163f0 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ess list of read
16400 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20  ers, and create 
16410 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20  mapping between 
16420 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20  reader name and 
16430 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44  slot ID. */.CK_D
16440 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
16450 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c  K_RV, C_GetSlotL
16460 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f  ist)(CK_BBOOL to
16470 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53  kenPresent, CK_S
16480 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
16490 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  List, CK_ULONG_P
164a0 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
164b0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
164c0 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
164d0 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f  ect_ret;..CK_ULO
164e0 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  NG count, slot_c
164f0 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c  ount = 0, currsl
16500 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  ot;..char *pcsc_
16510 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72  readers, *pcsc_r
16520 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f  eaders_s, *pcsc_
16530 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52  readers_e;..DWOR
16540 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  D pcsc_readers_l
16550 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
16560 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b  listreaders_ret;
16570 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65  ..size_t curr_re
16580 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b  ader_len;...CACK
16590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
165a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
165b0 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55   (pulCount == NU
165c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
165d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
165e0 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20  or. pulCount is 
165f0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
16600 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
16610 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
16620 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
16630 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
16640 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16650 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
16660 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
16670 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
16680 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
16690 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
166a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
166b0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
166c0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
166d0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
166e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
166f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
16700 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
16710 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
16720 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
16730 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61  R);..}.../* Clea
16740 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  r list of slots 
16750 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  */..if (pSlotLis
16760 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
16770 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67  BUG_PRINTF("Purg
16780 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66  ing all slot inf
16790 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09  ormation.");....
167a0 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
167b0 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
167c0 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
167d0 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79  lly being supply
167e0 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
167f0 61 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ation */...cacke
16800 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
16810 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72  ct_all();....for
16820 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
16830 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
16840 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
16850 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
16860 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
16870 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66  rslot++) {....if
16880 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
16890 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
168a0 61 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 65  ader) {.....free
168b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
168c0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
168d0 64 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  der);......cacke
168e0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
168f0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
16900 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  NULL;....}.....i
16910 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
16920 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29  currslot].label)
16930 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b   {.....free(cack
16940 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
16950 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09  t].label);......
16960 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
16970 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e  rslot].label = N
16980 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ULL;....}.....ca
16990 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
169a0 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  lot].active = 0;
169b0 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ...}..}.../* Det
169c0 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72  ermine list of r
169d0 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f  eaders */..pcsc_
169e0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
169f0 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
16a00 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  t();..if (pcsc_c
16a10 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
16a20 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
16a30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16a40 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
16a50 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69  ion to PC/SC fai
16a60 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  led, assuming no
16a70 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f   slots");....slo
16a80 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20  t_count = 0;..} 
16a90 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65  else {...pcsc_re
16aa0 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a  aders_len = 0;..
16ab0 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
16ac0 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
16ad0 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
16ae0 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
16af0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73  NULL, NULL, &pcs
16b00 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
16b10 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73  ...if (scard_lis
16b20 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20  treaders_ret == 
16b30 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52  SCARD_F_COMM_ERR
16b40 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OR) {....CACKEY_
16b50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16b60 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65  ror. SCardListRe
16b70 61 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64  aders() returned
16b80 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52   SCARD_F_COMM_ER
16b90 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f  ROR, assuming Co
16ba0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53  nnection to PC/S
16bb0 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63  C went away. Rec
16bc0 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09  onnecting.");...
16bd0 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  ..cackey_pcsc_di
16be0 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63  sconnect();....c
16bf0 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
16c00 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ct();.....CACKEY
16c10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
16c20 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52  rying SCardListR
16c30 65 61 64 65 72 73 28 29 20 61 67 61 69 6e 22 29  eaders() again")
16c40 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  ;....scard_listr
16c50 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
16c60 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
16c70 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
16c80 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26  e, NULL, NULL, &
16c90 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
16ca0 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  );...}....if (sc
16cb0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
16cc0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
16cd0 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f 72  UCCESS && pcsc_r
16ce0 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29  eaders_len != 0)
16cf0 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65   {....pcsc_reade
16d00 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  rs = malloc(pcsc
16d10 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
16d20 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  ..pcsc_readers_s
16d30 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b   = pcsc_readers;
16d40 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  .....scard_listr
16d50 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
16d60 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
16d70 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
16d80 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65  e, NULL, pcsc_re
16d90 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61  aders, &pcsc_rea
16da0 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66  ders_len);....if
16db0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
16dc0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
16dd0 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
16de0 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  ..pcsc_readers_e
16df0 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 20   = pcsc_readers 
16e00 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  + pcsc_readers_l
16e10 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72  en;....../* Star
16e20 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31  t with Slot ID 1
16e30 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67  , to avoid a bug
16e40 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20   in GDM on RHEL 
16e50 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39  */...../* Bug 59
16e60 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75  4911: https://bu
16e70 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f  gzilla.redhat.co
16e80 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  m/show_bug.cgi?i
16e90 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09  d=594911 */.....
16ea0 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09  currslot = 1;...
16eb0 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65  ..while (pcsc_re
16ec0 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61  aders < pcsc_rea
16ed0 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 63  ders_e) {......c
16ee0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
16ef0 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61   strlen(pcsc_rea
16f00 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20  ders);.......if 
16f10 28 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ((pcsc_readers +
16f20 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
16f30 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73  ) > pcsc_readers
16f40 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  _e) {.......brea
16f50 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
16f60 69 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f  if (curr_reader_
16f70 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  len == 0) {.....
16f80 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
16f90 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c  ......if (currsl
16fa0 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ot >= (sizeof(ca
16fb0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
16fc0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
16fd0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09  s[0]))) {.......
16fe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16ff0 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20  NTF("Found more 
17000 72 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f  readers than slo
17010 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ts are available
17020 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  !");........brea
17030 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
17040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17050 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65  NTF("Found reade
17060 72 3a 20 25 73 22 2c 20 70 63 73 63 5f 72 65 61  r: %s", pcsc_rea
17070 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20  ders);......./* 
17080 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
17090 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
170a0 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
170b0 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73 75 70   being asked sup
170c0 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66  ply the slot inf
170d0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  ormation */.....
170e0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
170f0 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  {.......cackey_s
17100 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
17110 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09  ctive = 1;......
17120 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
17130 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
17140 64 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73  der = strdup(pcs
17150 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09  c_readers);.....
17160 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
17170 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61  urrslot].pcsc_ca
17180 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
17190 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
171a0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
171b0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
171c0 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 0;.......cack
171d0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
171e0 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t].transaction_n
171f0 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
17200 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
17210 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c  ots[currslot].sl
17220 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09  ot_reset = 1;...
17230 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
17240 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
17250 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
17260 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09  IN_REQUIRED;....
17270 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
17280 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20  currslot].label 
17290 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 63  = NULL;........c
172a0 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
172b0 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c  reset(&cackey_sl
172c0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a  ots[currslot]);.
172d0 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72 72  .....}......curr
172e0 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63  slot++;.......pc
172f0 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 75  sc_readers += cu
17300 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20  rr_reader_len + 
17310 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  1;.....}....../*
17320 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74   Start with Slot
17330 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20   ID 1, to avoid 
17340 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20  a bug in GDM on 
17350 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42  RHEL */...../* B
17360 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73  ug 594911: https
17370 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68  ://bugzilla.redh
17380 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e  at.com/show_bug.
17390 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f  cgi?id=594911 */
173a0 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
173b0 74 20 3e 20 31 29 20 7b 0a 09 09 09 09 09 2f 2a  t > 1) {....../*
173c0 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74   Start with Slot
173d0 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20   ID 1, to avoid 
173e0 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20  a bug in GDM on 
173f0 52 48 45 4c 20 2a 2f 0a 09 09 09 09 09 2f 2a 20  RHEL */....../* 
17400 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70  Bug 594911: http
17410 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64  s://bugzilla.red
17420 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67  hat.com/show_bug
17430 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a  .cgi?id=594911 *
17440 2f 0a 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e  /......slot_coun
17450 74 20 3d 20 63 75 72 72 73 6c 6f 74 20 2d 20 31  t = currslot - 1
17460 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
17470 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
17480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
17490 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72  ond call to SCar
174a0 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69  dListReaders fai
174b0 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25  led, return %s/%
174c0 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  li", CACKEY_DEBU
174d0 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
174e0 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73  TO_STR(scard_lis
174f0 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28  treaders_ret), (
17500 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74  long) scard_list
17510 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09  readers_ret);...
17520 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63  .}.....free(pcsc
17530 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d  _readers_s);...}
17540 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
17550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17560 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43  First call to SC
17570 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
17580 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
17590 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
175a0 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
175b0 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
175c0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
175d0 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
175e0 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
175f0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
17600 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
17610 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
17620 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
17630 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
17640 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
17650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17660 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
17670 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
17680 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
17690 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
176a0 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
176b0 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
176c0 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b  nt = slot_count;
176d0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
176e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
176f0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
17700 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
17710 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72  rs, but not stor
17720 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69  ing IDs (pSlotLi
17730 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b  st == NULL)", CK
17740 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
17750 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
17760 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
17770 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74  _OK);..}...count
17780 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69   = *pulCount;..i
17790 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f  f (count < slot_
177a0 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45  count) {...CACKE
177b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
177c0 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
177d0 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
177e0 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25  s, but we have %
177f0 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f  lu entries.", co
17800 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  unt, slot_count)
17810 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17820 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
17830 29 3b 09 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75  );...}...for (cu
17840 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
17850 73 6c 6f 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e  slot < slot_coun
17860 74 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  t; currslot++) {
17870 0a 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
17880 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
17890 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
178a0 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 2f  M on RHEL */.../
178b0 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74  * Bug 594911: ht
178c0 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72  tps://bugzilla.r
178d0 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62  edhat.com/show_b
178e0 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31  ug.cgi?id=594911
178f0 20 2a 2f 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b   */...pSlotList[
17900 63 75 72 72 73 6c 6f 74 5d 20 3d 20 63 75 72 72  currslot] = curr
17910 73 6c 6f 74 20 2b 20 31 3b 0a 09 7d 0a 0a 09 2a  slot + 1;..}...*
17920 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
17930 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  count;...CACKEY_
17940 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17950 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
17960 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
17970 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f  readers.", CKR_O
17980 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  K, (unsigned lon
17990 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a  g) slot_count);.
179a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
179b0 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74  ;...tokenPresent
179c0 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b   = tokenPresent;
179d0 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
179e0 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
179f0 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
17a00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
17a10 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66  RV, C_GetSlotInf
17a20 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
17a30 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e  otID, CK_SLOT_IN
17a40 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
17a50 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
17a60 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74  HAR slotDescript
17a70 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20  ion[] = "CACKey 
17a80 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65  Slot";..int mute
17a90 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62  x_retval;..int b
17aa0 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09  ytes_to_copy;...
17ab0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17ac0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
17ad0 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
17ae0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
17af0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17b00 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
17b10 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
17b20 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
17b30 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
17b40 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
17b50 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
17b60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17b70 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
17b80 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
17b90 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
17ba0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
17bb0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
17bc0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
17bd0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
17be0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
17bf0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
17c00 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
17c10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17c20 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
17c30 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
17c40 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
17c50 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
17c60 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
17c70 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
17c80 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
17c90 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
17ca0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
17cb0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
17cc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
17cd0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
17ce0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17cf0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
17d00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17d10 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
17d20 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
17d30 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
17d40 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
17d50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17d60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17d70 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
17d80 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
17d90 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
17da0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
17db0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
17dc0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
17dd0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
17de0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
17df0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
17e00 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
17e10 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56  KF_REMOVABLE_DEV
17e20 49 43 45 20 7c 20 43 4b 46 5f 48 57 5f 53 4c 4f  ICE | CKF_HW_SLO
17e30 54 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  T;...if (cackey_
17e40 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63  token_present(&c
17e50 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
17e60 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50  ID]) == CACKEY_P
17e70 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
17e80 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66  NT) {...pInfo->f
17e90 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45  lags |= CKF_TOKE
17ea0 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09  N_PRESENT;..}...
17eb0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
17ec0 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c  strlen(cackey_sl
17ed0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
17ee0 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73  _reader);..if (s
17ef0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
17f00 75 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 62  ufacturerID) < b
17f10 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
17f20 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
17f30 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  = sizeof(pInfo->
17f40 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b  manufacturerID);
17f50 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ..}..memcpy(pInf
17f60 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
17f70 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  D, cackey_slots[
17f80 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61  slotID].pcsc_rea
17f90 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  der, bytes_to_co
17fa0 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  py);...mutex_ret
17fb0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
17fc0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
17fd0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
17fe0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
17ff0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18000 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18010 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
18020 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
18030 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
18040 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73  RROR);..}...mems
18050 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  et(pInfo->slotDe
18060 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20  scription, ' ', 
18070 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c  sizeof(pInfo->sl
18080 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b  otDescription));
18090 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
180a0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
180b0 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e   slotDescription
180c0 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73  , sizeof(slotDes
180d0 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
180e0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
180f0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
18100 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
18110 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
18120 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61  D));...pInfo->ha
18130 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rdwareVersion.ma
18140 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
18150 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
18160 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
18170 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
18180 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65  n.minor = (cacke
18190 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
181a0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
181b0 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
181c0 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78  rsion.major = 0x
181d0 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d  00;..pInfo->firm
181e0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
181f0 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b  r = 0x00;...CACK
18200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18210 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
18220 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
18230 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
18240 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
18250 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
18260 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29   C_GetTokenInfo)
18270 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
18280 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46  ID, CK_TOKEN_INF
18290 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
182a0 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
182b0 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49  AR manufacturerI
182c0 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65  D[] = "U.S. Gove
182d0 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63  rnment";..static
182e0 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66   CK_UTF8CHAR def
182f0 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55  aultLabel[] = "U
18300 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09  nknown Token";..
18310 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
18320 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41  AR model[] = "CA
18330 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63  C Token";..struc
18340 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
18350 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
18360 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e  ntities;..unsign
18370 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74  ed long num_cert
18380 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65  s;..ssize_t labe
18390 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65  l_ret;..int mute
183a0 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75  x_retval;..int u
183b0 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
183c0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
183d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
183e0 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
183f0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
18400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18410 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
18420 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
18430 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
18440 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
18450 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
18460 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
18470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18480 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
18490 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
184a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
184b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
184c0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
184d0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
184e0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
184f0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
18500 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
18510 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
18520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18530 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
18540 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
18550 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
18560 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
18570 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
18580 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
18590 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
185a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
185b0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
185c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
185d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
185e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
185f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18600 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
18610 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
18620 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
18630 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
18640 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
18650 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
18660 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18680 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
18690 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
186a0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
186b0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
186c0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
186d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
186e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
186f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
18700 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
18710 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  }...if (cackey_t
18720 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
18730 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
18740 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  D]) != CACKEY_PC
18750 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
18760 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
18770 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74  BUG_PRINTF("No t
18780 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20  oken is present 
18790 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22  in slotID = %lu"
187a0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
187b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
187c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
187d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
187e0 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45  _TOKEN_NOT_PRESE
187f0 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  NT);..}...mutex_
18800 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
18810 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
18820 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
18830 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
18840 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
18850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18860 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
18870 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
18880 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
18890 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f  L_ERROR);..}.../
188a0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65  * Determine toke
188b0 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72  n label from cer
188c0 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65  tificates */..me
188d0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mset(pInfo->labe
188e0 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  l, ' ', sizeof(p
188f0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
18900 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
18910 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63  l = 1;...if (cac
18920 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
18930 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29  ].label == NULL)
18940 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69   {...pcsc_identi
18950 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
18960 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79  ad_certs(&cackey
18970 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
18980 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
18990 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64  );...if (pcsc_id
189a0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
189b0 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63  ) {....if (num_c
189c0 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09  erts > 0) {.....
189d0 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b  label_ret = cack
189e0 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
189f0 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69  _to_label(pcsc_i
18a00 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f  dentities, pInfo
18a10 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ->label, sizeof(
18a20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
18a30 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65  ....if (label_re
18a40 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73  t > 0) {......us
18a50 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20  e_default_label 
18a60 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65  = 0;.......cacke
18a70 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
18a80 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  label = malloc(s
18a90 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
18aa0 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63  el));.......memc
18ab0 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  py(cackey_slots[
18ac0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70  slotID].label, p
18ad0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
18ae0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
18af0 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ));.....}....}..
18b00 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
18b10 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
18b20 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
18b30 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65   1);...}..} else
18b40 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66   {...memcpy(pInf
18b50 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79  o->label, cackey
18b60 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
18b70 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
18b80 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09  fo->label));....
18b90 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
18ba0 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  l = 0;..}...if (
18bb0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
18bc0 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49  l) {...memcpy(pI
18bd0 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61  nfo->label, defa
18be0 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  ultLabel, sizeof
18bf0 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d  (defaultLabel) -
18c00 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74   1);..}...memset
18c10 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
18c20 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
18c30 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
18c40 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
18c50 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
18c60 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
18c70 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
18c80 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
18c90 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  D) - 1);...memse
18ca0 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  t(pInfo->model, 
18cb0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
18cc0 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d  o->model));..mem
18cd0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  cpy(pInfo->model
18ce0 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28  , model, sizeof(
18cf0 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d  model) - 1);...m
18d00 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72  emset(pInfo->ser
18d10 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20  ialNumber, ' ', 
18d20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65  sizeof(pInfo->se
18d30 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09  rialNumber));...
18d40 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74  memset(pInfo->ut
18d50 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65  cTime, ' ', size
18d60 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d  of(pInfo->utcTim
18d70 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61  e));...pInfo->ha
18d80 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rdwareVersion.ma
18d90 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
18da0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
18db0 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
18dc0 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
18dd0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65  n.minor = (cacke
18de0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
18df0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
18e00 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
18e10 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78  rsion.major = 0x
18e20 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d  00;..pInfo->firm
18e30 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
18e40 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66  r = 0x00;...pInf
18e50 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57  o->flags = CKF_W
18e60 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c  RITE_PROTECTED |
18e70 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e   CKF_USER_PIN_IN
18e80 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f  ITIALIZED | CKF_
18e90 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45  TOKEN_INITIALIZE
18ea0 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  D | cackey_slots
18eb0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
18ec0 6c 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75  lags;...pInfo->u
18ed0 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74  lMaxSessionCount
18ee0 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   = (sizeof(cacke
18ef0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
18f00 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
18f10 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09  ions[0])) - 1;..
18f20 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e  pInfo->ulSession
18f30 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41  Count = CK_UNAVA
18f40 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
18f50 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ON;..pInfo->ulMa
18f60 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  xRwSessionCount 
18f70 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52  = 0;..pInfo->ulR
18f80 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
18f90 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
18fa0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
18fb0 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20  fo->ulMaxPinLen 
18fc0 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75  = 128;..pInfo->u
18fd0 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a  lMinPinLen = 0;.
18fe0 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50  .pInfo->ulTotalP
18ff0 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b  ublicMemory = CK
19000 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
19010 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
19020 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65  ->ulFreePublicMe
19030 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
19040 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
19050 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74  N;..pInfo->ulTot
19060 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  alPrivateMemory 
19070 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
19080 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
19090 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76  Info->ulFreePriv
190a0 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  ateMemory = CK_U
190b0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
190c0 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59  MATION;...CACKEY
190d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
190e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
190f0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
19100 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
19110 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
19120 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
19130 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
19140 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  t)(CK_FLAGS flag
19150 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  s, CK_SLOT_ID_PT
19160 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f  R pSlotID, CK_VO
19170 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64  ID_PTR pReserved
19180 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
19190 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
191a0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65  .");...if (pRese
191b0 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rved != NULL) {.
191c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
191d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52  RINTF("Error. pR
191e0 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e  eserved is not N
191f0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
19200 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
19210 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
19220 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
19230 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
19240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19250 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
19260 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
19270 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
19280 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
19290 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54  ;..}.../* XXX: T
192a0 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74  ODO: Implement t
192b0 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45  his... */..CACKE
192c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
192d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
192e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
192f0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
19300 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
19310 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
19320 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
19330 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
19340 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
19350 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
19360 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28  tMechanismList)(
19370 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
19380 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
19390 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e  TYPE_PTR pMechan
193a0 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  ismList, CK_ULON
193b0 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
193c0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
193d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
193e0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
193f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
19400 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19410 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
19420 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
19430 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19440 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
19450 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
19460 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d  .if (pulCount ==
19470 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
19480 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19490 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74  Error.  pulCount
194a0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
194b0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
194c0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
194d0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69  if (pMechanismLi
194e0 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
194f0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 32 3b 0a 0a  *pulCount = 2;..
19500 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19510 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
19520 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
19530 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
19540 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
19550 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20  if (*pulCount < 
19560 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
19570 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19580 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73  r.  Buffer too s
19590 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  mall.");....retu
195a0 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  rn(CKR_BUFFER_TO
195b0 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70  O_SMALL);..}...p
195c0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d  MechanismList[0]
195d0 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b   = CKM_RSA_PKCS;
195e0 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  ..pMechanismList
195f0 5b 31 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52  [1] = CKM_SHA1_R
19600 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f  SA_PKCS;..*pulCo
19610 75 6e 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45  unt = 2;...CACKE
19620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19630 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
19640 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
19650 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
19660 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
19670 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
19680 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
19690 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
196a0 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
196b0 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43  ISM_TYPE type, C
196c0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f  K_MECHANISM_INFO
196d0 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
196e0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
196f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19700 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
19710 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
19720 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
19730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19740 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
19750 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
19760 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
19770 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
19780 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
19790 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
197a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
197b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
197c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
197d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
197e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
197f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
19800 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
19810 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
19820 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
19830 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
19840 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
19850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19860 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
19870 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
19880 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
19890 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
198a0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
198b0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
198c0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
198d0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
198e0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
198f0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
19900 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
19910 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
19920 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19930 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
19940 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
19950 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
19960 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
19970 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
19980 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
19990 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
199a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
199b0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
199c0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
199d0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
199e0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
199f0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
19a00 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
19a10 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
19a20 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
19a30 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
19a40 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
19a50 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
19a60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
19a70 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
19a80 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
19a90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19aa0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19ab0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
19ac0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19ad0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
19ae0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20  );..}.../* XXX: 
19af0 54 68 69 73 20 69 73 20 75 6e 74 65 73 74 65 64  This is untested
19b00 2c 20 61 6e 64 20 66 75 72 74 68 65 72 20 49 27  , and further I'
19b10 6d 20 6e 6f 74 20 72 65 61 6c 6c 79 20 73 75 72  m not really sur
19b20 65 20 69 66 20 74 68 69 73 20 69 73 20 63 6f 72  e if this is cor
19b30 72 65 63 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68  rect. */..switch
19b40 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65   (type) {...case
19b50 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
19b60 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65  ..pInfo->ulMinKe
19b70 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09  ySize = 512;....
19b80 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53  pInfo->ulMaxKeyS
19b90 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70  ize = 8192;....p
19ba0 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
19bb0 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59  F_HW | CKF_ENCRY
19bc0 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54  PT | CKF_DECRYPT
19bd0 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
19be0 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
19bf0 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ak;...case CKM_R
19c00 53 41 5f 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e  SA_X_509:....pIn
19c10 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
19c20 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
19c30 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
19c40 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
19c50 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
19c60 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
19c70 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
19c80 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
19c90 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
19ca0 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52  .case CKM_SHA1_R
19cb0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
19cc0 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
19cd0 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
19ce0 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
19cf0 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
19d00 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
19d10 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f   CKF_SIGN | CKF_
19d20 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b  VERIFY;....break
19d30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
19d40 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
19d50 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
19d60 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
19d70 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
19d80 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
19d90 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
19da0 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
19db0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
19dc0 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f  C_InitToken)(CK_
19dd0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
19de0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
19df0 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
19e00 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  lPinLen, CK_UTF8
19e10 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29  CHAR_PTR pLabel)
19e20 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
19e30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
19e40 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
19e50 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
19e60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19e70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19e80 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
19e90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
19ea0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
19eb0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
19ec0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19ed0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
19ee0 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
19ef0 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
19f00 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
19f10 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
19f20 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
19f30 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
19f40 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
19f50 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
19f60 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
19f70 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
19f80 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43  RV, C_InitPIN)(C
19f90 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
19fa0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
19fb0 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
19fc0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
19fd0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
19fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
19ff0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1a000 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1a010 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a020 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a030 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1a040 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1a050 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1a060 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1a070 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1a080 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1a090 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
1a0a0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
1a0b0 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
1a0c0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
1a0d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
1a0e0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
1a0f0 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
1a100 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
1a110 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
1a120 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1a130 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29  CK_RV, C_SetPIN)
1a140 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1a150 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1a160 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c  UTF8CHAR_PTR pOl
1a170 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dPin, CK_ULONG u
1a180 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  lOldPinLen, CK_U
1a190 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77  TF8CHAR_PTR pNew
1a1a0 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
1a1b0 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41  NewPinLen) {..CA
1a1c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a1d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1a1e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1a1f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1a200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a210 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1a220 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1a230 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1a240 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1a250 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1a260 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a270 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1a280 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1a290 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1a2a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1a2b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1a2c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1a2d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1a2e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1a2f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f  CTION(CK_RV, C_O
1a300 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  penSession)(CK_S
1a310 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1a320 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
1a330 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
1a340 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49  ication, CK_NOTI
1a350 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45  FY notify, CK_SE
1a360 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52  SSION_HANDLE_PTR
1a370 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75   phSession) {..u
1a380 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78  nsigned long idx
1a390 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1a3a0 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f  val;..int found_
1a3b0 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43  session = 0;...C
1a3c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a3d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1a3e0 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b  .if ((flags & CK
1a3f0 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
1a400 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f  ) != CKF_SERIAL_
1a410 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74  SESSION) {...ret
1a420 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1a430 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50  PARALLEL_NOT_SUP
1a440 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  PORTED);..}...if
1a450 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1a460 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1a470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a480 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1a490 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1a4a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1a4b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1a4c0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
1a4d0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
1a4e0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
1a4f0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1a500 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1a510 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1a520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a530 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1a540 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1a550 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
1a560 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
1a570 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
1a580 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1a590 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1a5a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1a5b0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1a5c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1a5d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1a5e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1a5f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a600 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1a610 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1a620 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1a630 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1a640 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
1a650 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
1a660 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1a670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a680 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1a690 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1a6a0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
1a6b0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
1a6c0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1a6d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1a6e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1a6f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1a700 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1a710 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
1a720 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61  at the card is a
1a730 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73  ctually in the s
1a740 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a  lot. */../* XXX:
1a750 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
1a760 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74  ure this is in t
1a770 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69  he PKCS#11 speci
1a780 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  fication */..if 
1a790 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
1a7a0 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
1a7b0 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
1a7c0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
1a7d0 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
1a7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a7f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72  NTF("Error.  Car
1a800 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20  d not present.  
1a810 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45  Returning CKR_DE
1a820 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a  VICE_REMOVED");.
1a830 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1a840 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1a850 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1a860 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  n(CKR_DEVICE_REM
1a870 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  OVED);..}...for 
1a880 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20  (idx = 1; idx < 
1a890 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1a8a0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1a8b0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1a8c0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1a8d0 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1a8e0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1a8f0 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f  ive) {....found_
1a900 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09  session = 1;....
1a910 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64  .*phSession = id
1a920 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  x;.....cackey_se
1a930 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
1a940 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65  ve = 1;....cacke
1a950 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1a960 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b  slotID = slotID;
1a970 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1a980 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d  ons[idx].state =
1a990 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
1a9a0 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65  ESSION;....cacke
1a9b0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1a9c0 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09  flags = flags;..
1a9d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1a9e0 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45  s[idx].ulDeviceE
1a9f0 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63  rror = 0;....cac
1aa00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1aa10 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d  ].pApplication =
1aa20 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09   pApplication;..
1aa30 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1aa40 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20  s[idx].Notify = 
1aa50 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b  notify;.....cack
1aa60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1aa70 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
1aa80 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  LL;....cackey_se
1aa90 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
1aaa0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
1aab0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1aac0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63  sions[idx].searc
1aad0 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
1aae0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1aaf0 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69  s[idx].sign_acti
1ab00 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
1ab10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1ab20 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
1ab30 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
1ab40 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
1ab50 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
1ab60 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
1ab70 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
1ab80 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
1ab90 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
1aba0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1abb0 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1abc0 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
1abd0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1abe0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1abf0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ac00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ac10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ac20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ac30 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1ac40 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ac50 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ac60 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1ac70 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20  !found_session) 
1ac80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ac90 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1aca0 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ng CKR_SESSION_C
1acb0 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f  OUNT (%i)", CKR_
1acc0 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
1acd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1ace0 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d  SSION_COUNT);..}
1acf0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ad00 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1ad10 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1ad20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1ad30 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1ad40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1ad50 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53  (CK_RV, C_CloseS
1ad60 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  ession)(CK_SESSI
1ad70 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1ad80 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  on) {..int mutex
1ad90 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1ada0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1adb0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1adc0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1add0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ade0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1adf0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1ae00 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1ae10 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1ae20 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1ae30 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1ae40 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1ae50 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1ae60 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1ae70 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1ae80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1ae90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1aea0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1aeb0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1aec0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1aed0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1aee0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1aef0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1af00 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1af10 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1af20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1af30 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1af40 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1af50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1af60 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1af70 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1af80 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1af90 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1afa0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1afb0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1afc0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1afd0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1afe0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1aff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b000 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1b010 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1b020 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1b030 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1b040 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1b050 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b060 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1b070 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72   = 0;..cackey_fr
1b080 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
1b090 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b0a0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1b0b0 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
1b0c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1b0d0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
1b0e0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1b0f0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1b100 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1b110 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1b120 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1b130 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b140 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1b150 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1b160 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b170 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1b180 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1b190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1b1a0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1b1b0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1b1c0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1b1d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1b1e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
1b1f0 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29  loseAllSessions)
1b200 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
1b210 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  ID) {..uint32_t 
1b220 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
1b230 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1b240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1b250 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1b260 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1b270 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1b280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b290 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1b2a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1b2b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1b2c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1b2d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
1b2e0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
1b2f0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1b300 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1b310 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1b320 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1b330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b340 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1b350 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1b360 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
1b370 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
1b380 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
1b390 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1b3a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1b3b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1b3c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1b3d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1b3e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1b3f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1b400 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b410 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1b420 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1b430 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1b440 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1b450 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1b460 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
1b470 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b480 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b490 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1b4a0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1b4b0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
1b4c0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
1b4d0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
1b4e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1b4f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1b500 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1b510 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1b520 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1b530 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
1b540 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1b550 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1b560 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
1b570 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
1b580 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1b590 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69  ].active) {....i
1b5a0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
1b5b0 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21  ns[idx].slotID !
1b5c0 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09  = slotID) {.....
1b5d0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
1b5e0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1b5f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1b600 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f  glock);....C_Clo
1b610 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
1b620 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1b630 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1b640 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ock);...}..}...m
1b650 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1b660 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1b670 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1b680 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1b690 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1b6a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b6b0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1b6c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1b6d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1b6e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1b6f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1b700 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1b710 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1b720 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1b730 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1b740 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1b750 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65  N(CK_RV, C_GetSe
1b760 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45  ssionInfo)(CK_SE
1b770 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1b780 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f  ssion, CK_SESSIO
1b790 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
1b7a0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
1b7b0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
1b7c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1b7d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1b7e0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
1b7f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b800 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
1b810 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
1b820 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1b830 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1b840 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1b850 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1b860 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b870 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1b880 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1b890 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1b8a0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1b8b0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1b8c0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1b8d0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1b8e0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1b8f0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1b900 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1b910 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1b920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b930 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1b940 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1b950 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1b960 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1b970 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1b980 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1b990 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1b9a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b9b0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1b9c0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1b9d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b9e0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1b9f0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1ba00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1ba10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1ba20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1ba30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ba40 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1ba50 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1ba60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ba70 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1ba80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ba90 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1baa0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1bab0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1bac0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1bad0 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f  ..}...pInfo->slo
1bae0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
1baf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1bb00 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e  slotID;..pInfo->
1bb10 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73  state = cackey_s
1bb20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1bb30 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d  ].state;..pInfo-
1bb40 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f  >flags = cackey_
1bb50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1bb60 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f  n].flags;..pInfo
1bb70 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20  ->ulDeviceError 
1bb80 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1bb90 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65  s[hSession].ulDe
1bba0 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74  viceError;...mut
1bbb0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1bbc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1bbd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1bbe0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1bbf0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1bc00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bc10 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1bc20 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1bc30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1bc40 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1bc50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bc60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1bc70 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1bc80 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1bc90 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1bca0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1bcb0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72  CK_RV, C_GetOper
1bcc0 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
1bcd0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1bce0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1bcf0 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
1bd00 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ate, CK_ULONG_PT
1bd10 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  R pulOperationSt
1bd20 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ateLen) {..CACKE
1bd30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bd40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1bd50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1bd60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1bd70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bd80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1bd90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1bda0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1bdb0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1bdc0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1bdd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1bde0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1bdf0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1be00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1be10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1be20 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1be30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1be40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1be50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1be60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f  ON(CK_RV, C_SetO
1be70 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
1be80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1be90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1bea0 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
1beb0 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
1bec0 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74   ulOperationStat
1bed0 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  eLen, CK_OBJECT_
1bee0 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69  HANDLE hEncrypti
1bef0 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  onKey, CK_OBJECT
1bf00 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74  _HANDLE hAuthent
1bf10 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43  icationKey) {..C
1bf20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bf30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1bf40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1bf50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1bf60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bf70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1bf80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1bf90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1bfa0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1bfb0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1bfc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bfd0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1bfe0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1bff0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1c000 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1c010 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1c020 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1c030 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1c040 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1c050 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1c060 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f  Login)(CK_SESSIO
1c070 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1c080 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20  n, CK_USER_TYPE 
1c090 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46  userType, CK_UTF
1c0a0 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
1c0b0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
1c0c0 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  n) {..CK_SLOT_ID
1c0d0 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
1c0e0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1c0f0 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
1c100 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74  ;..int login_ret
1c110 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1c120 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1c130 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1c140 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1c150 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c160 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c170 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1c180 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c190 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1c1a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1c1b0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1c1c0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1c1d0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1c1e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1c1f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1c200 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1c210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c220 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1c230 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1c240 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1c250 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1c260 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1c270 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20  ...if (userType 
1c280 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09  != CKU_USER) {..
1c290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c2a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65  INTF("Error.  We
1c2b0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53   only support US
1c2c0 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66  ER mode, asked f
1c2d0 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28  or %lu mode.", (
1c2e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1c2f0 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75  serType)....retu
1c300 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45  rn(CKR_USER_TYPE
1c310 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1c320 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1c330 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1c340 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1c350 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1c360 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1c370 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c380 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1c390 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1c3a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1c3b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1c3c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1c3d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1c3e0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1c3f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1c400 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1c410 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c430 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1c440 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1c450 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1c460 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1c470 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
1c480 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1c490 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
1c4a0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1c4b0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1c4c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1c4d0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1c4e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1c4f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c500 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c510 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1c520 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1c530 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1c540 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1c550 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1c560 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1c570 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1c580 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
1c590 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
1c5a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c5b0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1c5c0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1c5d0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
1c5e0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1c5f0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1c600 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1c610 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1c620 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1c630 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1c640 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65  );..}...login_re
1c650 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  t = cackey_login
1c660 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
1c670 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c  lotID], pPin, ul
1c680 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72  PinLen, &tries_r
1c690 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20 28  emaining);..if (
1c6a0 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  login_ret != CAC
1c6b0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
1c6c0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1c6d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1c6e0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c  glock);....if (l
1c6f0 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
1c700 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
1c710 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1c720 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c730 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
1c740 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ked.");.....cack
1c750 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1c760 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
1c770 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
1c780 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  KED;.....return(
1c790 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
1c7a0 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
1c7b0 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
1c7c0 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
1c7d0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1c7e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c7f0 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
1c800 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
1c810 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
1c820 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
1c830 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
1c840 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  W;.....if (tries
1c850 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29  _remaining == 1)
1c860 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
1c870 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
1c880 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
1c890 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52  SER_PIN_FINAL_TR
1c8a0 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  Y;....}.....retu
1c8b0 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
1c8c0 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  RECT);...}....CA
1c8d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c8e0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f  F("Error.  Unkno
1c8f0 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65  wn error returne
1c900 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f  d from cackey_lo
1c910 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67  gin() (%i)", log
1c920 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  in_ret);....retu
1c930 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1c940 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  RROR);..}...cack
1c950 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1c960 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20  .token_flags &= 
1c970 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c  ~(CKF_USER_PIN_L
1c980 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52  OCKED | CKF_USER
1c990 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c  _PIN_COUNT_LOW |
1c9a0 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
1c9b0 52 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  RED | CKF_USER_P
1c9c0 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a  IN_FINAL_TRY);..
1c9d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1c9e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
1c9f0 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46   = CKS_RO_USER_F
1ca00 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65  UNCTIONS;...mute
1ca10 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1ca20 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1ca30 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1ca40 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1ca50 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1ca60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ca70 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1ca80 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1ca90 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1caa0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1cab0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cac0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1cad0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1cae0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1caf0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1cb00 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1cb10 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28  K_RV, C_Logout)(
1cb20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1cb30 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
1cb40 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1cb50 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1cb60 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1cb70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1cb80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1cb90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1cba0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1cbb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cbc0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1cbd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1cbe0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1cbf0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1cc00 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1cc10 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1cc20 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1cc30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1cc40 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1cc50 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1cc60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cc70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1cc80 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1cc90 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1cca0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1ccb0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1ccc0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1ccd0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1cce0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1ccf0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1cd00 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1cd10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cd20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cd30 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1cd40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1cd50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1cd60 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1cd70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1cd80 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1cd90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1cda0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1cdb0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1cdc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cdd0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1cde0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1cdf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1ce00 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1ce10 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
1ce20 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
1ce30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1ce40 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
1ce50 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1ce60 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1ce70 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1ce80 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ce90 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1cea0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ceb0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1cec0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1ced0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1cee0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1cef0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1cf00 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1cf10 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1cf20 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1cf30 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1cf40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cf50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cf60 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1cf70 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1cf80 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1cf90 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1cfa0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1cfb0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1cfc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1cfd0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1cfe0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61  _ERROR);..}...ca
1cff0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1d000 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20  ession].state = 
1d010 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
1d020 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f 73  SSION;..cackey_s
1d030 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1d040 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
1d050 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a  OGIN_REQUIRED;..
1d060 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1d070 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1d080 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1d090 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1d0a0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1d0b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d0c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1d0d0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1d0e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d0f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1d100 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1d110 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1d120 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1d130 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1d140 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1d150 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1d160 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65  ION(CK_RV, C_Cre
1d170 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  ateObject)(CK_SE
1d180 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1d190 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
1d1a0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
1d1b0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
1d1c0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
1d1d0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
1d1e0 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
1d1f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1d200 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1d210 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1d220 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d230 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d240 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1d250 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d260 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1d270 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1d280 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1d290 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1d2a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1d2b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1d2c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1d2d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1d2e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1d2f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1d300 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1d310 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1d320 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65  K_RV, C_CopyObje
1d330 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
1d340 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1d350 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1d360 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
1d370 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
1d380 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
1d390 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
1d3a0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e  T_HANDLE_PTR phN
1d3b0 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  ewObject) {..CAC
1d3c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d3d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1d3e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1d3f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1d400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d410 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1d420 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1d430 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1d440 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1d450 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1d460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d470 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1d480 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1d490 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1d4a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1d4b0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1d4c0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1d4d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1d4e0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1d4f0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
1d500 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f  stroyObject)(CK_
1d510 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1d520 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1d530 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1d540 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
1d550 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1d560 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1d570 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1d580 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d590 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d5a0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1d5b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1d5c0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1d5d0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1d5e0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1d5f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1d600 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1d610 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1d620 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1d630 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1d640 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1d650 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1d660 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1d670 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1d680 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74  _RV, C_GetObject
1d690 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Size)(CK_SESSION
1d6a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1d6b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1d6c0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  LE hObject, CK_U
1d6d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65  LONG_PTR pulSize
1d6e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1d6f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1d700 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1d710 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1d720 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d730 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d740 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1d750 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d760 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1d770 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1d780 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d790 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1d7a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1d7b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1d7c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1d7d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1d7e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1d7f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1d800 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1d810 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1d820 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75  RV, C_GetAttribu
1d830 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
1d840 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1d850 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
1d860 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
1d870 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
1d880 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
1d890 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
1d8a0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
1d8b0 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74  rr_attr;..struct
1d8c0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1d8d0 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73   *identity;..uns
1d8e0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
1d8f0 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64  ity_idx, attr_id
1d900 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
1d910 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20  , num_ids;..int 
1d920 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43  mutex_retval;..C
1d930 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
1d940 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  R_OK;..CK_VOID_P
1d950 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
1d960 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
1d970 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d980 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d990 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1d9a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1d9b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d9c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1d9d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1d9e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d9f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1da00 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1da10 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1da20 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1da30 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1da40 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1da50 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1da60 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1da70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1da80 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1da90 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1daa0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1dab0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1dac0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1dad0 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d  ..if (hObject ==
1dae0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1daf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1db00 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
1db10 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
1db20 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1db30 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
1db40 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1db50 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20  .if (ulCount == 
1db60 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
1db70 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
1db80 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
1db90 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
1dba0 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
1dbb0 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45  ately */...CACKE
1dbc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1dbd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1dbe0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
1dbf0 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
1dc00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1dc10 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  K);..}...if (pTe
1dc20 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  mplate == NULL) 
1dc30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dc40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dc50 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55   pTemplate is NU
1dc60 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1dc70 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1dc80 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  AD);..}...identi
1dc90 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74  ty_idx = hObject
1dca0 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   - 1;...mutex_re
1dcb0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1dcc0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1dcd0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1dce0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1dcf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dd00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1dd10 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1dd20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1dd30 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1dd40 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1dd50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1dd60 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1dd70 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1dd80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1dd90 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1dda0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ddb0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1ddc0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1ddd0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1dde0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1ddf0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75  NVALID);..}...nu
1de00 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73  m_ids = cackey_s
1de10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1de20 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1de30 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  nt;...if (identi
1de40 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64  ty_idx >= num_id
1de50 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  s) {...cackey_mu
1de60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1de70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1de80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1de90 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
1dea0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
1deb0 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74   range.  identit
1dec0 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d  y_idx = %lu, num
1ded0 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75  _ids = %lu.", (u
1dee0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
1def0 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73  entity_idx, (uns
1df00 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f  igned long) num_
1df10 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ids);....return(
1df20 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
1df30 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1df40 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  .identity = &cac
1df50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1df60 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1df70 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b  s[identity_idx];
1df80 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
1df90 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
1dfa0 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69   ulCount; attr_i
1dfb0 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61  dx++) {...curr_a
1dfc0 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65  ttr = &pTemplate
1dfd0 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70  [attr_idx];....p
1dfe0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
1dff0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1e000 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41  _LONG) -1;....CA
1e010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e020 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  F("Looking for a
1e030 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78  ttribute 0x%08lx
1e040 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20   (identity:%lu) 
1e050 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1e060 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
1e070 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  >type, (unsigned
1e080 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
1e090 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65  idx);....for (se
1e0a0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
1e0b0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
1e0c0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
1e0d0 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
1e0e0 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
1e0f0 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
1e100 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1e110 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
1e120 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
1e130 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  pe) {.....CACKEY
1e140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1e150 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56  ... found it, pV
1e160 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c  alue = %p, ulVal
1e170 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64  ueLen = %lu", id
1e180 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
1e190 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1e1a0 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69  ].pValue, identi
1e1b0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
1e1c0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1e1d0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a  ValueLen);......
1e1e0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
1e1f0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
1e200 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1e210 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56  .pValue;.....ulV
1e220 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69  alueLen = identi
1e230 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
1e240 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1e250 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09  ValueLen;....}..
1e260 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61  .}....if (curr_a
1e270 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70  ttr->pValue && p
1e280 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28  Value) {....if (
1e290 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
1e2a0 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65  ueLen >= ulValue
1e2b0 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  Len) {.....memcp
1e2c0 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  y(curr_attr->pVa
1e2d0 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56  lue, pValue, ulV
1e2e0 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65  alueLen);....} e
1e2f0 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75  lse {.....ulValu
1e300 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
1e310 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c   -1;......retval
1e320 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
1e330 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09  O_SMALL;....}...
1e340 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e  }....curr_attr->
1e350 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
1e360 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75  alueLen;..}...mu
1e370 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1e380 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1e390 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e3a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1e3b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1e3c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e3d0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1e3e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1e3f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1e400 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1e410 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
1e420 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
1e430 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
1e440 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e450 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e460 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
1e470 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22  PE_INVALID (%i)"
1e480 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
1e490 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
1e4a0 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  val == CKR_BUFFE
1e4b0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
1e4c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e4d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e4e0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
1e4f0 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74  MALL (%i)", (int
1e500 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
1e510 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
1e520 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
1e530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e540 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1e550 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  OK (%i)", (int) 
1e560 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
1e570 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e580 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e590 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
1e5a0 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
1e5b0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1e5c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1e5d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41  ON(CK_RV, C_SetA
1e5e0 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
1e5f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1e600 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
1e610 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
1e620 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
1e630 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
1e640 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
1e650 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
1e660 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1e670 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1e680 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1e690 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e6a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e6b0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1e6c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e6d0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1e6e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1e6f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1e700 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e710 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1e720 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1e730 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1e740 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e750 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1e760 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e770 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1e780 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e790 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
1e7a0 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  tsInit)(CK_SESSI
1e7b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1e7c0 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
1e7d0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
1e7e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
1e7f0 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
1e800 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e  slotID;..CK_ULON
1e810 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
1e820 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1e830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e840 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e850 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1e860 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1e870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e880 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1e890 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1e8a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1e8b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1e8c0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
1e8d0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1e8e0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1e8f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1e900 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1e910 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1e920 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1e930 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e940 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1e950 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1e960 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1e970 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1e980 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1e990 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e9a0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1e9b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e9c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e9d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e9e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e9f0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1ea00 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ea10 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ea20 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1ea30 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1ea40 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1ea50 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1ea60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ea70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1ea80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ea90 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1eaa0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1eab0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1eac0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1ead0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1eae0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
1eaf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1eb00 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
1eb10 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1eb20 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1eb30 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1eb40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eb50 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c  rror.  Search al
1eb60 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b  ready active.");
1eb70 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1eb80 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
1eb90 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  E);..}...slotID 
1eba0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1ebb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
1ebc0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
1ebd0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1ebe0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1ebf0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1ec00 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1ec10 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1ec20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ec30 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1ec40 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1ec50 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1ec60 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1ec70 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1ec80 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1ec90 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1eca0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1ecb0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1ecc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ecd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1ece0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1ecf0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1ed00 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1ed10 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1ed20 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1ed30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1ed40 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1ed50 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1ed60 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
1ed70 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1ed80 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ID].slot_reset) 
1ed90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1eda0 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f  _PRINTF("The slo
1edb0 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74  t has been reset
1edc0 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c   since we last l
1edd0 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69  ooked for identi
1ede0 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69  ties -- rescanni
1edf0 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63  ng");....if (cac
1ee00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1ee10 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1ee20 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
1ee30 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
1ee40 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
1ee50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ee60 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
1ee70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1ee80 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1ee90 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61  s_count);.....ca
1eea0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1eeb0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1eec0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
1eed0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1eee0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1eef0 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  es_count = 0;...
1ef00 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
1ef10 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1ef20 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel != NULL) {..
1ef30 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
1ef40 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1ef50 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  l);....cackey_sl
1ef60 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1ef70 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
1ef80 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
1ef90 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
1efa0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a  slots[slotID]);.
1efb0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
1efc0 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
1efd0 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  t = 0;..}...if (
1efe0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1eff0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1f000 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
1f010 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1f020 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1f030 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
1f040 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
1f050 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
1f060 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73  otID], &cackey_s
1f070 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f080 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1f090 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54  nt);..}...if (pT
1f0a0 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29  emplate != NULL)
1f0b0 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
1f0c0 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
1f0d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f0e0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1f0f0 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75  ry_count = ulCou
1f100 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  nt;....cackey_se
1f110 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f120 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
1f130 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a  malloc(ulCount *
1f140 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
1f150 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79  te));.....memcpy
1f160 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1f170 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1f180 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61  h_query, pTempla
1f190 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69  te, ulCount * si
1f1a0 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
1f1b0 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d  );....for (idx =
1f1c0 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e   0; idx < ulCoun
1f1d0 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  t; idx++) {.....
1f1e0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  if (pTemplate[id
1f1f0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  x].ulValueLen ==
1f200 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65   0) {......cacke
1f210 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1f220 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1f230 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20  y[idx].pValue = 
1f240 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74  NULL;.......cont
1f250 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  inue;.....}.....
1f260 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1f270 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1f280 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
1f290 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65  lue = malloc(pTe
1f2a0 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
1f2b0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  lueLen);......if
1f2c0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
1f2d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1f2e0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
1f2f0 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  alue) {......mem
1f300 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
1f310 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1f320 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
1f330 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74  pValue, pTemplat
1f340 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  e[idx].pValue, p
1f350 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c  Template[idx].ul
1f360 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d  ValueLen);.....}
1f370 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
1f380 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1f390 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1f3a0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
1f3b0 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
1f3c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f3d0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
1f3e0 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65  = NULL;...}..} e
1f3f0 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  lse {...if (ulCo
1f400 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
1f410 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f420 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f430 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  k);.....CACKEY_D
1f440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f450 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72  or.  Search quer
1f460 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  y specified as N
1f470 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20  ULL, but number 
1f480 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e  of query terms n
1f490 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
1f4a0 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  0.");.....return
1f4b0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1f4c0 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  AD);...}....cack
1f4d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f4e0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1f4f0 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
1f500 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f510 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1f520 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
1f530 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
1f540 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1f550 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b  arch_active = 1;
1f560 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1f570 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1f580 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a  ch_curr_id = 0;.
1f590 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f5a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1f5b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f5c0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1f5d0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1f5e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f5f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1f600 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1f610 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f620 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1f630 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1f640 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1f650 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1f660 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1f670 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1f680 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1f690 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
1f6a0 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45  ndObjects)(CK_SE
1f6b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1f6c0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
1f6d0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62  _HANDLE_PTR phOb
1f6e0 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ject, CK_ULONG u
1f6f0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c  lMaxObjectCount,
1f700 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1f710 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a  lObjectCount) {.
1f720 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
1f730 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
1f740 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  ;..CK_ATTRIBUTE 
1f750 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f  *curr_attr;..CK_
1f760 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64  ULONG curr_id_id
1f770 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  x, curr_out_id_i
1f780 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64  dx, curr_attr_id
1f790 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
1f7a0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63  ;..CK_ULONG matc
1f7b0 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f  hed_count, prev_
1f7c0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09  matched_count;..
1f7d0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1f7e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1f7f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f800 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1f810 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f820 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f830 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f840 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f850 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f860 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f870 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f880 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43  ..if (pulObjectC
1f890 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
1f8a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f8b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
1f8c0 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73  ulObjectCount is
1f8d0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1f8e0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1f8f0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1f900 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
1f910 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74  L && ulMaxObject
1f920 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
1f930 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
1f940 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74  , if zero object
1f950 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
1f960 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65   return zero ite
1f970 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  ms immediately *
1f980 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  /...*pulObjectCo
1f990 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b  unt = 0;....CACK
1f9a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f9b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1f9c0 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
1f9d0 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
1f9e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f9f0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  OK);..}...if (ph
1fa00 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20  Object == NULL) 
1fa10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fa20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fa30 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c   phObject is NUL
1fa40 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1fa50 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1fa60 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d  D);..}...if (ulM
1fa70 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  axObjectCount ==
1fa80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1fa90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1faa0 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  or.  Maximum num
1fab0 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73  ber of objects s
1fac0 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f  pecified as zero
1fad0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fae0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1faf0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1fb00 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1fb10 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1fb20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1fb30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1fb40 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1fb50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fb60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fb70 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1fb80 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1fb90 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1fba0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1fbb0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1fbc0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1fbd0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1fbe0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1fbf0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1fc00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1fc10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fc20 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1fc30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1fc40 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1fc50 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
1fc60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1fc70 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
1fc80 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1fc90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1fca0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1fcb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fcc0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1fcd0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
1fce0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1fcf0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1fd00 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1fd10 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1fd20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1fd30 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
1fd40 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1fd50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1fd60 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1fd70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fd80 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
1fd90 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1fda0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
1fdb0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
1fdc0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 75 72  LIZED);..}...cur
1fdd0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30  r_out_id_idx = 0
1fde0 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ;..for (curr_id_
1fdf0 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  idx = cackey_ses
1fe00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1fe10 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20  search_curr_id; 
1fe20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61  curr_id_idx < ca
1fe30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1fe40 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1fe50 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61  es_count && ulMa
1fe60 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75  xObjectCount; cu
1fe70 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09  rr_id_idx++) {..
1fe80 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b  .curr_id = &cack
1fe90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1fea0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1feb0 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a  [curr_id_idx];..
1fec0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fed0 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e  RINTF("Processin
1fee0 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c  g identity:%lu",
1fef0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ff00 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a   curr_id_idx);..
1ff10 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  ..matched_count 
1ff20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72  = 0;....for (cur
1ff30 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  r_attr_idx = 0; 
1ff40 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20  curr_attr_idx < 
1ff50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ff60 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1ff70 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75  _query_count; cu
1ff80 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  rr_attr_idx++) {
1ff90 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64  ....prev_matched
1ffa0 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64  _count = matched
1ffb0 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72  _count;.....curr
1ffc0 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f  _attr = &cackey_
1ffd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ffe0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
1fff0 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a  curr_attr_idx];.
20000 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20010 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b  _PRINTF("  Check
20020 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74  ing for attribut
20030 65 20 30 78 25 30 38 6c 78 20 69 6e 20 69 64 65  e 0x%08lx in ide
20040 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 28 75  ntity:%i...", (u
20050 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
20060 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
20070 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
20080 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
20090 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
200a0 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66   Value looking f
200b0 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d  or:", curr_attr-
200c0 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74  >pValue, curr_at
200d0 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  tr->ulValueLen);
200e0 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61  .....for (sess_a
200f0 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73  ttr_idx = 0; ses
20100 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72  s_attr_idx < cur
20110 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
20120 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74  _count; sess_att
20130 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69  r_idx++) {.....i
20140 66 20 28 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  f (curr_id->attr
20150 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
20160 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75  _idx].type == cu
20170 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b  rr_attr->type) {
20180 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
20190 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e  UG_PRINTF("    .
201a0 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e  .. found matchin
201b0 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 09 09  g type ...");...
201c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
201d0 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e  PRINTBUF("    ..
201e0 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 63  . our value:", c
201f0 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
20200 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
20210 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69  ].pValue, curr_i
20220 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
20230 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
20240 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 09  alueLen);.......
20250 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
20260 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
20270 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
20280 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
20290 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c     ... found wil
202a0 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a  dcard match");..
202b0 09 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f  ......matched_co
202c0 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72  unt++;........br
202d0 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 20 09 09  eak;......}.. ..
202e0 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
202f0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ->ulValueLen == 
20300 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
20310 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
20320 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26  x].ulValueLen &&
20330 20 6d 65 6d 63 6d 70 28 63 75 72 72 5f 61 74 74   memcmp(curr_att
20340 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  r->pValue, curr_
20350 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
20360 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
20370 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61  alue, curr_id->a
20380 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
20390 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
203a0 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  Len) == 0) {....
203b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
203c0 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
203d0 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d  .. found exact m
203e0 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d  atch");........m
203f0 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a  atched_count++;.
20400 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
20410 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ...}.....}....}.
20420 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74  ..../* If the at
20430 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f  tribute could no
20440 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f  t be matched, do
20450 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63   not try to matc
20460 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74  h additional att
20470 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66  ributes */....if
20480 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63   (prev_matched_c
20490 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f  ount == matched_
204a0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65  count) {.....bre
204b0 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ak;....}...}....
204c0 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e  if (matched_coun
204d0 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  t == cackey_sess
204e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
204f0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
20500 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
20510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
20520 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62  .. All %i attrib
20530 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72  utes checked for
20540 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69   found, adding i
20550 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65  dentity:%i to re
20560 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69  turned list", (i
20570 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  nt) cackey_sessi
20580 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
20590 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
205a0 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f  , (int) curr_id_
205b0 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65  idx);.....phObje
205c0 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ct[curr_out_id_i
205d0 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64  dx] = curr_id_id
205e0 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78  x + 1;.....ulMax
205f0 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a  ObjectCount--;..
20600 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ...curr_out_id_i
20610 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  dx++;...} else {
20620 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20630 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e  _PRINTF("  ... N
20640 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20  ot all %i (only 
20650 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69 62  found %i) attrib
20660 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72  utes checked for
20670 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69   found, not addi
20680 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c  ng identity:%i",
20690 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
206a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
206b0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
206c0 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68  unt, (int) match
206d0 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  ed_count, (int) 
206e0 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09  curr_id_idx);...
206f0 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73  }..}..cackey_ses
20700 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20710 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
20720 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a   curr_id_idx;..*
20730 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
20740 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78   curr_out_id_idx
20750 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
20760 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20770 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20780 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
20790 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
207a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
207b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
207c0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
207d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
207e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
207f0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
20800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20810 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
20820 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73  %i), num objects
20830 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c   = %lu", CKR_OK,
20840 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74   *pulObjectCount
20850 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20860 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
20870 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
20880 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  , C_FindObjectsF
20890 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
208a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
208b0 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64  ) {..CK_ULONG id
208c0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
208d0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
208e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
208f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20900 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20910 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20920 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20930 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20940 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20950 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20960 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20970 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
20980 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
20990 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
209a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
209b0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
209c0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
209d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
209e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
209f0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
20a00 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
20a10 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20a20 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
20a30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
20a40 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20a50 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
20a60 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
20a70 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
20a80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20a90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20aa0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
20ab0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20ac0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20ad0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
20ae0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20af0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
20b00 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20b10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20b20 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
20b30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20b40 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
20b50 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
20b60 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
20b70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
20b80 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
20b90 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
20ba0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
20bb0 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
20bc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20bd0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20be0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
20bf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20c00 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61  r.  Search not a
20c10 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
20c20 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
20c30 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
20c40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  ZED);..}...cacke
20c50 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20c60 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
20c70 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69  ve = 0;...for (i
20c80 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61  dx = 0; idx < ca
20c90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20ca0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
20cb0 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b  uery_count; idx+
20cc0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
20cd0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20ce0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
20cf0 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b  y[idx].pValue) {
20d00 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
20d10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20d20 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
20d30 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09  idx].pValue);...
20d40 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  }..}...if (cacke
20d50 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20d60 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
20d70 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  y) {...free(cack
20d80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20d90 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
20da0 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ry);..}...mutex_
20db0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20dc0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20dd0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20de0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20df0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20e00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20e10 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
20e20 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20e30 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20e40 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
20e50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20e60 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20e70 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
20e80 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
20e90 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
20ea0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20eb0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69  RV, C_EncryptIni
20ec0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
20ed0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
20ee0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
20ef0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
20f00 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
20f10 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
20f20 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20f30 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
20f40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
20f50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20f60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20f70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
20f80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20f90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20fa0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20fb0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20fc0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20fd0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
20fe0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
20ff0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
21000 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21010 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
21020 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21030 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
21040 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
21050 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28  _RV, C_Encrypt)(
21060 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
21070 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
21080 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
21090 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
210a0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
210b0 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
210c0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
210d0 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29  ncryptedDataLen)
210e0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
210f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
21100 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
21110 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
21120 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21130 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21140 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
21150 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21160 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
21170 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21180 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21190 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
211a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
211b0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
211c0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
211d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
211e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
211f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21200 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
21210 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
21220 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61  V, C_EncryptUpda
21230 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
21240 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
21250 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
21260 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
21270 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
21280 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
21290 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
212a0 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
212b0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
212c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
212d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
212e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
212f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21300 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21310 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21320 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21330 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21340 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21350 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21360 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21370 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21380 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21390 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
213a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
213b0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
213c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
213d0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
213e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
213f0 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
21400 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
21410 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
21420 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
21430 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72  LastEncryptedPar
21440 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
21450 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64  pulLastEncrypted
21460 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
21470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21480 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
21490 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
214a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
214b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
214c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
214d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
214e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
214f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
21500 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
21510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21520 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
21530 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21540 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
21550 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21560 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
21570 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
21580 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
21590 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
215a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
215b0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
215c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
215d0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
215e0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
215f0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
21600 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
21610 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
21620 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
21630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21640 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21650 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21660 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21680 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21690 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
216a0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
216b0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
216c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
216d0 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
216e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
216f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21700 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
21710 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
21720 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
21730 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
21740 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
21750 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
21760 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
21770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21780 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
21790 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
217a0 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
217b0 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
217c0 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
217d0 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
217e0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
217f0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
21800 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
21810 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
21820 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
21830 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
21840 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
21850 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21860 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
21870 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
21880 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
21890 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
218a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
218b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
218c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
218d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
218e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
218f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21910 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
21920 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
21930 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
21940 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
21950 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
21960 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
21970 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
21980 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21990 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
219a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
219b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
219c0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
219d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
219e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
219f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
21a00 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
21a10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
21a20 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
21a30 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21a40 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21a50 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21a60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21a70 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
21a80 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
21a90 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
21aa0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
21ab0 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
21ac0 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
21ad0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21ae0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
21af0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
21b00 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21b10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21b20 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21b30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21b40 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
21b50 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73  of range (reques
21b60 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c  ted key %lu, onl
21b70 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73  y %lu identities
21b80 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28   available).", (
21b90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
21ba0 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
21bb0 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73  ong) cackey_sess
21bc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
21bd0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
21be0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21bf0 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  KEY_HANDLE_INVAL
21c00 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
21c10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21c20 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
21c30 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79  ve = 1;...cackey
21c40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21c50 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
21c60 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69  anism = pMechani
21c70 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  sm->mechanism;..
21c80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21c90 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
21ca0 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d  t_mech_parm = pM
21cb0 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d  echanism->pParam
21cc0 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65  eter;..cackey_se
21cd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21ce0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
21cf0 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69  rmlen = pMechani
21d00 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c  sm->ulParameterL
21d10 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  en;..cackey_sess
21d20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
21d30 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20  ecrypt_identity 
21d40 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
21d50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
21d60 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
21d70 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
21d80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21d90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21da0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21db0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
21dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21dd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
21de0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
21df0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21e00 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
21e10 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21e20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21e30 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
21e40 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
21e50 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
21e60 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
21e70 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
21e80 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
21e90 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
21ea0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
21eb0 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
21ec0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
21ed0 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  edDataLen, CK_BY
21ee0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
21ef0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61  _ULONG_PTR pulDa
21f00 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f  taLen) {..CK_ULO
21f10 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  NG datalen_updat
21f20 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  e, datalen_final
21f30 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74  ;..CK_RV decrypt
21f40 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
21f50 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
21f60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21f70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21f80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21f90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21fa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21fb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21fc0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21fd0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21fe0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21ff0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
22000 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  DataLen == NULL)
22010 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22020 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22030 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e   pulDataLen is N
22040 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
22050 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
22060 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c  BAD);..}...datal
22070 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c  en_update = *pul
22080 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79  DataLen;...decry
22090 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79  pt_ret = C_Decry
220a0 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69 6f  ptUpdate(hSessio
220b0 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  n, pEncryptedDat
220c0 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61  a, ulEncryptedDa
220d0 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64  taLen, pData, &d
220e0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a  atalen_update);.
220f0 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
22100 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
22110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22120 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
22130 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65 74  ryptUpdate() ret
22140 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
22150 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
22160 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72  igned long) decr
22170 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20  ypt_ret);....if 
22180 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20  (decrypt_ret != 
22190 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
221a0 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65  MALL) {..../* Te
221b0 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74 69  rminate decrypti
221c0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
221d0 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
221e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
221f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22200 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
22210 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22220 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
22230 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22240 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
22250 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
22260 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
22270 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
22280 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
22290 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
222a0 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
222b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
222c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
222d0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
222e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
222f0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
22300 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
22310 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
22320 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
22330 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
22340 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22350 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
22360 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
22370 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
22380 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22390 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
223a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
223b0 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
223c0 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
223d0 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
223e0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
223f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22400 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ..}.....cackey_s
22410 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22420 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
22430 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f   = 0;.....mutex_
22440 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
22450 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22460 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
22470 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22480 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
22490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
224a0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
224b0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
224c0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
224d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
224e0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ...}...}....retu
224f0 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b  rn(decrypt_ret);
22500 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29  ..}...if (pData)
22510 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61   {...pData += da
22520 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d  talen_update;..}
22530 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20  ..datalen_final 
22540 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20  = *pulDataLen - 
22550 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a  datalen_update;.
22560 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20  ..decrypt_ret = 
22570 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68  C_DecryptFinal(h
22580 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20  Session, pData, 
22590 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b  &datalen_final);
225a0 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
225b0 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
225c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
225d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
225e0 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74  cryptFinal() ret
225f0 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
22600 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
22610 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72  igned long) decr
22620 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ypt_ret);....ret
22630 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29  urn(decrypt_ret)
22640 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c  ;..}...*pulDataL
22650 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en = datalen_upd
22660 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69  ate + datalen_fi
22670 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  nal;...CACKEY_DE
22680 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22690 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
226a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
226b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
226c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
226d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
226e0 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
226f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22700 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
22710 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
22720 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
22730 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
22740 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
22750 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
22760 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
22770 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20  .static CK_BYTE 
22780 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69  buf[16384];..ssi
22790 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b  ze_t buflen;..CK
227a0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
227b0 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
227c0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
227d0 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  OR;..int mutex_r
227e0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
227f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22800 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
22810 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22820 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22840 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22850 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22860 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22870 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22880 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
22890 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
228a0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
228b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
228c0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
228d0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
228e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
228f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22900 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
22910 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
22920 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
22930 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
22940 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63  );..}...if (pEnc
22950 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55  ryptedPart == NU
22960 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65  LL && ulEncrypte
22970 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  dPartLen == 0) {
22980 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
22990 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
229a0 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e  ked to decrypt n
229b0 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
229c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
229d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
229e0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
229f0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
22a00 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
22a10 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
22a20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
22a30 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
22a40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22a50 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70  ("Error. pEncryp
22a60 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  tedPart is NULL,
22a70 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64   but ulEncrypted
22a80 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
22a90 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22aa0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
22ab0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e  );..}...if (ulEn
22ac0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
22ad0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
22ae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22af0 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64  ror. ulEncrypted
22b00 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
22b10 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
22b20 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
22b30 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
22b40 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
22b50 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c  ulPartLen == NUL
22b60 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
22b70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22b80 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73  r. pulPartLen is
22b90 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
22ba0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
22bb0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
22bc0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22bd0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22be0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22bf0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22c00 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22c10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22c20 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
22c30 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22c40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22c50 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
22c60 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22c70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
22c80 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
22c90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22ca0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
22cb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22cc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22cd0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
22ce0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
22cf0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
22d00 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
22d10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
22d20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22d30 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
22d40 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
22d50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22d60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
22d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22d80 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
22d90 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
22da0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
22db0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
22dc0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22dd0 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
22de0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22df0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
22e00 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
22e10 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
22e20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
22e30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
22e40 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
22e50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22e60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
22e70 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
22e80 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
22e90 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
22ea0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
22eb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22ec0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22ed0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
22ee0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
22ef0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
22f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22f10 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
22f20 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
22f30 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
22f40 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
22f50 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
22f60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22f70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22f80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22f90 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22fa0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
22fb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22fc0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
22fd0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
22fe0 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
22ff0 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20  ..../* Ask card 
23000 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09  to decrypt */...
23010 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  .buflen = cackey
23020 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
23030 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23040 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
23050 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
23060 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20  crypt_identity, 
23070 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
23080 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
23090 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  en, buf, sizeof(
230a0 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09  buf), 0, 1);....
230b0 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29  .if (buflen < 0)
230c0 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
230d0 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  tion failed. */.
230e0 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d  ....if (buflen =
230f0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
23100 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09  NEEDLOGIN) {....
23110 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55  ..retval = CKR_U
23120 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49  SER_NOT_LOGGED_I
23130 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  N;.....} else if
23140 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b   (buflen == CACK
23150 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
23160 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65  BSENT) {......re
23170 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43  tval = CKR_DEVIC
23180 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d  E_REMOVED;.....}
23190 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74   else {......ret
231a0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
231b0 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
231c0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
231d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
231e0 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74  flen) > *pulPart
231f0 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a  Len && pPart) {.
23200 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64  ..../* Decrypted
23210 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
23220 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  */.....retval = 
23230 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
23240 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20  MALL;....} else 
23250 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29  {.....if (pPart)
23260 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
23270 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65  Part, buf, bufle
23280 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a  n);.....}......*
23290 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66  pulPartLen = buf
232a0 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
232b0 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
232c0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
232d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
232e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
232f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23300 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
23310 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
23320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23330 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
23340 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
23350 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23360 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23370 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
23380 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23390 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
233a0 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
233b0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
233c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
233d0 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
233e0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
233f0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
23400 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
23410 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  LastPart, CK_ULO
23420 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61  NG_PTR pulLastPa
23430 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
23440 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
23450 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79   terminate_decry
23460 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59  pt = 1;...CACKEY
23470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23480 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23490 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
234a0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
234b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
234c0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
234d0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
234e0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
234f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23500 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
23510 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
23520 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
23530 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23540 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
23550 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
23560 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23570 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23580 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
23590 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
235a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
235b0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
235c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
235d0 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  LastPartLen == N
235e0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
235f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23600 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74  ror. pulLastPart
23610 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
23620 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
23630 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
23640 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
23650 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
23660 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23670 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
23680 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
23690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
236a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
236b0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
236c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
236d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
236e0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
236f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23700 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
23710 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23720 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23730 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
23740 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23750 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
23760 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
23770 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
23780 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
23790 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
237a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
237b0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
237c0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
237d0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
237e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
237f0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23800 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23810 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
23820 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
23830 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
23840 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
23850 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73  D);..}...*pulLas
23860 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09  tPartLen = 0;...
23870 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d  if (pLastPart ==
23880 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69   NULL) {...termi
23890 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30  nate_decrypt = 0
238a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
238b0 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a  nate_decrypt) {.
238c0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
238d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
238e0 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
238f0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
23900 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
23910 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23920 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
23930 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
23940 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23950 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23960 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
23970 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23980 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23990 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
239a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
239b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
239c0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
239d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
239e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
239f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
23a00 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f  _DigestInit)(CK_
23a10 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
23a20 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
23a30 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
23a40 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nism) {..CACKEY_
23a50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23a60 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23a70 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23a80 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23a90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23aa0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23ab0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23ac0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23ad0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23ae0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23af0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23b00 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
23b10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23b20 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
23b30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23b40 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
23b50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23b60 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
23b70 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23b80 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
23b90 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
23ba0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
23bb0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
23bc0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
23bd0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
23be0 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f   pDigest, CK_ULO
23bf0 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74  NG_PTR pulDigest
23c00 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
23c10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23c20 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23c30 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23c40 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23c50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23c60 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
23c70 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
23c80 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
23c90 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
23ca0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
23cb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23cc0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
23cd0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
23ce0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
23cf0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23d00 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
23d10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23d20 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
23d30 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23d40 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55  CK_RV, C_DigestU
23d50 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
23d60 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
23d70 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
23d80 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
23d90 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
23da0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23db0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
23dc0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
23dd0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
23de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23df0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
23e00 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
23e10 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
23e20 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
23e30 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
23e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23e50 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
23e60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23e70 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
23e80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23e90 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
23ea0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
23eb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
23ec0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
23ed0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
23ee0 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53  gestKey)(CK_SESS
23ef0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23f00 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
23f10 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
23f20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23f30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23f40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23f50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23f60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23f70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23f80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23f90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23fa0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
23fb0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
23fc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23fd0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23fe0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23ff0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
24000 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24010 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
24020 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
24030 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24040 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24050 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24060 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f  DigestFinal)(CK_
24070 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24080 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
24090 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
240a0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
240b0 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
240c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
240d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
240e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
240f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24100 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24110 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24120 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24130 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24140 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24150 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
24160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24170 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
24180 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24190 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
241a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
241b0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
241c0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
241d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
241e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
241f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
24200 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  nInit)(CK_SESSIO
24210 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
24220 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
24230 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
24240 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
24250 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75   hKey) {..int mu
24260 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b  tex_retval;...hK
24270 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ey--;...CACKEY_D
24280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
24290 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
242a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
242b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
242c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
242d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
242e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
242f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24300 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24310 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
24320 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  nism == NULL) {.
24330 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24340 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
24350 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c  echanism is NULL
24360 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24370 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
24380 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
24390 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
243a0 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  m != CKM_RSA_PKC
243b0 53 20 26 26 20 70 4d 65 63 68 61 6e 69 73 6d 2d  S && pMechanism-
243c0 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
243d0 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 29  M_SHA1_RSA_PKCS)
243e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
243f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24400 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
24410 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69  hanism not speci
24420 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f  fied as CKM_RSA_
24430 50 4b 43 53 20 6f 72 20 43 4b 4d 5f 53 48 41 31  PKCS or CKM_SHA1
24440 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
24450 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
24460 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
24470 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
24480 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
24490 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
244a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
244b0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
244c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
244d0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
244e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
244f0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
24500 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
24510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
24520 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
24530 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
24540 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24550 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
24560 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24570 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24580 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
245a0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
245b0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
245c0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
245d0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
245e0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
245f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
24600 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
24610 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24620 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
24630 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24640 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
24650 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
24660 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24670 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
24680 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
24690 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
246a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
246b0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
246c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
246d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
246e0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
246f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24700 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64  or.  Sign alread
24710 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
24720 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
24730 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
24740 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
24750 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
24760 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24770 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
24780 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
24790 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
247a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
247b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
247c0 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
247d0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
247e0 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
247f0 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
24800 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
24810 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
24820 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
24830 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
24840 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24850 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
24860 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
24870 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
24880 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
24890 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
248a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
248b0 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  gn_active = 1;..
248c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
248d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
248e0 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
248f0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
24900 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  m;...cackey_sess
24910 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24920 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38  ign_buflen = 128
24930 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
24940 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
24950 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09  n_bufused = 0;..
24960 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24970 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
24980 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  uf = malloc(size
24990 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
249a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
249b0 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
249c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
249d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
249e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
249f0 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e  _PRINTF("Session
24a00 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69   %lu sign_identi
24a10 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69  ty is %p (identi
24a20 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69  ty #%lu)", (unsi
24a30 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
24a40 69 6f 6e 2c 20 26 63 61 63 6b 65 79 5f 73 65 73  ion, &cackey_ses
24a50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24a60 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d  identities[hKey]
24a70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
24a80 29 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79  ) hKey);..cackey
24a90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24aa0 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
24ab0 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
24ac0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
24ad0 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b  dentities[hKey];
24ae0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
24af0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
24b00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24b10 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
24b20 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
24b30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24b40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24b50 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
24b60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24b70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24b80 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
24b90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24ba0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
24bb0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
24bc0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
24bd0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
24be0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
24bf0 69 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ign)(CK_SESSION_
24c00 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24c10 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
24c20 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
24c30 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
24c40 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
24c50 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
24c60 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
24c70 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
24c80 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
24c90 64 3b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72  d;..CK_RV sign_r
24ca0 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
24cb0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
24cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24cd0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24ce0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24cf0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24d00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24d10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24d20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24d30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24d40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24d50 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
24d60 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
24d70 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
24d80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
24d90 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
24da0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
24db0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24dc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24dd0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
24de0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
24df0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
24e00 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
24e10 29 3b 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69  );..}...start_si
24e20 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63  gn_bufused = cac
24e30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24e40 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
24e50 73 65 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20  sed;...sign_ret 
24e60 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68  = C_SignUpdate(h
24e70 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20  Session, pData, 
24e80 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20  ulDataLen);..if 
24e90 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
24ea0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
24eb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24ec0 72 6f 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65  ror.  SignUpdate
24ed0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
24ee0 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
24ef0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
24f00 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
24f10 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20  if (sign_ret != 
24f20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
24f30 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78  MALL) {....mutex
24f40 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24f50 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
24f60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
24f70 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
24f80 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   != 0) {.....CAC
24f90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24fa0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
24fb0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
24fc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24fd0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  ERAL_ERROR);....
24fe0 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
24ff0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25000 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
25010 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
25020 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25030 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
25040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25050 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
25060 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
25070 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
25080 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
25090 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d  E_INVALID);....}
250a0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
250b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
250c0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
250d0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
250e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
250f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
25100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25110 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
25120 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  gn not active.")
25130 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
25140 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
25150 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
25160 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
25170 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25180 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
25190 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65   0;.....mutex_re
251a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
251b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
251c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
251d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
251e0 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
251f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25200 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
25210 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
25220 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25230 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
25240 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  .}...}....return
25250 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a  (sign_ret);..}..
25260 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69  .sign_ret = C_Si
25270 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e  gnFinal(hSession
25280 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75  , pSignature, pu
25290 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a  lSignatureLen);.
252a0 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
252b0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20   CKR_OK) {...if 
252c0 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52  (sign_ret == CKR
252d0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
252e0 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  L) {....CACKEY_D
252f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67  EBUG_PRINTF("Sig
25300 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65  nFinal() returne
25310 64 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  d CKR_BUFFER_TOO
25320 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75  _SMALL (rv = %lu
25330 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67  ), undoing C_Sig
25340 6e 55 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73  nUpdate()", (uns
25350 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e  igned long) sign
25360 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65  _ret);.....cacke
25370 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25380 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
25390 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62  d = start_sign_b
253a0 75 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75  ufused;.....retu
253b0 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09  rn(sign_ret);...
253c0 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
253d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
253e0 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65    SignFinal() re
253f0 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
25400 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
25410 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
25420 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  n_ret);....retur
25430 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a  n(sign_ret);..}.
25440 0a 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65  ..if (pSignature
25450 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
25460 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25470 46 28 22 70 53 69 67 6e 61 74 75 72 65 20 73 70  F("pSignature sp
25480 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
25490 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55   undoing C_SignU
254a0 70 64 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61  pdate()");....ca
254b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
254c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
254d0 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67  used = start_sig
254e0 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65  n_bufused;....re
254f0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
25500 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
25510 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
25520 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
25530 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
25540 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
25550 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
25560 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
25570 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
25580 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
25590 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
255a0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
255b0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e  ulPartLen) {..in
255c0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
255d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
255e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
255f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25600 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25610 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25620 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25630 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25640 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25650 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25660 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25670 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
25680 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
25690 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
256a0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
256b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
256c0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
256d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
256e0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
256f0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
25700 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
25710 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
25720 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
25730 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55  .if (pPart == NU
25740 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20  LL && ulPartLen 
25750 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
25760 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65  rt circuit if we
25770 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69   are asked to si
25780 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f  gn nothing... */
25790 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
257a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
257b0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
257c0 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
257d0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
257e0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
257f0 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55  .if (pPart == NU
25800 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
25810 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25820 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c  or. pPart is NUL
25830 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e  L, but ulPartLen
25840 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09   is not 0.");...
25850 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
25860 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
25870 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d  .if (ulPartLen =
25880 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
25890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
258a0 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69  ror. ulPartLen i
258b0 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69  s 0, but pPart i
258c0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
258d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
258e0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
258f0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
25900 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
25910 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25920 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
25930 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
25940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25950 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
25960 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
25970 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25980 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
25990 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
259a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
259b0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
259c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
259d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
259e0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
259f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25a00 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
25a10 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
25a20 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
25a30 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
25a40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
25a50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25a60 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
25a70 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
25a80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25a90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25ab0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
25ac0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
25ad0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
25ae0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
25af0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
25b00 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79  ..switch (cackey
25b10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25b20 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69  on].sign_mechani
25b30 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  sm) {...case CKM
25b40 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
25b50 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65   Accumulate dire
25b60 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28  ctly */....if ((
25b70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25b80 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
25b90 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c  ufused + ulPartL
25ba0 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73  en) > cackey_ses
25bb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25bc0 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09  sign_buflen) {..
25bd0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
25be0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
25bf0 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a  n_buflen *= 2;..
25c00 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
25c10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
25c20 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63  gn_buf = realloc
25c30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25c40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
25c50 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63  buf, sizeof(*cac
25c60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25c70 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
25c80 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   * cackey_sessio
25c90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
25ca0 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a  n_buflen);....}.
25cb0 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
25cc0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25cd0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20  ion].sign_buf + 
25ce0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25cf0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
25d00 75 66 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75  ufused, pPart, u
25d10 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63  lPartLen);.....c
25d20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25d30 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
25d40 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c  fused += ulPartL
25d50 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  en;.....break;..
25d60 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52  .case CKM_SHA1_R
25d70 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 58  SA_PKCS:..../* X
25d80 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65 20 69  XX: Accumulate i
25d90 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 68 20  nto a SHA1 hash 
25da0 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  */....cackey_mut
25db0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25dc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
25dd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25de0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
25df0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25e00 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
25e10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25e20 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09  _SUPPORTED);....
25e30 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
25e40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25e50 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ED);....break;..
25e60 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
25e70 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
25e80 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25e90 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
25ea0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
25eb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25ec0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25ed0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
25ee0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
25ef0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
25f00 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
25f10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
25f20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
25f30 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
25f40 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
25f50 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
25f60 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25f70 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45  SignFinal)(CK_SE
25f80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25f90 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
25fa0 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
25fb0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
25fc0 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
25fd0 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73  static CK_BYTE s
25fe0 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73  igbuf[1024];..ss
25ff0 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b  ize_t sigbuflen;
26000 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
26010 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  tID;..CK_RV retv
26020 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
26030 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72  _ERROR;..int ter
26040 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
26050 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
26060 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
26070 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
26080 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
26090 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
260a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
260b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
260c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
260d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
260e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
260f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26100 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61  }...if (pulSigna
26110 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  tureLen == NULL)
26120 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26130 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26140 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
26150 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
26160 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
26170 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
26180 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
26190 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
261a0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
261b0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
261c0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
261d0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
261e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
261f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
26200 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
26210 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
26220 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
26230 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
26240 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
26250 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
26260 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26270 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
26280 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
26290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
262a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
262b0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
262c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
262d0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
262e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
262f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26300 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
26310 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26320 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26330 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
26340 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26350 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
26360 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
26370 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
26380 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
26390 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
263a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
263b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
263c0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
263d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
263e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
263f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26400 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
26410 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
26420 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
26430 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
26440 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
26450 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
26460 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26470 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
26480 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
26490 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
264a0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
264b0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
264c0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
264d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
264e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
264f0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
26500 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
26510 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
26520 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
26530 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
26540 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
26550 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
26560 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
26570 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
26580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26590 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
265a0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
265b0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
265c0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
265d0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
265e0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
265f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26600 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26610 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26620 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
26630 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26640 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
26650 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ism) {...case CK
26660 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  M_RSA_PKCS:..../
26670 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69  * Ask card to si
26680 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f  gn */....CACKEY_
26690 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73  DEBUG_PRINTF("As
266a0 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f  king to sign fro
266b0 6d 20 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e  m identity %p in
266c0 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 63   session %lu", c
266d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
266e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
266f0 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65  entity, (unsigne
26700 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
26710 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20  );....sigbuflen 
26720 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
26730 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
26740 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
26750 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26760 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
26770 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ity, cackey_sess
26780 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
26790 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f  ign_buf, cackey_
267a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
267b0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
267c0 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28   sigbuf, sizeof(
267d0 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a  sigbuf), 1, 0);.
267e0 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
267f0 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
26800 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20  Signing failed. 
26810 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75  */.....if (sigbu
26820 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
26830 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
26840 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
26850 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
26860 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
26870 6c 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65  lse if (sigbufle
26880 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
26890 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
268a0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
268b0 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
268c0 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ED;.....} else {
268d0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
268e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
268f0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
26900 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64  e if (((unsigned
26910 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
26920 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ) > *pulSignatur
26930 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75  eLen && pSignatu
26940 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67  re) {...../* Sig
26950 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ned data too lar
26960 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59  ge */.....CACKEY
26970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72  _DEBUG_PRINTF("r
26980 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
26990 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73  ER_TOO_SMALL;  s
269a0 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20  igbuflen = %lu, 
269b0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
269c0 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  = %lu", (unsigne
269d0 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
269e0 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
269f0 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  g) *pulSignature
26a00 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61  Len);......retva
26a10 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
26a20 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74  OO_SMALL;......t
26a30 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
26a40 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  0;....} else {..
26a50 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
26a60 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28  n = 0;......if (
26a70 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
26a80 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61  ...memcpy(pSigna
26a90 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69  ture, sigbuf, si
26aa0 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  gbuflen);.......
26ab0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
26ac0 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a   1;.....}......*
26ad0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
26ae0 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09  = sigbuflen;....
26af0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
26b00 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
26b10 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48  k;...case CKM_SH
26b20 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  A1_RSA_PKCS:....
26b30 2f 2a 20 58 58 58 3a 20 41 63 63 75 6d 75 6c 61  /* XXX: Accumula
26b40 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68  te into a SHA1 h
26b50 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ash */....cackey
26b60 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
26b70 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
26b80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26b90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26ba0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
26bb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
26bc0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
26bd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26be0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
26bf0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26c00 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61  PORTED);....brea
26c10 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  k;..}...if (term
26c20 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09  inate_sign) {...
26c30 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
26c40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
26c50 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65  gn_buf) {....fre
26c60 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
26c70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
26c80 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _buf);...}....ca
26c90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26ca0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
26cb0 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
26cc0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
26cd0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26ce0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26cf0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
26d00 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
26d10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26d20 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
26d30 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
26d40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26d50 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26d60 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26d70 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26d80 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
26d90 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
26da0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
26db0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
26dc0 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
26dd0 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
26de0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
26df0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
26e00 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
26e10 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
26e20 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
26e30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26e40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26e50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26e60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26e70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26e80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26e90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
26ea0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
26eb0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26ec0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
26ed0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26ee0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
26ef0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26f00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
26f10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26f20 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
26f30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26f40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
26f50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26f60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
26f70 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
26f80 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26f90 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
26fa0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
26fb0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
26fc0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
26fd0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
26fe0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
26ff0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
27000 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
27010 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
27020 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
27030 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27040 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27050 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
27060 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27070 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
27080 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
27090 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
270a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
270b0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
270c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
270d0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
270e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
270f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
27100 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27110 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
27120 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
27130 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74  RV, C_VerifyInit
27140 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27150 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27160 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
27170 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
27180 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
27190 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
271a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
271b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
271c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
271d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
271e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
271f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
27200 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27210 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
27220 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
27230 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27240 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
27250 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
27260 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
27270 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
27280 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27290 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
272a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
272b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
272c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
272d0 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b  RV, C_Verify)(CK
272e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
272f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
27300 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
27310 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
27320 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
27330 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
27340 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
27350 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
27360 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
27370 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
27380 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
27390 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
273a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
273b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
273c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
273d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
273e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
273f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27400 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
27410 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
27420 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
27430 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
27440 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27450 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
27460 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27470 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
27480 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
27490 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61  RV, C_VerifyUpda
274a0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
274b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
274c0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
274d0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
274e0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
274f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27500 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27510 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27520 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27530 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27540 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
27550 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
27560 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27570 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27580 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
27590 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
275a0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
275b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
275c0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
275d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
275e0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
275f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27600 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
27610 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27620 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
27630 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  yFinal)(CK_SESSI
27640 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
27650 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
27660 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
27670 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
27680 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
27690 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
276a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
276b0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
276c0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
276d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
276e0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
276f0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27700 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27710 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27720 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
27730 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
27740 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
27750 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
27760 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
27770 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27780 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
27790 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
277a0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
277b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
277c0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
277d0 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
277e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
277f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
27800 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
27810 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
27820 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
27830 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27840 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
27850 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
27860 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27880 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27890 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
278a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
278b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
278c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
278d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
278e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
278f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27900 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
27910 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27920 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
27930 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
27940 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27950 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27960 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27970 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43  VerifyRecover)(C
27980 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27990 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
279a0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
279b0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
279c0 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42  gnatureLen, CK_B
279d0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
279e0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
279f0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
27a00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27a10 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
27a20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
27a30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
27a40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27a50 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
27a60 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
27a70 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
27a80 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
27a90 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
27aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27ab0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
27ac0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27ad0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
27ae0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27af0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
27b00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27b10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
27b20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27b30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
27b40 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  stEncryptUpdate)
27b50 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
27b60 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
27b70 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
27b80 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
27b90 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
27ba0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
27bb0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
27bc0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
27bd0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
27be0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
27bf0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
27c00 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
27c10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27c20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27c30 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
27c40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27c50 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
27c60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
27c70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27c80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
27c90 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
27ca0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
27cb0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
27cc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27cd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
27ce0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27cf0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
27d00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
27d10 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67  RV, C_DecryptDig
27d20 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
27d30 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27d40 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
27d50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
27d60 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
27d70 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
27d80 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
27d90 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
27da0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
27db0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27dc0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
27dd0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
27de0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27df0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27e00 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27e10 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27e20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27e30 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27e40 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
27e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27e60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27e70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27e80 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
27e90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27ea0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
27eb0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
27ec0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27ed0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27ee0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27ef0 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
27f00 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
27f10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
27f20 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
27f30 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
27f40 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
27f50 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
27f60 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
27f70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
27f80 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
27f90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
27fa0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
27fb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
27fc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27fd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27fe0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
27ff0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28000 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
28010 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28020 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
28030 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28040 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
28050 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
28060 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
28070 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28080 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28090 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
280a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
280b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
280c0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56  K_RV, C_DecryptV
280d0 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
280e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
280f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
28100 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
28110 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
28120 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
28130 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
28140 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
28150 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
28160 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28170 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
28180 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
28190 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
281a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
281b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
281c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
281d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
281e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
281f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
28200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28210 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
28220 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28230 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
28240 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28250 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
28260 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
28270 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28280 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
28290 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
282a0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43  C_GenerateKey)(C
282b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
282c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
282d0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
282e0 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
282f0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
28300 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
28310 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
28320 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
28330 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
28340 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28350 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
28360 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
28370 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28380 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28390 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
283a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
283b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
283c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
283d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
283e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
283f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
28400 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
28410 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
28420 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
28430 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
28440 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28450 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
28460 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
28470 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
28480 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f  yPair)(CK_SESSIO
28490 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
284a0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
284b0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
284c0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
284d0 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c   pPublicKeyTempl
284e0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
284f0 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75  PublicKeyAttribu
28500 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52  teCount, CK_ATTR
28510 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61  IBUTE_PTR pPriva
28520 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  teKeyTemplate, C
28530 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74  K_ULONG ulPrivat
28540 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  eKeyAttributeCou
28550 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
28560 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69  NDLE_PTR phPubli
28570 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  cKey, CK_OBJECT_
28580 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69  HANDLE_PTR phPri
28590 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b  vateKey) {..CACK
285a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
285b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
285c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
285d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
285e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
285f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
28600 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
28610 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
28620 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
28630 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
28640 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
28650 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
28660 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
28670 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
28680 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28690 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
286a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
286b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
286c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
286d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61  ION(CK_RV, C_Wra
286e0 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
286f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
28700 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
28710 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
28720 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
28730 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  hWrappingKey, CK
28740 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
28750 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
28760 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
28770 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72  _ULONG_PTR pulWr
28780 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09  appedKeyLen) {..
28790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
287a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
287b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
287c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
287d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
287e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
287f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
28800 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
28810 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
28820 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
28830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28840 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
28850 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
28860 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
28870 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
28880 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
28890 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
288a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
288b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
288c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
288d0 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53  _UnwrapKey)(CK_S
288e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
288f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
28900 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
28910 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
28920 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e  ANDLE hUnwrappin
28930 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  gKey, CK_BYTE_PT
28940 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
28950 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65  K_ULONG ulWrappe
28960 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52  dKeyLen, CK_ATTR
28970 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
28980 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
28990 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
289a0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
289b0 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
289c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
289d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
289e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
289f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
28a00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28a10 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
28a20 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
28a30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
28a40 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
28a50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
28a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28a70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28a80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28a90 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
28aa0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28ab0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
28ac0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
28ad0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
28ae0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
28af0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
28b00 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45  DeriveKey)(CK_SE
28b10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
28b20 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
28b30 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
28b40 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
28b50 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43  NDLE hBaseKey, C
28b60 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
28b70 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
28b80 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43  ONG ulAttributeC
28b90 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
28ba0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
28bb0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
28bc0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28bd0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
28be0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
28bf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28c00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28c10 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
28c20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
28c30 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
28c40 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
28c50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28c60 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
28c70 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
28c80 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
28c90 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
28ca0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
28cb0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
28cc0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28cd0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
28ce0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
28cf0 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  RV, C_SeedRandom
28d00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28d10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28d20 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c  _BYTE_PTR pSeed,
28d30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64   CK_ULONG ulSeed
28d40 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
28d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
28d60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
28d70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
28d80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
28d90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28da0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
28db0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
28dc0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
28dd0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
28de0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
28df0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28e00 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
28e10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
28e20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
28e30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
28e40 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
28e50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
28e60 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
28e70 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
28e80 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
28e90 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  eRandom)(CK_SESS
28ea0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
28eb0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
28ec0 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b   pRandomData, CK
28ed0 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c  _ULONG ulRandomL
28ee0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
28ef0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
28f00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
28f10 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
28f20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28f30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28f40 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
28f50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28f60 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
28f70 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28f80 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
28f90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28fa0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
28fb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
28fc0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
28fd0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28fe0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28ff0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29000 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44  PORTED);.}../* D
29010 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
29020 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
29030 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29040 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
29050 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  tus)(CK_SESSION_
29060 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
29070 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
29080 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
29090 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
290a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
290b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
290c0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
290d0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
290e0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
290f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
29100 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
29110 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
29120 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
29130 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
29140 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
29150 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63   */.}../* Deprec
29160 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
29170 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29180 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e  ION(CK_RV, C_Can
29190 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f  celFunction)(CK_
291a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
291b0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
291c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
291d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
291e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
291f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29200 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
29210 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
29220 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
29230 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
29240 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
29250 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
29260 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
29270 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
29280 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
29290 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
292a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
292b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
292c0 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46  nctionList)(CK_F
292d0 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
292e0 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c  _PTR ppFunctionL
292f0 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54  ist) {..CK_FUNCT
29300 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75  ION_LIST_PTR pFu
29310 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
29320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29330 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
29340 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69  if (ppFunctionLi
29350 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
29360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29370 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75  NTF("Error. ppFu
29380 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55  nctionList is NU
29390 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
293a0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
293b0 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74  AD);..}...pFunct
293c0 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63  ionList = malloc
293d0 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69  (sizeof(*pFuncti
293e0 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e  onList));...pFun
293f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
29400 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
29410 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
29420 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
29430 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63  ) & 0xff;..pFunc
29440 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f  tionList->versio
29450 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
29460 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
29470 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
29480 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74  & 0xff;...pFunct
29490 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69  ionList->C_Initi
294a0 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61  alize = C_Initia
294b0 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
294c0 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65  List->C_Finalize
294d0 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09   = C_Finalize;..
294e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
294f0 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  _GetInfo = C_Get
29500 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
29510 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c  List->C_GetSlotL
29520 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c  ist = C_GetSlotL
29530 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
29540 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e  ist->C_GetSlotIn
29550 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e  fo = C_GetSlotIn
29560 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
29570 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  st->C_GetTokenIn
29580 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49  fo = C_GetTokenI
29590 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
295a0 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c  ist->C_WaitForSl
295b0 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74  otEvent = C_Wait
295c0 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70  ForSlotEvent;..p
295d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
295e0 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
295f0 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
29600 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  mList;..pFunctio
29610 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
29620 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65  anismInfo = C_Ge
29630 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a  tMechanismInfo;.
29640 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
29650 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f  C_InitToken = C_
29660 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e  InitToken;..pFun
29670 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
29680 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e  tPIN = C_InitPIN
29690 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
296a0 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53  ->C_SetPIN = C_S
296b0 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  etPIN;..pFunctio
296c0 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73  nList->C_OpenSes
296d0 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73  sion = C_OpenSes
296e0 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  sion;..pFunction
296f0 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73  List->C_CloseSes
29700 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65  sion = C_CloseSe
29710 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
29720 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c  nList->C_CloseAl
29730 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c  lSessions = C_Cl
29740 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a  oseAllSessions;.
29750 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
29760 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
29770 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49   = C_GetSessionI
29780 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
29790 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74  ist->C_GetOperat
297a0 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74  ionState = C_Get
297b0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
297c0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
297d0 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
297e0 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61  ate = C_SetOpera
297f0 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
29800 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
29810 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70  in = C_Login;..p
29820 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
29830 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75  Logout = C_Logou
29840 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
29850 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  t->C_CreateObjec
29860 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65  t = C_CreateObje
29870 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
29880 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74  st->C_CopyObject
29890 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b   = C_CopyObject;
298a0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
298b0 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74  >C_DestroyObject
298c0 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65   = C_DestroyObje
298d0 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
298e0 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53  st->C_GetObjectS
298f0 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63  ize = C_GetObjec
29900 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  tSize;..pFunctio
29910 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72  nList->C_GetAttr
29920 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47  ibuteValue = C_G
29930 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
29940 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
29950 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  ->C_SetAttribute
29960 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74  Value = C_SetAtt
29970 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
29980 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
29990 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d  indObjectsInit =
299a0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
299b0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
299c0 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
299d0 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  s = C_FindObject
299e0 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
299f0 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
29a00 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62  Final = C_FindOb
29a10 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75  jectsFinal;..pFu
29a20 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
29a30 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e  cryptInit = C_En
29a40 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e  cryptInit;..pFun
29a50 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
29a60 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  rypt = C_Encrypt
29a70 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
29a80 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  ->C_EncryptUpdat
29a90 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64  e = C_EncryptUpd
29aa0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
29ab0 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69  ist->C_EncryptFi
29ac0 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46  nal = C_EncryptF
29ad0 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
29ae0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49  List->C_DecryptI
29af0 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49  nit = C_DecryptI
29b00 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
29b10 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d  ist->C_Decrypt =
29b20 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75   C_Decrypt;..pFu
29b30 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
29b40 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
29b50 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  DecryptUpdate;..
29b60 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
29b70 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _DecryptFinal = 
29b80 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_DecryptFinal;.
29b90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
29ba0 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43  C_DigestInit = C
29bb0 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46  _DigestInit;..pF
29bc0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
29bd0 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74  igest = C_Digest
29be0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
29bf0 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  ->C_DigestUpdate
29c00 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61 74   = C_DigestUpdat
29c10 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
29c20 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d  t->C_DigestKey =
29c30 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70   C_DigestKey;..p
29c40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
29c50 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f  DigestFinal = C_
29c60 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46  DigestFinal;..pF
29c70 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
29c80 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  ignInit = C_Sign
29c90 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
29ca0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43  List->C_Sign = C
29cb0 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  _Sign;..pFunctio
29cc0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64  nList->C_SignUpd
29cd0 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ate = C_SignUpda
29ce0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
29cf0 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20  st->C_SignFinal 
29d00 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09  = C_SignFinal;..
29d10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
29d20 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
29d30 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
29d40 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
29d50 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
29d60 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  ver = C_SignReco
29d70 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
29d80 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69  ist->C_VerifyIni
29d90 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74  t = C_VerifyInit
29da0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
29db0 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56  ->C_Verify = C_V
29dc0 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f  erify;..pFunctio
29dd0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55  nList->C_VerifyU
29de0 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79  pdate = C_Verify
29df0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
29e00 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
29e10 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79  Final = C_Verify
29e20 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
29e30 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
29e40 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56  ecoverInit = C_V
29e50 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
29e60 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
29e70 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
29e80 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  r = C_VerifyReco
29e90 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
29ea0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63  ist->C_DigestEnc
29eb0 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44  ryptUpdate = C_D
29ec0 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
29ed0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
29ee0 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67  st->C_DecryptDig
29ef0 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  estUpdate = C_De
29f00 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
29f10 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
29f20 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  t->C_SignEncrypt
29f30 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45  Update = C_SignE
29f40 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
29f50 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
29f60 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
29f70 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56  ate = C_DecryptV
29f80 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
29f90 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
29fa0 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47  enerateKey = C_G
29fb0 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75  enerateKey;..pFu
29fc0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
29fd0 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20  nerateKeyPair = 
29fe0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
29ff0 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
2a000 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43  t->C_WrapKey = C
2a010 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  _WrapKey;..pFunc
2a020 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72  tionList->C_Unwr
2a030 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70  apKey = C_Unwrap
2a040 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
2a050 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79  ist->C_DeriveKey
2a060 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a   = C_DeriveKey;.
2a070 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2a080 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43  C_SeedRandom = C
2a090 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46  _SeedRandom;..pF
2a0a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2a0b0 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20  enerateRandom = 
2a0c0 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
2a0d0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2a0e0 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  ->C_GetFunctionS
2a0f0 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e  tatus = C_GetFun
2a100 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46  ctionStatus;..pF
2a110 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
2a120 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20  ancelFunction = 
2a130 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
2a140 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2a150 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  ->C_GetFunctionL
2a160 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  ist = C_GetFunct
2a170 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75  ionList;...*ppFu
2a180 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75  nctionList = pFu
2a190 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
2a1a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a1b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2a1c0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2a1d0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2a1e0 5f 4f 4b 29 3b 0a 7d 0a 0a                       _OK);.}..