Hex Artifact Content

Artifact ef984b4aebd5efb322127e6a64706cfe8dd2e22f:


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 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f  .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20  _CODE.#  define 
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30  VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66   GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20  initions */./** 
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66  Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20  ISO7816         
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47    0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38  L_PLATFORM   0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69  0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  ons **/.#define 
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78  RESPONSE      0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41  _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64  RY       0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20  R_UPDATE_BINARY 
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65      0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30  ECT            0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c  S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23  _AUTH     0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45  TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e       0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e  e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52  STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69  ENCE  0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65  8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43  STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a  ENAUTH  0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69  ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a  on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20  TAG_CERTIFICATE 
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65          0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20  ERT_ISSUE_DATE  
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20     0x71.#define 
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78  XPIRE_DATE    0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49  72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20  SCIS_AID_CCC    
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41               0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c  x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49   0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30  _AID        0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20  03, 0x08, 0x00, 
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30  0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a  , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20   PIV IDs */./** 
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20  Key Identifiers 
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d  (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f  3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69  UTH   0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20  3_KEY_SIGNATURE 
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23  KEYMGT    0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55  _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c  TH  0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69  gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32  -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f  TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23  _RSA1024  0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62  48  0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73  ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33   (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65  -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20   2) **/.#define 
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35  ID_PIVAUTH   0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64  F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30  EYMGT    0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e  xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30  _OID_CARDAUTH  0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a  x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65  ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e   of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a   of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73   Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23   above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50  define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20  DU_MTU          
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52       250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e  _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31  e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a  ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49  #  ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64  ME_H.#    includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69  e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f  c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73   = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63  void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63  time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72  ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61  (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73  _time);.}.#  els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45  d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64  BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64  }.#  endif..#  d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20  UG_PRINTF(x...) 
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72  { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20   buf_user[4096] 
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e  = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a  tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78  eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e  ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e  GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62  c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78  UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66  096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73  _user_p, *buf_us
1990: 65 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73  er_print; \..uns
19a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75  igned long buf_u
19b0: 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73  ser_size; \..uns
19c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42  igned char *TMPB
19d0: 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20  UF; \..unsigned 
19e0: 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74  long idx; \..int
19f0: 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c   snprintf_ret; \
1a00: 0a 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69  ..TMPBUF = (unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29  gned char *) (x)
1a20: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d  ; \..buf_user[0]
1a30: 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65   = 0; \..buf_use
1a40: 72 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66  r[2] = 0; \..buf
1a50: 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73  _user_p = buf_us
1a60: 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f  er; \..buf_user_
1a70: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75  size = sizeof(bu
1a80: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20  f_user); \..for 
1a90: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1aa0: 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a  (y); idx++) { \.
1ab0: 09 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73  ..if (buf_user_s
1ac0: 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09  ize <= 0) { \...
1ad0: 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c  .break; \...}; \
1ae0: 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  ...snprintf_ret 
1af0: 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75  = snprintf(buf_u
1b00: 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f  ser_p, buf_user_
1b10: 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20  size, ", %02x", 
1b20: 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a  TMPBUF[idx]); \.
1b30: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72  ..if (snprintf_r
1b40: 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09  et <= 0) { \....
1b50: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a  break; \...}; \.
1b60: 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20  ..buf_user_p += 
1b70: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
1b80: 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1b90: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b  -= snprintf_ret;
1ba0: 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73   \..}; \..buf_us
1bb0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
1bc0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1bd0: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 72 69   \..buf_user_pri
1be0: 6e 74 20 3d 20 62 75 66 5f 75 73 65 72 20 2b 20  nt = buf_user + 
1bf0: 32 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61  2; \..fprintf(ca
1c00: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1c10: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69   "[%lu]: %s():%i
1c20: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1c30: 7b 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59  {%s})\n", CACKEY
1c40: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
1c50: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
1c60: 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e  NE__, f, #x, (un
1c70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29  signed long) (y)
1c80: 2c 20 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74  , buf_user_print
1c90: 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63  ); \..fflush(cac
1ca0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b  key_debug_fd());
1cb0: 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 66   \.}.#  define f
1cc0: 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f  ree(x) { CACKEY_
1cd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52  DEBUG_PRINTF("FR
1ce0: 45 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76  EE(%p) (%s)", (v
1cf0: 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66  oid *) x, #x); f
1d00: 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69  ree(x); }..stati
1d10: 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64  c FILE *cackey_d
1d20: 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a  ebug_fd(void) {.
1d30: 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64  .static FILE *fd
1d40: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
1d50: 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66  logfile;...if (f
1d60: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  d != NULL) {...r
1d70: 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09  eturn(fd);..}...
1d80: 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74  /*.. * Log to st
1d90: 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73  derr initially s
1da0: 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62  o we can use deb
1db0: 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20  ugging within.. 
1dc0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1dd0: 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20  without getting 
1de0: 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65  into an infinite
1df0: 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d   loop.. */..fd =
1e00: 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69   stderr;...logfi
1e10: 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43  le = getenv("CAC
1e20: 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c  KEY_DEBUG_LOGFIL
1e30: 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c  E");..if (logfil
1e40: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e != NULL) {...C
1e50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e60: 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f  TF("Found enviro
1e70: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20  nment variable: 
1e80: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e90: 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63  ..logfile = strc
1ea0: 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29  hr(logfile, '=')
1eb0: 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20  ;...if (logfile 
1ec0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f  == NULL) {....lo
1ed0: 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22  gfile = getenv("
1ee0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1ef0: 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65  FILE");...} else
1f00: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b   {....logfile++;
1f10: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
1f20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1f30: 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66 69 6c  FILE..if (logfil
1f40: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c  e == NULL) {...l
1f50: 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45 59 5f  ogfile = CACKEY_
1f60: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09  DEBUG_LOGFILE;..
1f70: 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 6c  }.#endif...if (l
1f80: 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  ogfile != NULL) 
1f90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fa0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c  _PRINTF("Found l
1fb0: 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f  og file: %s", lo
1fc0: 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20  gfile);....fd = 
1fd0: 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22  fopen(logfile, "
1fe0: 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64  a");..}...if (fd
1ff0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64   == NULL) {...fd
2000: 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09   = stderr;..}...
2010: 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72  if (fd == stderr
2020: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2030: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2040: 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09  ning stderr");..
2050: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
2060: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2070: 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28  Returning %p", (
2080: 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a  void *) fd);..}.
2090: 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a  ..return(fd);.}.
20a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41  .static void *CA
20b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
20c0: 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69  MALLOC(size_t si
20d0: 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ze, const char *
20e0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
20f0: 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b  {..void *retval;
2100: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c  ...retval = mall
2110: 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69  oc(size);...fpri
2120: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
2130: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
2140: 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28 29  s():%i: MALLOC()
2150: 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59   = %p\n", CACKEY
2160: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
2170: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65  , func, line, re
2180: 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63  tval);..fflush(c
2190: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
21a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
21b0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
21c0: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
21d0: 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76  G_FUNC_REALLOC(v
21e0: 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74  oid *ptr, size_t
21f0: 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61   size, const cha
2200: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e  r *func, int lin
2210: 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76  e) {..void *retv
2220: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72  al;...retval = r
2230: 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65  ealloc(ptr, size
2240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
2250: 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72 69  != ptr) {...fpri
2260: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
2270: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
2280: 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43 28  s():%i: REALLOC(
2290: 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43  %p) = %p\n", CAC
22a0: 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d  KEY_DEBUG_GETTIM
22b0: 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c  E(), func, line,
22c0: 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09   ptr, retval);..
22d0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
22e0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a  ebug_fd());..}..
22f0: 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e  .if (retval == N
2300: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a  DEBUG_PRINTF(" *
2320: 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61  ** ERROR *** rea
2330: 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55  lloc returned NU
2340: 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22  LL (size = %lu)"
2350: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2360: 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65  ) size);..}...re
2370: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
2380: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41  .static char *CA
2390: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
23a0: 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61  STRDUP(const cha
23b0: 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68  r *ptr, const ch
23c0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69  ar *func, int li
23d0: 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74  ne) {..char *ret
23e0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
23f0: 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66  strdup(ptr);...f
2400: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
2410: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
2420: 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44 55  : %s():%i: STRDU
2430: 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c  P_MALLOC() = %p\
2440: 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  n", CACKEY_DEBUG
2450: 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63  _GETTIME(), func
2460: 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b  , line, retval);
2470: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
2480: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72  debug_fd());...r
2490: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
24a0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
24b0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
24c0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
24d0: 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  R(unsigned char 
24e0: 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28  tag) {..switch (
24f0: 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53  tag) {...case GS
2500: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a  CIS_TAG_CARDID:.
2510: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2520: 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09  _TAG_CARDID");..
2530: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2540: 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCC_VER:....retu
2550: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
2560: 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  C_VER");...case 
2570: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
2580: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
2590: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22  CIS_TAG_CCG_VER"
25a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
25b0: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09  TAG_CARDURL:....
25c0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
25d0: 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63  G_CARDURL");...c
25e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
25f0: 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  CS15:....return(
2600: 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31  "GSCIS_TAG_PKCS1
2610: 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  5");...case GSCI
2620: 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d  S_TAG_REG_DATA_M
2630: 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ODEL:....return(
2640: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44  "GSCIS_TAG_REG_D
2650: 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63  ATA_MODEL");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
2670: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  R_TABLE:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43  rn("GSCIS_TAG_AC
2690: 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  R_TABLE");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
26b0: 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e  _APDU:....return
26c0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
26d0: 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20  _APDU");...case 
26e0: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
26f0: 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  CTION:....return
2700: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  ("GSCIS_TAG_REDI
2710: 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  RECTION");...cas
2720: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a  e GSCIS_TAG_CT:.
2730: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2740: 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73  _TAG_CT");...cas
2750: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a  e GSCIS_TAG_ST:.
2760: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2770: 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73  _TAG_ST");...cas
2780: 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  e GSCIS_TAG_NEXT
2790: 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  CCC:....return("
27a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
27b0: 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  C");...case GSCI
27c0: 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09  S_TAG_FNAME:....
27d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
27e0: 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73  G_FNAME");...cas
27f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d  e GSCIS_TAG_MNAM
2800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2810: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b  CIS_TAG_MNAME");
2820: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2830: 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_LNAME:....retu
2840: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e  rn("GSCIS_TAG_LN
2850: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
2860: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a  CIS_TAG_SUFFIX:.
2870: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2880: 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09  _TAG_SUFFIX");..
2890: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
28a0: 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09  GOVT_AGENCY:....
28b0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
28c0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b  G_GOVT_AGENCY");
28d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
28e0: 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74  G_BUREAU:....ret
28f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
2900: 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20  UREAU");...case 
2910: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2920: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
2930: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  ("GSCIS_TAG_BURE
2940: 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  AU_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  e GSCIS_TAG_DEPT
2960: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
2970: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  ("GSCIS_TAG_DEPT
2980: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2990: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a  GSCIS_TAG_TITLE:
29a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
29b0: 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09  S_TAG_TITLE");..
29c0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
29d0: 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74  BUILDING:....ret
29e0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
29f0: 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73  UILDING");...cas
2a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2a10: 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74  CE_ADDR1:....ret
2a20: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2a30: 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09  FFICE_ADDR1");..
2a40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2a50: 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09  OFFICE_ADDR2:...
2a60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2a70: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22  AG_OFFICE_ADDR2"
2a80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2a90: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a  TAG_OFFICE_CITY:
2aa0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2ab0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2ac0: 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  Y");...case GSCI
2ad0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41  S_TAG_OFFICE_STA
2ae0: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
2af0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2b00: 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  STATE");...case 
2b10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b20: 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28  _ZIP:....return(
2b30: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b40: 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20  E_ZIP");...case 
2b50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b60: 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74  _COUNTRY:....ret
2b70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2b80: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b  FFICE_COUNTRY");
2b90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2ba0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a  G_OFFICE_PHONE:.
2bb0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2bc0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e  _TAG_OFFICE_PHON
2bd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2be0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2bf0: 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72  NE_EXT:....retur
2c00: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2c10: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b  ICE_PHONE_EXT");
2c20: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c30: 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09  G_OFFICE_FAX:...
2c40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2c50: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b  AG_OFFICE_FAX");
2c60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c70: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a  G_OFFICE_EMAIL:.
2c80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49  _TAG_OFFICE_EMAI
2ca0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  L");...case GSCI
2cb0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2cc0: 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  M:....return("GS
2cd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2ce0: 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53  OOM");...case GS
2cf0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2d00: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e  GENCY:....return
2d10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47  ("GSCIS_TAG_NONG
2d20: 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  OV_AGENCY");...c
2d30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53  ase GSCIS_TAG_SS
2d40: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09  N_DESIGNATOR:...
2d50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2d60: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
2d70: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2d80: 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65  S_TAG_SSN:....re
2d90: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2da0: 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  SSN");...case GS
2db0: 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09  CIS_TAG_DOB:....
2dc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2dd0: 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20  G_DOB");...case 
2de0: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52  GSCIS_TAG_GENDER
2df0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2e00: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b  IS_TAG_GENDER");
2e10: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2e20: 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74  G_USERID:....ret
2e30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55  urn("GSCIS_TAG_U
2e40: 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  SERID");...case 
2e50: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
2e60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2e70: 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b  IS_TAG_DOMAIN");
2e80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2e90: 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72  G_PASSWORD:....r
2ea0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2eb0: 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63  _PASSWORD");...c
2ec0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2ed0: 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  SUERID:....retur
2ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2ef0: 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  UERID");...case 
2f00: 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a  GSCIS_TAG_SERNO:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2f20: 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09  S_TAG_SERNO");..
2f30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f40: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72  ISSUE_DATE:....r
2f50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2f60: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
2f70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f80: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
2f90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2fa0: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b  G_EXPIRE_DATE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2fc0: 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09  G_CARD_TYPE:....
2fd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2fe0: 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09  G_CARD_TYPE");..
2ff0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3000: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09  SECURITY_CODE:..
3010: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
3020: 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44  TAG_SECURITY_COD
3030: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
3040: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44  S_TAG_CARDID_AID
3050: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3060: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49  IS_TAG_CARDID_AI
3070: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
3080: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
3090: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
30a0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
30b0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
30c0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53  CIS_TAG_CERT_ISS
30d0: 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  UE_DATE:....retu
30e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
30f0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  RT_ISSUE_DATE");
3100: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3110: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
3120: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
3130: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58  SCIS_TAG_CERT_EX
3140: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a  PIRE_DATE");..}.
3150: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
3160: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
3170: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3180: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
3190: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e  RDERR_TO_STR(LON
31a0: 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77  G retcode) {..sw
31b0: 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b  itch (retcode) {
31c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f  ...case SCARD_S_
31d0: 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75  SUCCESS:....retu
31e0: 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43  rn("SCARD_S_SUCC
31f0: 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ESS");...case SC
3200: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a  ARD_E_CANCELLED:
3210: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3220: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  D_E_CANCELLED");
3230: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3240: 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09  CANT_DISPOSE:...
3250: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3260: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b  _CANT_DISPOSE");
3270: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3280: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46  INSUFFICIENT_BUF
3290: 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FER:....return("
32a0: 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43  SCARD_E_INSUFFIC
32b0: 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09  IENT_BUFFER");..
32c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
32d0: 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65  VALID_ATR:....re
32e0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
32f0: 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63  VALID_ATR");...c
3300: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3310: 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72  LID_HANDLE:....r
3320: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3330: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b  NVALID_HANDLE");
3340: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3350: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45  INVALID_PARAMETE
3360: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
3370: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
3380: 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73  RAMETER");...cas
3390: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
33a0: 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74  D_TARGET:....ret
33b0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
33c0: 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09  ALID_TARGET");..
33d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
33e0: 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09  VALID_VALUE:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3400: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b  INVALID_VALUE");
3410: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3420: 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65  NO_MEMORY:....re
3430: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3440: 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73  _MEMORY");...cas
3450: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
3460: 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74  N_READER:....ret
3470: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
3480: 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09  NOWN_READER");..
3490: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49  .case SCARD_E_TI
34a0: 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e  MEOUT:....return
34b0: 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  ("SCARD_E_TIMEOU
34c0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  T");...case SCAR
34d0: 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  D_E_SHARING_VIOL
34e0: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  ATION:....return
34f0: 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  ("SCARD_E_SHARIN
3500: 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09  G_VIOLATION");..
3510: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3520: 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72  _SMARTCARD:....r
3530: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
3540: 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09  O_SMARTCARD");..
3550: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e  .case SCARD_E_UN
3560: 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72  KNOWN_CARD:....r
3570: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3580: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09  NKNOWN_CARD");..
3590: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52  .case SCARD_E_PR
35a0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09  OTO_MISMATCH:...
35b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
35c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22  _PROTO_MISMATCH"
35d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
35e0: 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09  E_NOT_READY:....
35f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3600: 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63  NOT_READY");...c
3610: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54  ase SCARD_E_SYST
3620: 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09  EM_CANCELLED:...
3630: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3640: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45  _SYSTEM_CANCELLE
3650: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3660: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54  D_E_NOT_TRANSACT
3670: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
3680: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53  CARD_E_NOT_TRANS
3690: 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20  ACTED");...case 
36a0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
36b0: 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72  NAVAILABLE:....r
36c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
36d0: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c  EADER_UNAVAILABL
36e0: 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  E");...case SCAR
36f0: 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_W_UNSUPPORTED_
3700: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
3710: 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f  "SCARD_W_UNSUPPO
3720: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  RTED_CARD");...c
3730: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45  ase SCARD_W_UNRE
3740: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09  SPONSIVE_CARD:..
3750: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3760: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
3770: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3780: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
3790: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37a0: 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52  "SCARD_W_UNPOWER
37b0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
37c0: 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  e SCARD_W_RESET_
37d0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37e0: 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43  "SCARD_W_RESET_C
37f0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3800: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41  ARD_W_REMOVED_CA
3810: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3820: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43  CARD_W_REMOVED_C
3830: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3840: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3850: 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ALL:....return("
3860: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3870: 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20  SMALL");...case 
3880: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3890: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
38a0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
38b0: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45  EADER_UNSUPPORTE
38c0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
38d0: 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45  D_E_DUPLICATE_RE
38e0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
38f0: 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41  "SCARD_E_DUPLICA
3900: 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  TE_READER");...c
3910: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44  ase SCARD_E_CARD
3920: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
3930: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3940: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45  _CARD_UNSUPPORTE
3950: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3960: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a  D_E_NO_SERVICE:.
3970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3980: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b  _E_NO_SERVICE");
3990: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
39a0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a  SERVICE_STOPPED:
39b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
39c0: 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50  D_E_SERVICE_STOP
39d0: 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  PED");...case SC
39e0: 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_E_UNSUPPORTE
39f0: 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65  D_FEATURE:....re
3a00: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e  turn("SCARD_E_UN
3a10: 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52  SUPPORTED_FEATUR
3a20: 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52  E");.#ifdef SCAR
3a30: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
3a40: 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  D...case SCARD_W
3a50: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a  _INSERTED_CARD:.
3a60: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3a70: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a80: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ");.#endif.#ifde
3a90: 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  f SCARD_E_NO_REA
3aa0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09  DERS_AVAILABLE..
3ab0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3ac0: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42  _READERS_AVAILAB
3ad0: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  LE:....return("S
3ae0: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52  CARD_E_NO_READER
3af0: 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23  S_AVAILABLE");.#
3b00: 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72  endif..}...retur
3b10: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
3b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3b30: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3b40: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
3b50: 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69  TR(uint16_t obji
3b60: 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62  d) {..switch (ob
3b70: 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78  jid) {...case 0x
3b80: 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  2000:....return(
3b90: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3ba0: 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b  D_GENERALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a  ...case 0x2100:.
3bc0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3bd0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50  Y_TLV_OBJID_PROP
3be0: 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09  ERSONALINFO");..
3bf0: 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09  .case 0x3000:...
3c00: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3c10: 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53  TLV_OBJID_ACCESS
3c20: 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73  CONTROL");...cas
3c30: 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74  e 0x4000:....ret
3c40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3c50: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09  OBJID_LOGIN");..
3c60: 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09  .case 0x5000:...
3c70: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3c80: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e  TLV_OBJID_CARDIN
3c90: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36  FO");...case 0x6
3ca0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3cb0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3cc0: 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09  _BIOMETRICS");..
3cd0: 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09  .case 0x7000:...
3ce0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
3d00: 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61  LSIGCERT");...ca
3d10: 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65  se 0x0200:....re
3d20: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d30: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3d40: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  N");...case 0x02
3d50: 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  02:....return("C
3d60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3d70: 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a  CAC_BENEFITS");.
3d80: 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09  ..case 0x0203:..
3d90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3da0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
3db0: 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a  THERBENEFITS");.
3dc0: 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09  ..case 0x0201:..
3dd0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3de0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3df0: 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61  ERSONNEL");...ca
3e00: 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65  se 0x02FE:....re
3e10: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3e20: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
3e30: 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75  RT");..}....retu
3e40: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
3e50: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3e60: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
3e70: 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54  G_FUNC_APPTYPE_T
3e80: 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70  O_STR(uint8_t ap
3e90: 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68  ptype) {..switch
3ea0: 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63   (apptype) {...c
3eb0: 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74  ase 0x00:....ret
3ec0: 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63  urn("NONE");...c
3ed0: 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74  ase 0x01:....ret
3ee0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3ef0: 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09  APP_GENERIC");..
3f00: 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72  .case 0x02:....r
3f10: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f20: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63  V_APP_SKI");...c
3f30: 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74  ase 0x03:....ret
3f40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3f50: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41  APP_GENERIC | CA
3f60: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
3f70: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a  ");...case 0x04:
3f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3f90: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
3fa0: 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09  ;...case 0x05:..
3fb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3fc0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3fd0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
3fe0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
3ff0: 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x06:....return(
4000: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
4010: 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  SKI | CACKEY_TLV
4020: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
4030: 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75  se 0x07:....retu
4040: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
4050: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43  PP_GENERIC | CAC
4060: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
4070: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
4080: 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  _PKI");..}...ret
4090: 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a  urn("INVALID");.
40a0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
40b0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
40c0: 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54  UG_FUNC_ATTRIBUT
40d0: 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52  E_TO_STR(CK_ATTR
40e0: 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72 29  IBUTE_TYPE attr)
40f0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74 72   {..switch (attr
4100: 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ) {...case CKA_C
4110: 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  LASS:....return(
4120: 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09  "CKA_CLASS");...
4130: 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a  case CKA_TOKEN:.
4140: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54  ...return("CKA_T
4150: 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  OKEN");...case C
4160: 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72  KA_PRIVATE:....r
4170: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41  eturn("CKA_PRIVA
4180: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TE");...case CKA
4190: 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72  _LABEL:....retur
41a0: 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a  n("CKA_LABEL");.
41b0: 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49  ..case CKA_APPLI
41c0: 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  CATION:....retur
41d0: 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49  n("CKA_APPLICATI
41e0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ON");...case CKA
41f0: 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72  _VALUE:....retur
4200: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a  n("CKA_VALUE");.
4210: 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43  ..case CKA_OBJEC
4220: 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  T_ID:....return(
4230: 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29  "CKA_OBJECT_ID")
4240: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ;...case CKA_CER
4250: 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
4260: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45  ..return("CKA_CE
4270: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22 29  RTIFICATE_TYPE")
4280: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53  ;...case CKA_ISS
4290: 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UER:....return("
42a0: 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09  CKA_ISSUER");...
42b0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
42c0: 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72  NUMBER:....retur
42d0: 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  n("CKA_SERIAL_NU
42e0: 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  MBER");...case C
42f0: 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09  KA_AC_ISSUER:...
4300: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f  .return("CKA_AC_
4310: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65  ISSUER");...case
4320: 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72   CKA_OWNER:....r
4330: 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52  eturn("CKA_OWNER
4340: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4350: 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65  TTR_TYPES:....re
4360: 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54  turn("CKA_ATTR_T
4370: 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43  YPES");...case C
4380: 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72  KA_TRUSTED:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54  eturn("CKA_TRUST
43a0: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ED");...case CKA
43b0: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65  _KEY_TYPE:....re
43c0: 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59  turn("CKA_KEY_TY
43d0: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PE");...case CKA
43e0: 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74  _SUBJECT:....ret
43f0: 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54  urn("CKA_SUBJECT
4400: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
4410: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4420: 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43  A_ID");...case C
4430: 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09  KA_SENSITIVE:...
4440: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e  .return("CKA_SEN
4450: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65  SITIVE");...case
4460: 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09   CKA_ENCRYPT:...
4470: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43  .return("CKA_ENC
4480: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
4490: 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72  KA_DECRYPT:....r
44a0: 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59  eturn("CKA_DECRY
44b0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
44c0: 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e  _WRAP:....return
44d0: 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09  ("CKA_WRAP");...
44e0: 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a  case CKA_UNWRAP:
44f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4500: 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65  UNWRAP");...case
4510: 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65   CKA_SIGN:....re
4520: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29  turn("CKA_SIGN")
4530: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ;...case CKA_SIG
4540: 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65  N_RECOVER:....re
4550: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52  turn("CKA_SIGN_R
4560: 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  ECOVER");...case
4570: 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09   CKA_VERIFY:....
4580: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49  return("CKA_VERI
4590: 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  FY");...case CKA
45a0: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a  _VERIFY_RECOVER:
45b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
45c0: 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29  VERIFY_RECOVER")
45d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52  ;...case CKA_DER
45e0: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
45f0: 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09  CKA_DERIVE");...
4600: 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44  case CKA_START_D
4610: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4620: 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29  CKA_START_DATE")
4630: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44  ;...case CKA_END
4640: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
4650: 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29  ("CKA_END_DATE")
4660: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
4670: 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  ULUS:....return(
4680: 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a  "CKA_MODULUS");.
4690: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
46a0: 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  US_BITS:....retu
46b0: 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f  rn("CKA_MODULUS_
46c0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
46d0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
46e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
46f0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
4700: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4710: 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e  _PRIVATE_EXPONEN
4720: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4730: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45  A_PRIVATE_EXPONE
4740: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4750: 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74  _PRIME_1:....ret
4760: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31  urn("CKA_PRIME_1
4770: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4780: 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72  RIME_2:....retur
4790: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29  n("CKA_PRIME_2")
47a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50  ;...case CKA_EXP
47b0: 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75  ONENT_1:....retu
47c0: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  rn("CKA_EXPONENT
47d0: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
47e0: 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09  _EXPONENT_2:....
47f0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f  return("CKA_EXPO
4800: 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65  NENT_2");...case
4810: 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54   CKA_COEFFICIENT
4820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4830: 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a  _COEFFICIENT");.
4840: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
4850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4860: 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65  _PRIME");...case
4870: 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09   CKA_SUBPRIME:..
4880: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4890: 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65  BPRIME");...case
48a0: 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65   CKA_BASE:....re
48b0: 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29  turn("CKA_BASE")
48c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
48d0: 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  ME_BITS:....retu
48e0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49  rn("CKA_PRIME_BI
48f0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
4900: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a  _SUB_PRIME_BITS:
4910: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4920: 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29  SUB_PRIME_BITS")
4930: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
4940: 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  UE_BITS:....retu
4950: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49  rn("CKA_VALUE_BI
4960: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
4970: 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72  _VALUE_LEN:....r
4980: 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45  eturn("CKA_VALUE
4990: 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  _LEN");...case C
49a0: 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a  KA_EXTRACTABLE:.
49b0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
49c0: 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09  XTRACTABLE");...
49d0: 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a  case CKA_LOCAL:.
49e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c  ...return("CKA_L
49f0: 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43  OCAL");...case C
4a00: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4a10: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
4a20: 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41  "CKA_NEVER_EXTRA
4a30: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  CTABLE");...case
4a40: 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53   CKA_ALWAYS_SENS
4a50: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ITIVE:....return
4a60: 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e  ("CKA_ALWAYS_SEN
4a70: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65  SITIVE");...case
4a80: 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43   CKA_KEY_GEN_MEC
4a90: 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72  HANISM:....retur
4aa0: 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  n("CKA_KEY_GEN_M
4ab0: 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61  ECHANISM");...ca
4ac0: 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  se CKA_MODIFIABL
4ad0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4ae0: 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a  A_MODIFIABLE");.
4af0: 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41  ..case CKA_ECDSA
4b00: 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75  _PARAMS:....retu
4b10: 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41  rn("CKA_ECDSA_PA
4b20: 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43  RAMS");...case C
4b30: 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09  KA_EC_POINT:....
4b40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50  return("CKA_EC_P
4b50: 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  OINT");...case C
4b60: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54  KA_SECONDARY_AUT
4b70: 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  H:....return("CK
4b80: 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48  A_SECONDARY_AUTH
4b90: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4ba0: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09  UTH_PIN_FLAGS:..
4bb0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55  ..return("CKA_AU
4bc0: 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a  TH_PIN_FLAGS");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45  ..case CKA_HW_FE
4be0: 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72  ATURE_TYPE:....r
4bf0: 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45  eturn("CKA_HW_FE
4c00: 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09  ATURE_TYPE");...
4c10: 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f  case CKA_RESET_O
4c20: 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72  N_INIT:....retur
4c30: 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  n("CKA_RESET_ON_
4c40: 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43  INIT");...case C
4c50: 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09  KA_HAS_RESET:...
4c60: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53  .return("CKA_HAS
4c70: 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65  _RESET");...case
4c80: 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49   CKA_VENDOR_DEFI
4c90: 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NED:....return("
4ca0: 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e  CKA_VENDOR_DEFIN
4cb0: 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ED");..}...retur
4cc0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
4cd0: 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f  .#  define mallo
4ce0: 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  c(x) CACKEY_DEBU
4cf0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c  G_FUNC_MALLOC(x,
4d00: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
4d10: 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72  E__).#  define r
4d20: 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43  ealloc(x, y) CAC
4d30: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52  KEY_DEBUG_FUNC_R
4d40: 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66  EALLOC(x, y, __f
4d50: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d60: 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75 70  .#  ifdef strdup
4d70: 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72 64  .#    undef strd
4d80: 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64  up.#  endif.#  d
4d90: 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29 20  efine strdup(x) 
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4db0: 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75  C_STRDUP(x, __fu
4dc0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a  nc__, __LINE__).
4dd0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
4de0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4df0: 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23  NTF(x...) /**/.#
4e00: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e10: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66  DEBUG_PRINTBUF(f
4e20: 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20  , x, y) /**/.#  
4e30: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4e40: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
4e90: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4ea0: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4eb0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4ec0: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
4ed0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4ee0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43  LED".#  define C
4ef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4f00: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
4f10: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4f20: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4f30: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4f40: 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
4f50: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4f60: 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LED".#endif../*.
4f70: 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 73 65   * Include these
4f80: 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20 69 6e   source files in
4f90: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f   this translatio
4fa0: 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74 20 77  n unit so that w
4fb0: 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a  e can bind to. *
4fc0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
4fd0: 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 73  ot include any s
4fe0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75  ymbols in the ou
4ff0: 74 70 75 74 20 73 68 61 72 65 64 20 6f 62 6a 65  tput shared obje
5000: 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65  ct.. */.#include
5010: 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23   "asn1-x509.c".#
5020: 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 63 22  include "sha1.c"
5030: 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63  .#include "md5.c
5040: 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  "..typedef enum 
5050: 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  {..CACKEY_ID_TYP
5060: 45 5f 45 52 52 4f 52 2c 0a 09 43 41 43 4b 45 59  E_ERROR,..CACKEY
5070: 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  _ID_TYPE_UNKNOWN
5080: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
5090: 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49  E_CAC,..CACKEY_I
50a0: 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43  D_TYPE_PIV,..CAC
50b0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
50c0: 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70  _ONLY.} cackey_p
50d0: 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74  csc_id_type;..st
50e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
50f0: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63  _identity {..cac
5100: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
5110: 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65   id_type;...size
5120: 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  _t certificate_l
5130: 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  en;..unsigned ch
5140: 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  ar *certificate;
5150: 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69  ...ssize_t keysi
5160: 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09  ze;...union {...
5170: 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69  struct {....unsi
5180: 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74  gned char applet
5190: 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74  [7];....uint16_t
51a0: 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a   file;...} cac;.
51b0: 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75  ...struct {....u
51c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79  nsigned char key
51d0: 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c 61 62  _id;....char lab
51e0: 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69 76 3b  el[32];...} piv;
51f0: 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74  ..} card;.};..st
5200: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
5210: 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63  tity {..struct c
5220: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
5230: 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
5240: 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55  ty;...CK_ATTRIBU
5250: 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a  TE *attributes;.
5260: 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62  .CK_ULONG attrib
5270: 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a  utes_count;.};..
5280: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
5290: 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74  ssion {..int act
52a0: 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49  ive;...CK_SLOT_I
52b0: 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53  D slotID;...CK_S
52c0: 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f  TATE state;..CK_
52d0: 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b  FLAGS flags;..CK
52e0: 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45  _ULONG ulDeviceE
52f0: 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  rror;..CK_VOID_P
5300: 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b  TR pApplication;
5310: 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69  ..CK_NOTIFY Noti
5320: 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  fy;...struct cac
5330: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
5340: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
5350: 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
5360: 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74  ies_count;...int
5370: 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a   search_active;.
5380: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54  .CK_ATTRIBUTE_PT
5390: 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a  R search_query;.
53a0: 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68  .CK_ULONG search
53b0: 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75  _query_count;..u
53c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61  nsigned long sea
53d0: 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69  rch_curr_id;...i
53e0: 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a  nt sign_active;.
53f0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59  .CK_MECHANISM_TY
5400: 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  PE sign_mechanis
5410: 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20  m;..CK_BYTE_PTR 
5420: 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67  sign_buf;..unsig
5430: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
5440: 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  flen;..unsigned 
5450: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65  long sign_bufuse
5460: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
5470: 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e  y_identity *sign
5480: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74  _identity;...int
5490: 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b   decrypt_active;
54a0: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  ..CK_MECHANISM_T
54b0: 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68  YPE decrypt_mech
54c0: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f  anism;..CK_VOID_
54d0: 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68  PTR decrypt_mech
54e0: 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _parm;..CK_ULONG
54f0: 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61   decrypt_mech_pa
5500: 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63  rmlen;..struct c
5510: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
5520: 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
5530: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
5540: 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20  key_slot {..int 
5550: 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74  active;..int int
5560: 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70  ernal;...char *p
5570: 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e  csc_reader;...in
5580: 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  t pcsc_card_conn
5590: 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e  ected;..SCARDHAN
55a0: 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a  DLE pcsc_card;..
55b0: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  .int transaction
55c0: 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61  _depth;..int tra
55d0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
55e0: 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f  _lock;...int slo
55f0: 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c  t_reset;...CK_FL
5600: 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  AGS token_flags;
5610: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
5620: 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44   *label;...DWORD
5630: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73   protocol;...uns
5640: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 64  igned int cached
5650: 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 73  _certs_count;..s
5660: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5670: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 68  c_identity *cach
5680: 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79  ed_certs;.};..ty
5690: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
56a0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
56b0: 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43 41  ERIC = 0x01,..CA
56c0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
56d0: 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43 41       = 0x02,..CA
56e0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
56f0: 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63 61       = 0x04.} ca
5700: 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65  ckey_tlv_apptype
5710: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
5720: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  {..CACKEY_TLV_OB
5730: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 20  JID_GENERALINFO 
5740: 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c 0a        = 0x2000,.
5750: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5760: 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46  D_PROPERSONALINF
5770: 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09 43  O   = 0x2100,..C
5780: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5790: 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20 20  ACCESSCONTROL   
57a0: 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41 43    = 0x3000,..CAC
57b0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f  KEY_TLV_OBJID_LO
57c0: 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  GIN             
57d0: 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x4000,..CACKE
57e0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
57f0: 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d 20  INFO          = 
5800: 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x5000,..CACKEY_
5810: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54  TLV_OBJID_BIOMET
5820: 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 30 78  RICS        = 0x
5830: 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  6000,..CACKEY_TL
5840: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
5850: 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 37 30  IGCERT    = 0x70
5860: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5870: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e  OBJID_CAC_PERSON
5880: 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 30 30          = 0x0200
5890: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
58a0: 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53  JID_CAC_BENEFITS
58b0: 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c 0a        = 0x0202,.
58c0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
58d0: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46  D_CAC_OTHERBENEF
58e0: 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09 43  ITS = 0x0203,..C
58f0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5900: 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20 20  CAC_PERSONNEL   
5910: 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41 43    = 0x0201,..CAC
5920: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5930: 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20 20  C_PKICERT       
5940: 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b 65  = 0x02FE.} cacke
5950: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b 0a  y_tlv_objectid;.
5960: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
5970: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54  .CACKEY_PCSC_S_T
5980: 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20 3d  OKENPRESENT    =
5990: 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   1,..CACKEY_PCSC
59a0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  _S_OK           
59b0: 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59 5f     = 0,..CACKEY_
59c0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
59d0: 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43 41         = -1,..CA
59e0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
59f0: 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d 32  IN          = -2
5a00: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
5a10: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20  _LOCKED         
5a20: 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f 50   = -3,..CACKEY_P
5a30: 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20  CSC_E_NEEDLOGIN 
5a40: 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41 43        = -4,..CAC
5a50: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
5a60: 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36 2c  ABSENT     = -6,
5a70: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5a80: 52 45 54 52 59 20 20 20 20 20 20 20 20 20 20 20  RETRY           
5a90: 3d 20 2d 37 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -7,..CACKEY_PC
5aa0: 53 43 5f 45 5f 4e 4f 44 41 54 41 20 20 20 20 20  SC_E_NODATA     
5ab0: 20 20 20 20 20 3d 20 2d 38 0a 7d 20 63 61 63 6b       = -8.} cack
5ac0: 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20  ey_ret;..struct 
5ad0: 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75  cackey_tlv_cardu
5ae0: 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  rl {..unsigned c
5af0: 68 61 72 20 20 20 20 20 20 20 20 72 69 64 5b 35  har        rid[5
5b00: 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61  ];..cackey_tlv_a
5b10: 70 70 74 79 70 65 20 20 20 61 70 70 74 79 70 65  pptype   apptype
5b20: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  ;..cackey_tlv_ob
5b30: 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64  jectid  objectid
5b40: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  ;..cackey_tlv_ob
5b50: 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09  jectid  appid;..
5b60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20  unsigned char   
5b70: 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a       pinid;.};..
5b80: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5b90: 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74  v_entity;.struct
5ba0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
5bb0: 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61  ty {..uint8_t ta
5bc0: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74  g;..size_t lengt
5bd0: 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76  h;...union {...v
5be0: 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74  oid *value;...st
5bf0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
5c00: 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63  cardurl *value_c
5c10: 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f  ardurl;...uint8_
5c20: 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d  t value_byte;..}
5c30: 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
5c40: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e  y_tlv_entity *_n
5c50: 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b  ext;.};../* CACK
5c60: 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65  EY Global Handle
5c70: 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
5c80: 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b   *cackey_biglock
5c90: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
5ca0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
5cb0: 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73  ssion cackey_ses
5cc0: 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74  sions[128];.stat
5cd0: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
5ce0: 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f  _slot cackey_slo
5cf0: 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ts[128];.static 
5d00: 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69  int cackey_initi
5d10: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74  alized = 0;.stat
5d20: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69  ic int cackey_bi
5d30: 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a  glock_init = 0;.
5d40: 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f  CK_C_INITIALIZE_
5d50: 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73  ARGS cackey_args
5d60: 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63 65 72  ;../** Extra cer
5d70: 74 69 66 69 63 61 74 65 73 20 74 6f 20 69 6e 63  tificates to inc
5d80: 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a  lude in token **
5d90: 2f 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  /.struct cackey_
5da0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 65 78  pcsc_identity ex
5db0: 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a  tra_certs[] = {.
5dc0: 23 69 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79  #include "cackey
5dd0: 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68  _builtin_certs.h
5de0: 22 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41  ".};..#define CA
5df0: 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55  CKEY_MACRO_DEFAU
5e00: 4c 54 5f 58 53 54 52 28 73 74 72 29 20 43 41 43  LT_XSTR(str) CAC
5e10: 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c  KEY_MACRO_DEFAUL
5e20: 54 5f 53 54 52 28 73 74 72 29 0a 23 64 65 66 69  T_STR(str).#defi
5e30: 6e 65 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  ne CACKEY_MACRO_
5e40: 44 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29  DEFAULT_STR(str)
5e50: 20 23 73 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63   #str../* Protec
5e60: 74 65 64 20 41 75 74 68 65 6e 74 69 63 61 74 69  ted Authenticati
5e70: 6f 6e 20 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20  on Path command 
5e80: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
5e90: 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
5ea0: 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52  nd = NULL;../* R
5eb0: 65 61 64 65 72 20 45 78 63 6c 75 73 69 6f 6e 20  eader Exclusion 
5ec0: 6f 72 20 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20  or Include-only 
5ed0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
5ee0: 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
5ef0: 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55  nclude_only = NU
5f00: 4c 4c 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20  LL;.static char 
5f10: 2a 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  *cackey_readers_
5f20: 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a  exclude = NULL;.
5f30: 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20  ./* PCSC Global 
5f40: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
5f50: 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54  c LPSCARDCONTEXT
5f60: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
5f70: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61  dle = NULL;..sta
5f80: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
5f90: 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73  g cackey_getvers
5fa0: 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61  ion(void) {..sta
5fb0: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
5fc0: 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a  g retval = 255;.
5fd0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d  .unsigned long m
5fe0: 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67  ajor = 0;..unsig
5ff0: 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d  ned long minor =
6000: 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72   0;..char *major
6010: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68  _str = NULL;..ch
6020: 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20  ar *minor_str = 
6030: 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  NULL;...CACKEY_D
6040: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6050: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65  led.");...if (re
6060: 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09  tval != 255) {..
6070: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6080: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
6090: 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22  0x%lx (cached)."
60a0: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  , retval);....re
60b0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d  turn(retval);..}
60c0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a  ...retval = 0;..
60d0: 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56  #ifdef PACKAGE_V
60e0: 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d  ERSION.        m
60f0: 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41  ajor_str = PACKA
6100: 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20  GE_VERSION;..if 
6110: 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20  (major_str) {.. 
6120: 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73         major = s
6130: 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72  trtoul(major_str
6140: 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30  , &minor_str, 10
6150: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f  );....if (minor_
6160: 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20  str) {....minor 
6170: 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f  = strtoul(minor_
6180: 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31  str + 1, NULL, 1
6190: 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  0);...}..}...ret
61a0: 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20  val = (major << 
61b0: 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20  16) | (minor << 
61c0: 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  8);.#endif...CAC
61d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
61e0: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c  ("Returning 0x%l
61f0: 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  x", retval);...r
6200: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
6210: 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74  ../* PC/SC Relat
6220: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
6230: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
6240: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
6250: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
6260: 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a  ct_all(void);. *
6270: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
6280: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
6290: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
62a0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
62b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
62c0: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e   function discon
62d0: 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63  nects from all c
62e0: 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ards.. *. */.sta
62f0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
6300: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6310: 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69  _all(void) {..ui
6320: 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
6330: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6340: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
6350: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
6360: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
6370: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
6380: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
6390: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
63a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
63b0: 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29  s[idx].internal)
63c0: 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e   {..../* Skip in
63d0: 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a  ternal slots */.
63e0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
63f0: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
6400: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
6410: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
6420: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6430: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69  _PRINTF("SCardDi
6440: 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61  sconnect(%lu) ca
6450: 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64  lled", (unsigned
6460: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09   long) idx);....
6470: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
6480: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6490: 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  x].pcsc_card, SC
64a0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
64b0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
64c0: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
64d0: 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63  bel) {....free(c
64e0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
64f0: 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63  .label);.....cac
6500: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
6510: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
6520: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
6530: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f  [idx].pcsc_card_
6540: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
6550: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
6560: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
6570: 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b  epth = 0;...cack
6580: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
6590: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
65a0: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69  w_lock = 0;....i
65b0: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
65c0: 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
65d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
65e0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61  RINTF("Marking a
65f0: 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61  ctive slot %lu a
6600: 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20  s being reset", 
6610: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6620: 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  idx);...}....cac
6630: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73  key_slots[idx].s
6640: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
6650: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
6660: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
6670: 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  ng");...return;.
6680: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
6690: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
66a0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
66b0: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20  connect(void);. 
66c0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
66d0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
66e0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
66f0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
6700: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
6710: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
6720: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6730: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
6740: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
6750: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
6760: 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74  on connects to t
6770: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
6780: 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20  ion Manager and 
6790: 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20  updates the. *  
67a0: 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65     global handle
67b0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
67c0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
67d0: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76  y_pcsc_connect(v
67e0: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  oid) {..LONG sca
67f0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6800: 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  et;.#ifdef HAVE_
6810: 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54  SCARDISVALIDCONT
6820: 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  EXT..LONG scard_
6830: 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e  isvalid_ret;.#en
6840: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
6850: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
6860: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
6870: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
6880: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
6890: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
68a0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
68b0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
68c0: 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b  le));...if (cack
68d0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
68e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43  = NULL) {....CAC
68f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6900: 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63  ("Call to malloc
6910: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
6920: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6930: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
6940: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6950: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
6960: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6970: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
6980: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6990: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c  NTF("SCardEstabl
69a0: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  ishContext() cal
69b0: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65  led");...scard_e
69c0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d  st_context_ret =
69d0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
69e0: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f  ontext(SCARD_SCO
69f0: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c  PE_SYSTEM, NULL,
6a00: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63   NULL, cackey_pc
6a10: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66  sc_handle);...if
6a20: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74   (scard_est_cont
6a30: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
6a40: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
6a50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6a60: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43  INTF("Call to SC
6a70: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6a80: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75  ext failed (retu
6a90: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65  rned %s/%li), re
6aa0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
6ab0: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  re", CACKEY_DEBU
6ac0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
6ad0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74  TO_STR(scard_est
6ae0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28  _context_ret), (
6af0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f  long) scard_est_
6b00: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09  context_ret);...
6b10: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
6b20: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63  sc_handle);....c
6b30: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6b40: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61  e = NULL;.....ca
6b50: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
6b60: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
6b70: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6b80: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
6b90: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48  ..}..}..#ifdef H
6ba0: 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44  AVE_SCARDISVALID
6bb0: 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f  CONTEXT..CACKEY_
6bc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6bd0: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78  ardIsValidContex
6be0: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73  t() called");..s
6bf0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
6c00: 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43   = SCardIsValidC
6c10: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70  ontext(*cackey_p
6c20: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66  csc_handle);..if
6c30: 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f   (scard_isvalid_
6c40: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6c50: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
6c60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6c70: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f  "Handle has beco
6c80: 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72  me invalid (SCar
6c90: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20  dIsValidContext 
6ca0: 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e  = %s/%li), tryin
6cb0: 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73  g to re-establis
6cc0: 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  h...", CACKEY_DE
6cd0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
6ce0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69  R_TO_STR(scard_i
6cf0: 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f  svalid_ret), (lo
6d00: 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69  ng) scard_isvali
6d10: 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45  d_ret);....CACKE
6d20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6d30: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
6d40: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
6d50: 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f  ;...scard_est_co
6d60: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
6d70: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6d80: 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59  t(SCARD_SCOPE_SY
6d90: 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  STEM, NULL, NULL
6da0: 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  , cackey_pcsc_ha
6db0: 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61  ndle);...if (sca
6dc0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6dd0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
6de0: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b  CCESS) {....CACK
6df0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6e00: 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73  "Call to SCardEs
6e10: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66  tablishContext f
6e20: 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20  ailed (returned 
6e30: 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69  %s/%li), returni
6e40: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20  ng in failure", 
6e50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
6e60: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
6e70: 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  R(scard_est_cont
6e80: 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ext_ret), (long)
6e90: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65   scard_est_conte
6ea0: 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65  xt_ret);.....fre
6eb0: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
6ec0: 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79  ndle);....cackey
6ed0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
6ee0: 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ULL;.....cackey_
6ef0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6f00: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75  _all();.....retu
6f10: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6f20: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
6f30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6f40: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61  RINTF("Handle ha
6f50: 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c  s been re-establ
6f60: 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64  ished");..}.#end
6f70: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
6f80: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73  G_PRINTF("Sucess
6f90: 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20  fully connected 
6fa0: 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e  to PC/SC, return
6fb0: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29  ing in success")
6fc0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
6fd0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
6fe0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
6ff0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
7000: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
7010: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  sconnect(void);.
7020: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
7030: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
7040: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7050: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
7060: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
7070: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
7080: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
7090: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
70a0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
70b0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
70c0: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20  ion disconnects 
70d0: 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43  from the PC/SC C
70e0: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
70f0: 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a  r and updates. *
7100: 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20       the global 
7110: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73  handle.. *. */.s
7120: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
7130: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73   cackey_pcsc_dis
7140: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
7150: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f  .LONG scard_rel_
7160: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43  context_ret;...C
7170: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7180: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
7190: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
71a0: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
71b0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
71c0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
71d0: 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f  }...scard_rel_co
71e0: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
71f0: 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28  dReleaseContext(
7200: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
7210: 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  dle);...if (cack
7220: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20  ey_pcsc_handle) 
7230: 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  {...free(cackey_
7240: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a  pcsc_handle);...
7250: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
7260: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  ndle = NULL;..}.
7270: 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f  ..if (scard_rel_
7280: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
7290: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
72a0: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  {...return(CACKE
72b0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
72c0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  );..}...return(C
72d0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
72e0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
72f0: 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20  SIS. *     void 
7300: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
7310: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61  _reset(struct ca
7320: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
7330: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
7340: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
7350: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
7360: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
7370: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
7380: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
7390: 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68  rks a slot has h
73a0: 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74  aving been reset
73b0: 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c  , to later be cl
73c0: 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20  eaned up.. *    
73d0: 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61   Cleanup only ha
73e0: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43  ppens when a PKC
73f0: 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c  S#11 client call
7400: 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  s C_FindObjectsI
7410: 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  nit.. *. */.stat
7420: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d  ic void cackey_m
7430: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
7440: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7450: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75  t *slot) {..stru
7460: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
7470: 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
7480: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
7490: 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
74a0: 74 73 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d  ts;...if (slot =
74b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
74c0: 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  rn;..}...CACKEY_
74d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
74e0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
74f0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
7500: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43  onnected) {...SC
7510: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
7520: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7530: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
7540: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f  ;..}...slot->slo
7550: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c  t_reset = 1;..sl
7560: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7570: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 69 66  nnected = 0;..if
7580: 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d   (cackey_pin_com
7590: 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  mand == NULL) {.
75a0: 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c  ..slot->token_fl
75b0: 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
75c0: 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73  REQUIRED;..} els
75d0: 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65  e {...slot->toke
75e0: 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  n_flags = 0;..}.
75f0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
7600: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
7610: 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72     LONG cackey_r
7620: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74  econnect_card(st
7630: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
7640: 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65   *slot, DWORD de
7650: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 3b  fault_protocol);
7660: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
7670: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
7680: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
7690: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
76a0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
76b0: 0a 20 2a 20 20 20 20 20 44 57 4f 52 44 20 64 65  . *     DWORD de
76c0: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20  fault_protocol. 
76d0: 2a 20 20 20 20 20 20 20 20 20 50 72 6f 74 6f 63  *         Protoc
76e0: 6f 6c 20 74 6f 20 61 74 74 65 6d 70 74 20 66 69  ol to attempt fi
76f0: 72 73 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  rst. *. * RETURN
7700: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68   VALUE. *     Th
7710: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  e return value f
7720: 72 6f 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  rom SCardReconne
7730: 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ct(). *. * NOTES
7740: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
7750: 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
7760: 65 72 20 61 72 6f 75 6e 64 20 53 43 61 72 64 52  er around SCardR
7770: 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a  econnect(). *. *
7780: 20 20 20 20 20 54 68 65 20 53 43 61 72 64 52 65       The SCardRe
7790: 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e 63 74 69  connect() functi
77a0: 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20  on call will be 
77b0: 63 61 6c 6c 65 64 20 66 69 72 73 74 20 77 69 74  called first wit
77c0: 68 20 74 68 65 0a 20 2a 20 20 20 20 20 64 77 50  h the. *     dwP
77d0: 72 65 66 65 72 72 65 64 50 72 6f 74 6f 63 6f 6c  referredProtocol
77e0: 73 20 6f 66 20 22 64 65 66 61 75 6c 74 5f 70 72  s of "default_pr
77f0: 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68 61  otocol".  If tha
7800: 74 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  t call returns. 
7810: 2a 20 20 20 20 20 53 43 41 52 44 5f 45 5f 50 52  *     SCARD_E_PR
7820: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72 79  OTO_MISMATCH try
7830: 20 61 67 61 69 6e 20 77 69 74 68 20 61 20 70 72   again with a pr
7840: 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20 61  otocol of T=0, a
7850: 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20 20  nd failing. *   
7860: 20 20 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a 20    that T=1.. *. 
7870: 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 63  */.static LONG c
7880: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
7890: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
78a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44  ey_slot *slot, D
78b0: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
78c0: 74 6f 63 6f 6c 29 20 7b 0a 09 44 57 4f 52 44 20  tocol) {..DWORD 
78d0: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
78e0: 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63  l;..LONG scard_c
78f0: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73 65 6c 65 63  onn_ret;...selec
7900: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 30  ted_protocol = 0
7910: 3b 0a 0a 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ;...scard_conn_r
7920: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7930: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7940: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7950: 5f 53 48 41 52 45 44 2c 20 64 65 66 61 75 6c 74  _SHARED, default
7960: 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53 43 41 52 44  _protocol, SCARD
7970: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65  _RESET_CARD, &se
7980: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29  lected_protocol)
7990: 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ;...if (scard_co
79a0: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
79b0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
79c0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
79d0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
79e0: 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  Reconnect() retu
79f0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
7a00: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
7a10: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
7a20: 30 22 29 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e  0")...scard_conn
7a30: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f  _ret = SCardReco
7a40: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7a50: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41  _card, SCARD_SHA
7a60: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7a70: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43  _PROTOCOL_T0, SC
7a80: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
7a90: 26 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63  &selected_protoc
7aa0: 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  ol);....if (scar
7ab0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
7ac0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7ad0: 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45  ATCH) {....CACKE
7ae0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7af0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7b00: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
7b10: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
7b20: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
7b30: 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63 61 72  st T=1")....scar
7b40: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7b50: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
7b60: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7b70: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7b80: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7b90: 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f  T1, SCARD_RESET_
7ba0: 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f  CARD, &selected_
7bb0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09  protocol);...}..
7bc0: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f  }...if (scard_co
7bd0: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
7be0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 73  S_SUCCESS) {...s
7bf0: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
7c00: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7c10: 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73  l;..}...return(s
7c20: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a  card_conn_ret);.
7c30: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
7c40: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
7c50: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  ret cackey_conne
7c60: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
7c70: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7c80: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
7c90: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
7ca0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
7cb0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
7cc0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
7cd0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
7ce0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
7cf0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
7d00: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
7d10: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
7d20: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
7d30: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
7d40: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
7d50: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
7d60: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
7d70: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7d80: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7d90: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
7da0: 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ret pcsc_connect
7db0: 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f  _ret;..DWORD pro
7dc0: 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61  tocol;..LONG sca
7dd0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43  rd_conn_ret;...C
7de0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7df0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
7e00: 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09  .if (!slot) {...
7e10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7e20: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f  NTF("Invalid slo
7e30: 74 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74  t specified, ret
7e40: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7e50: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
7e60: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7e70: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  ERIC);..}...pcsc
7e80: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
7e90: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
7ea0: 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  ct();..if (pcsc_
7eb0: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
7ec0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
7ed0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7ee0: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
7ef0: 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61  tion to PC/SC fa
7f00: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
7f10: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
7f20: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7f30: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7f40: 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20  .}.../* Connect 
7f50: 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e 65  to reader, if ne
7f60: 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c  eded */..if (!sl
7f70: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7f80: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43  nnected) {...CAC
7f90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7fa0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 25  ("SCardConnect(%
7fb0: 73 29 20 63 61 6c 6c 65 64 20 66 6f 72 20 73 6c  s) called for sl
7fc0: 6f 74 20 25 70 22 2c 20 73 6c 6f 74 2d 3e 70 63  ot %p", slot->pc
7fd0: 73 63 5f 72 65 61 64 65 72 2c 20 73 6c 6f 74 29  sc_reader, slot)
7fe0: 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ;...scard_conn_r
7ff0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
8000: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
8010: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
8020: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
8030: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
8040: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
8050: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
8060: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
8070: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
8080: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
8090: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
80a0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
80b0: 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  CH) {....CACKEY_
80c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
80d0: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74  ardConnect() ret
80e0: 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52  urned SCARD_E_PR
80f0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72  OTO_MISMATCH, tr
8100: 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54  ying with just T
8110: 3d 30 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f  =0")....scard_co
8120: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
8130: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
8140: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
8150: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
8160: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
8170: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8180: 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T0, &slot->pcsc
8190: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
81a0: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
81b0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
81c0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
81d0: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TCH) {.....CACKE
81e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
81f0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
8200: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
8210: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
8220: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
8230: 20 54 3d 31 22 29 0a 09 09 09 09 73 63 61 72 64   T=1").....scard
8240: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
8250: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
8260: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8270: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8280: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
8290: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
82a0: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
82b0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
82c0: 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  col);....}...}..
82d0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
82e0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f  _ret == SCARD_W_
82f0: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 29 20  UNPOWERED_CARD) 
8300: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8310: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
8320: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
8330: 64 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45  d SCARD_W_UNPOWE
8340: 52 45 44 5f 43 41 52 44 2c 20 74 72 79 69 6e 67  RED_CARD, trying
8350: 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e   to re-connect..
8360: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 63  .");.....scard_c
8370: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
8380: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
8390: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
83a0: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
83b0: 43 41 52 44 5f 53 48 41 52 45 5f 44 49 52 45 43  CARD_SHARE_DIREC
83c0: 54 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  T, SCARD_PROTOCO
83d0: 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f  L_T0 | SCARD_PRO
83e0: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
83f0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
8400: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28  tocol);.....if (
8410: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8420: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
8430: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09  MISMATCH) {.....
8440: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8450: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
8460: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
8470: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
8480: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
8490: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 09   just T=0").....
84a0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
84b0: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
84c0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
84d0: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
84e0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
84f0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
8500: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c  PROTOCOL_T0, &sl
8510: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
8520: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09  protocol);......
8530: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
8540: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
8550: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
8560: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
8570: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
8580: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
8590: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
85a0: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
85b0: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
85c0: 0a 09 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ......scard_conn
85d0: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
85e0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
85f0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
8600: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
8610: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
8620: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8630: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
8640: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
8650: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
8660: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8670: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
8680: 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 70 72 6f  t_card(slot, pro
8690: 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69  tocol);...}....i
86a0: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
86b0: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  t == SCARD_E_NO_
86c0: 53 45 52 56 49 43 45 29 20 7b 0a 09 09 09 43 41  SERVICE) {....CA
86d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
86e0: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
86f0: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
8700: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 20 2d 2d  _E_NO_SERVICE --
8710: 20 77 68 69 63 68 20 63 6f 75 6c 64 20 6d 65 61   which could mea
8720: 6e 20 6f 75 72 20 68 61 6e 64 6c 65 20 69 73 20  n our handle is 
8730: 69 6e 76 61 6c 69 64 2c 20 77 69 6c 6c 20 74 72  invalid, will tr
8740: 79 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74  y to reconnect t
8750: 6f 20 50 43 2f 53 43 20 73 65 72 76 69 63 65 22  o PC/SC service"
8760: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  );.....cackey_pc
8770: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b  sc_disconnect();
8780: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  .....cackey_pcsc
8790: 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09  _connect();.....
87a0: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
87b0: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
87c0: 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f  ..return(cackey_
87d0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
87e0: 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  t));...}....if (
87f0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21  scard_conn_ret !
8800: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
8810: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
8820: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
8830: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20  nection to card 
8840: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
8850: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43  g in failure (SC
8860: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25  ardConnect() = %
8870: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
8880: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
8890: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
88a0: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e  _conn_ret), (lon
88b0: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  g) scard_conn_re
88c0: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
88d0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
88e0: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c  ERIC);...}....sl
88f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
8900: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73  nnected = 1;...s
8910: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8920: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c  _depth = 0;...sl
8930: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8940: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
8950: 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ;...slot->protoc
8960: 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  ol = protocol;..
8970: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
8980: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
8990: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b  ng in success");
89a0: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
89b0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
89c0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
89d0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
89e0: 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
89f0: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8a00: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8a10: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
8a20: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
8a30: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
8a40: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
8a50: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
8a60: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
8a70: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
8a80: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
8a90: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
8aa0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8ab0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
8ac0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
8ad0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20  OTES. *     The 
8ae0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75  transaction shou
8af0: 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64  ld be terminated
8b00: 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65   using "cackey_e
8b10: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a  nd_transaction".
8b20: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
8b30: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8b40: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
8b50: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
8b60: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63  slot *slot) {..c
8b70: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8b80: 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47  _conn_ret;..LONG
8b90: 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74   scard_trans_ret
8ba0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
8bb0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
8bc0: 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e  ");...cackey_con
8bd0: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  n_ret = cackey_c
8be0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
8bf0: 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63  );..if (cackey_c
8c00: 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  onn_ret != CACKE
8c10: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
8c20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8c30: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
8c40: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
8c50: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
8c60: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
8c70: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8c80: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c  ENERIC);..}...sl
8c90: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8ca0: 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73  depth++;...if (s
8cb0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8cc0: 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20 21 73  _depth > 1 && !s
8cd0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8ce0: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b  _need_hw_lock) {
8cf0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8d00: 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20  PRINTF("Already 
8d10: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
8d20: 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20  , performing no 
8d30: 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74  action (new dept
8d40: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
8d50: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8d60: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
8d70: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
8d80: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8d90: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
8da0: 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72  lock = 0;...scar
8db0: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
8dc0: 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74  ardBeginTransact
8dd0: 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ion(slot->pcsc_c
8de0: 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ard);..if (scard
8df0: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
8e00: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
8e10: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8e20: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8e30: 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  o begin transact
8e40: 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ion, returning i
8e50: 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65  n error");....re
8e60: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8e70: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
8e80: 0a 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 53 75 63 65 73 73 66 75 6c  RINTF("Sucessful
8ea0: 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63  ly began transac
8eb0: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73  tion on slot (%s
8ec0: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  )", slot->pcsc_r
8ed0: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e  eader);...return
8ee0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
8ef0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
8f00: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
8f10: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65  key_ret cackey_e
8f20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
8f30: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8f40: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
8f50: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
8f60: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8f70: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
8f80: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
8f90: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54  nds to. *. * RET
8fa0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
8fb0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
8fc0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
8fd0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
8fe0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8ff0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
9000: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
9010: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9020: 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f  equires "cackey_
9030: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
9040: 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  n" to be called 
9050: 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61  first. *. */.sta
9060: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
9070: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
9080: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63  ction(struct cac
9090: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
90a0: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72  {..LONG scard_tr
90b0: 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ans_ret;...CACKE
90c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
90d0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
90e0: 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  (!slot->pcsc_car
90f0: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
9100: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9110: 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f  INTF("Card is no
9120: 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61  t connected, una
9130: 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73  ble to end trans
9140: 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29  action on card")
9150: 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  ;....if (slot->t
9160: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9170: 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45   > 0) {....CACKE
9180: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9190: 44 65 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73  Decreasing trans
91a0: 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64  action depth and
91b0: 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61   asking for a ha
91c0: 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74  rdware lock on t
91d0: 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72  he next begin tr
91e0: 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65  ansaction (curre
91f0: 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c  nt depth = %i)",
9200: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69   slot->transacti
9210: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73  on_depth);.....s
9220: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
9230: 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66  _depth--;.....if
9240: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
9250: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
9260: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
9270: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
9280: 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09  ock = 1;....}...
9290: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  }....return(CACK
92a0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
92b0: 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  C);..}...if (slo
92c0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
92d0: 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43  epth == 0) {...C
92e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
92f0: 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20  TF("Terminating 
9300: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
9310: 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e  at has not begun
9320: 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  !");....return(C
9330: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9340: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
9350: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
9360: 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth--;...if (slo
9370: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9380: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41  epth > 0) {...CA
9390: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
93a0: 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  F("Transactions 
93b0: 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73  still in progres
93c0: 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69  s, not terminati
93d0: 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73  ng on-card Trans
93e0: 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20  action (current 
93f0: 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c  depth = %i)", sl
9400: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
9410: 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72  depth);....retur
9420: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
9430: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f  OK);..}...scard_
9440: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72  trans_ret = SCar
9450: 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  dEndTransaction(
9460: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
9470: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
9480: 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74  D);..if (scard_t
9490: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52  rans_ret != SCAR
94a0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
94b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
94c0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
94d0: 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  end transaction,
94e0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
94f0: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
9500: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9510: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
9520: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9530: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74  F("Sucessfully t
9540: 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61  erminated transa
9550: 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25  ction on slot (%
9560: 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  s)", slot->pcsc_
9570: 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72  reader);...retur
9580: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
9590: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20  OK);.}../* APDU 
95a0: 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  Related Function
95b0: 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  s */./*. * SYNPO
95c0: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
95d0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e  y_ret cackey_sen
95e0: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61  d_apdu(struct ca
95f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
9600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
9610: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63  lass, unsigned c
9620: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  har instruction,
9630: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
9640: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  1, unsigned char
9650: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p2, unsigned ch
9660: 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20  ar lc, unsigned 
9670: 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69  char *data, unsi
9680: 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69  gned char le, ui
9690: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
96a0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
96b0: 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f  *respdata, size_
96c0: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  t *respdata_len)
96d0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
96e0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
96f0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
9700: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
9710: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
9720: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9730: 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20  d char class. * 
9740: 20 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61          APDU Cla
9750: 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f  ss (GSCIS_CLASS_
9760: 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53  ISO7816 or GSCIS
9770: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
9780: 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20  ATFORM. *       
9790: 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41    usually), (CLA
97a0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
97b0: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
97c0: 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20  ction. *        
97d0: 20 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f   APDU Instructio
97e0: 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20  n (INS). *. *   
97f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9800: 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  p1. *         AP
9810: 44 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28  DU Parameter 1 (
9820: 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  P1). *. *     un
9830: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20  signed char p2. 
9840: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50  *         APDU P
9850: 61 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a  arameter 2 (P2).
9860: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9870: 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20  ed char lc. *   
9880: 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74        APDU Lengt
9890: 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63  h of Content (Lc
98a0: 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65  ) -- this is the
98b0: 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61   length of "data
98c0: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72  ". *         par
98d0: 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74  ameter.  If "dat
98e0: 61 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20  a" is specified 
98f0: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61  as NULL, this pa
9900: 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20  rameter will. * 
9910: 20 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72          be ignor
9920: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ed.. *. *     un
9930: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9940: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69  a. *         Poi
9950: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74  nter to buffer t
9960: 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75  o send.  It shou
9970: 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73  ld be "Lc" bytes
9980: 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20   long.  If. *   
9990: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
99a0: 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69  as NULL, "Lc" wi
99b0: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20  ll not be sent, 
99c0: 61 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20  and this buffer 
99d0: 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20  will be. *      
99e0: 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20     ignored.. *. 
99f0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9a00: 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20  har le. *       
9a10: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66    APDU Length of
9a20: 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65   Expectation (Le
9a30: 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65  ) -- this is the
9a40: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20   length of the. 
9a50: 2a 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74  *         expect
9a60: 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68  ed reply.  If th
9a70: 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20  is is specified 
9a80: 61 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c  as 0 then it wil
9a90: 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  l not. *        
9aa0: 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20   be sent.. *. * 
9ab0: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65      uint16_t *re
9ac0: 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20  spcode. *       
9ad0: 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20    [OUT] Pointer 
9ae0: 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50  to storage of AP
9af0: 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65  DU response code
9b00: 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a  .  If this is. *
9b10: 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69           specifi
9b20: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ed as NULL, the 
9b30: 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69  response code wi
9b40: 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  ll be discarded.
9b50: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9b60: 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61  ned char *respda
9b70: 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  ta. *         [O
9b80: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT] Pointer to s
9b90: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72  torage of APDU r
9ba0: 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49  esponse data.  I
9bb0: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20  f this is. *    
9bc0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
9bd0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70  s NULL, the resp
9be0: 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62  onse data will b
9bf0: 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  e discarded.  If
9c00: 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  . *         the 
9c10: 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70  "respdata_len" p
9c20: 61 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63  arameter is spec
9c30: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
9c40: 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20  his buffer. *   
9c50: 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62        will not b
9c60: 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a  e updated.. *. *
9c70: 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73       size_t *res
9c80: 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20  pdata_len. *    
9c90: 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50       [IN, OUT] P
9ca0: 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e  ointer initialin
9cb0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
9cc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65   size of the "re
9cd0: 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20  spdata". *      
9ce0: 20 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f     buffer.  Befo
9cf0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68  re returning, th
9d00: 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c  e pointed to val
9d10: 75 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ue is updated to
9d20: 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20   the. *         
9d30: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9d40: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62  written to the b
9d50: 75 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20  uffer.  If this 
9d60: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a  is specified as.
9d70: 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c   *         NULL,
9d80: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
9d90: 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65  updated, and "re
9da0: 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20  spdata" will be 
9db0: 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a  ignored causing.
9dc0: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72   *         the r
9dd0: 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20  esponse data to 
9de0: 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a  be discarded.. *
9df0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
9e00: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
9e10: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
9e20: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
9e30: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
9e40: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
9e50: 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20  On error. *     
9e60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
9e70: 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68  KENABSENT  If th
9e80: 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  e sending failed
9e90: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b   because the tok
9ea0: 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  en is. *        
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 20 20 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20          absent. 
9ed0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
9ee0: 43 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20 20  C_E_RETRY       
9ef0: 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   If something th
9f00: 61 74 20 6c 6f 6f 6b 73 20 72 65 74 72 79 27 61  at looks retry'a
9f10: 62 6c 65 20 77 65 6e 74 0a 20 2a 20 20 20 20 20  ble went. *     
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f30: 20 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67             wrong
9f40: 20 2d 2d 20 74 72 79 20 74 68 65 20 77 68 6f 6c   -- try the whol
9f50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 76  e transaction ov
9f60: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20  er. *           
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 61 67 61 69 6e 0a 20 2a 0a 20 2a       again. *. *
9f90: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
9fa0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
9fb0: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
9fc0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
9fd0: 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20   Manager via. * 
9fe0: 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f      cackey_pcsc_
9ff0: 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65  connect() if nee
a000: 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49  ded.. *. *     I
a010: 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  t will connect t
a020: 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68  o the card in th
a030: 65 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65  e reader attache
a040: 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a  d to the slot. *
a050: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20       specified. 
a060: 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65   It will reconne
a070: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
a080: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
a090: 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61  . *     goes awa
a0a0: 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  y.. *. */.static
a0b0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
a0c0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72  ey_send_apdu(str
a0d0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
a0e0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
a0f0: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69  char class, unsi
a100: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
a110: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20  ction, unsigned 
a120: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65  char p1, unsigne
a130: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67  d char p2, unsig
a140: 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69  ned int lc, unsi
a150: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
a160: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
a170: 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70  , uint16_t *resp
a180: 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  code, unsigned c
a190: 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73  har *respdata, s
a1a0: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
a1b0: 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20  len) {..uint8_t 
a1c0: 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f  major_rc, minor_
a1d0: 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65  rc;..size_t byte
a1e0: 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72  s_to_copy, tmp_r
a1f0: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50  espdata_len;..LP
a200: 43 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53  CSCARD_IO_REQUES
a210: 54 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44  T pioSendPci;..D
a220: 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72  WORD xmit_len, r
a230: 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73  ecv_len;..LONG s
a240: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73  card_xmit_ret, s
a250: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
a260: 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b  ..BYTE xmit_buf[
a270: 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b  1024], recv_buf[
a280: 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63  1024];..int pcsc
a290: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63  _connect_ret, pc
a2a0: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a  sc_getresp_ret;.
a2b0: 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  .int idx;...CACK
a2c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a2d0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
a2e0: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
a2f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a300: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
a310: 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09  pecified.");....
a320: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
a330: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
a340: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
a350: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
a360: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
a370: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
a380: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
a390: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
a3a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a3b0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
a3c0: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
a3d0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
a3e0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
a3f0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a400: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
a410: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69  /* Determine whi
a420: 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73  ch protocol to s
a430: 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77  end using */..sw
a440: 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74  itch (slot->prot
a450: 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53  ocol) {...case S
a460: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
a470: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a480: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a490: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a4a0: 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09  ram is T=0");...
a4b0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a4c0: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
a4d0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53  .break;...case S
a4e0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
a4f0: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a500: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a510: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a520: 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09  ram is T=1");...
a530: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a540: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
a550: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
a560: 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
a570: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
a580: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e  id protocol foun
a590: 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a  d, aborting.");.
a5a0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
a5b0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
a5c0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73  );..}.../* Trans
a5d0: 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e  mit */..xmit_len
a5e0: 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b   = 0;..xmit_buf[
a5f0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c  xmit_len++] = cl
a600: 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ass;..xmit_buf[x
a610: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73  mit_len++] = ins
a620: 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f  truction;..xmit_
a630: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a640: 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  = p1;..xmit_buf[
a650: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32  xmit_len++] = p2
a660: 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09  ;..if (data) {..
a670: 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b  .if (lc > 255) {
a680: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a690: 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e  _PRINTF("CAUTION
a6a0: 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67  !  Using an Lc g
a6b0: 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20  reater than 255 
a6c0: 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63  is untested.  Lc
a6d0: 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09   = %u", lc);....
a6e0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a6f0: 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a  en++] = 0x82; /*
a700: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
a710: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a720: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26  t_len++] = (lc &
a730: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
a740: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a750: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78  len++] = lc & 0x
a760: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ff;...} else {..
a770: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a780: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d  len++] = lc;...}
a790: 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
a7a0: 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b   idx < lc; idx++
a7b0: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
a7c0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61  xmit_len++] = da
a7d0: 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a  ta[idx];...}..}.
a7e0: 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30  ..if (le != 0x00
a7f0: 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32  ) {...if (le > 2
a800: 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  56) {....CACKEY_
a810: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41  DEBUG_PRINTF("CA
a820: 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e  UTION!  Using an
a830: 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   Le greater than
a840: 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64   256 is untested
a850: 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29  .  Le = %u", le)
a860: 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  ;.....xmit_buf[x
a870: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38  mit_len++] = 0x8
a880: 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54  2; /* XXX UNTEST
a890: 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75  ED */....xmit_bu
a8a0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a8b0: 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e  (le & 0xff00) >>
a8c0: 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   8;....xmit_buf[
a8d0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
a8e0: 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73   & 0xff;...} els
a8f0: 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29  e if (le == 256)
a900: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a910: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30  mit_len++] = 0x0
a920: 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  0;...} else {...
a930: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a940: 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a  en++] = le;...}.
a950: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d  .}.../* Begin Sm
a960: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
a970: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
a980: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
a990: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c  (slot);...if (cl
a9a0: 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41  ass == GSCIS_CLA
a9b0: 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 28 69  SS_ISO7816 && (i
a9c0: 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53  nstruction == GS
a9d0: 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59  CIS_INSTR_VERIFY
a9e0: 20 7c 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   || instruction 
a9f0: 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43  == GSCIS_INSTR_C
aa00: 48 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 29  HANGE_REFERENCE)
aa10: 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20   && p1 == 0x00) 
aa20: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
aa30: 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67  _PRINTF("Sending
aa40: 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65   APDU: <<censore
aa50: 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  d>>");..} else {
aa60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aa70: 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e  PRINTBUF("Sendin
aa80: 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62  g APDU:", xmit_b
aa90: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09  uf, xmit_len);..
aaa0: 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  }...recv_len = s
aab0: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
aac0: 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
aad0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
aae0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
aaf0: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d  , pioSendPci, xm
ab00: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
ab10: 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66  , NULL, recv_buf
ab20: 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  , &recv_len);...
ab30: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
ab40: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f  et == SCARD_E_NO
ab50: 54 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a  T_TRANSACTED) {.
ab60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ab70: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
ab80: 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61   send APDU to ca
ab90: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
aba0: 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77  t() = %s/%lx), w
abb0: 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20  ill ask calling 
abc0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72  function to retr
abd0: 79 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67  y (not resetting
abe0: 20 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b   card)...", CACK
abf0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
ac00: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
ac10: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
ac20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
ac30: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a  card_xmit_ret);.
ac40: 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
ac50: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
ac60: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
ac70: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
ac80: 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 63  );....cackey_rec
ac90: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
aca0: 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  , slot->protocol
acb0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
acc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
acd0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  );..}...if (scar
ace0: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
acf0: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
ad00: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ad10: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
ad20: 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74  d to send APDU t
ad30: 6f 20 63 61 72 64 2c 20 70 6f 73 73 69 62 6c 79  o card, possibly
ad40: 20 64 75 65 20 74 6f 20 50 43 2f 53 43 20 68 61   due to PC/SC ha
ad50: 6e 64 6c 65 20 62 65 69 6e 67 20 69 6e 76 61 6c  ndle being inval
ad60: 69 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  id (SCardTransmi
ad70: 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77  t() = %s/%lx), w
ad80: 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20  ill ask calling 
ad90: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72  function to retr
ada0: 79 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  y...", CACKEY_DE
adb0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
adc0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
add0: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
ade0: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
adf0: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 63 61  xmit_ret);....ca
ae00: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
ae10: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 72  eset(slot);....r
ae20: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
ae30: 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a  C_E_RETRY);..}..
ae40: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
ae50: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
ae60: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
ae70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ae80: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20  "Failed to send 
ae90: 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43  APDU to card (SC
aea0: 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20  ardTransmit() = 
aeb0: 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45 59  %s/%lx)", CACKEY
aec0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
aed0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
aee0: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e  d_xmit_ret), (un
aef0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61  signed long) sca
af00: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
af10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
af20: 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c  INTF("Marking sl
af30: 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62 65 65  ot as having bee
af40: 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 63 61 63  n reset");...cac
af50: 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
af60: 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66  set(slot);....if
af70: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
af80: 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45   == SCARD_W_RESE
af90: 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  T_CARD) {....CAC
afa0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
afb0: 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64  ("Reset required
afc0: 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e  , please hold...
afd0: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65  ");.....scard_re
afe0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  conn_ret = cacke
aff0: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
b000: 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f  (slot, SCARD_PRO
b010: 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44  TOCOL_T0 | SCARD
b020: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a 0a  _PROTOCOL_T1);..
b030: 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
b040: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
b050: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
b060: 09 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e  ..switch (slot->
b070: 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09 09  protocol) {.....
b080: 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54  .case SCARD_PROT
b090: 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09 70  OCOL_T0:.......p
b0a0: 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52  ioSendPci = SCAR
b0b0: 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09 09  D_PCI_T0;.......
b0c0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
b0d0: 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  e SCARD_PROTOCOL
b0e0: 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 6f 53 65  _T1:.......pioSe
b0f0: 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43  ndPci = SCARD_PC
b100: 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62 72 65  I_T1;........bre
b110: 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75 6c 74  ak;......default
b120: 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  :.......CACKEY_D
b130: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
b140: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f  alid protocol fo
b150: 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61 74  und, but too lat
b160: 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  e to do anything
b170: 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d 2d   about it now --
b180: 20 74 72 79 69 6e 67 20 61 6e 79 77 61 79 2e 22   trying anyway."
b190: 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
b1a0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 52  .....}....../* R
b1b0: 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e  e-establish tran
b1c0: 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77  saction, if it w
b1d0: 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09  as present */...
b1e0: 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
b1f0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
b200: 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  0) {......slot->
b210: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
b220: 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  h--;......slot->
b230: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
b240: 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09  _hw_lock = 1;...
b250: 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  ...cackey_begin_
b260: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b270: 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
b280: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b290: 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73  F("Reset success
b2a0: 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74 74  ful, retransmitt
b2b0: 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65 63 76  ing");......recv
b2c0: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65  _len = sizeof(re
b2d0: 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73 63 61  cv_buf);.....sca
b2e0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43  rd_xmit_ret = SC
b2f0: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74  ardTransmit(slot
b300: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f  ->pcsc_card, pio
b310: 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75  SendPci, xmit_bu
b320: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c  f, xmit_len, NUL
b330: 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  L, recv_buf, &re
b340: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  cv_len);......if
b350: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
b360: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
b370: 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ESS) {......CACK
b380: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b390: 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c  "Retransmit fail
b3a0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
b3b0: 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20 64   failure after d
b3c0: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65  isconnecting the
b3d0: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
b3e0: 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c  smit = %s/%li)",
b3f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
b400: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
b410: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
b420: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
b430: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09  _xmit_ret);.....
b440: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
b450: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
b460: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
b470: 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  ARD);......slot-
b480: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
b490: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09  cted = 0;.......
b4a0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b4b0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b4c0: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
b4d0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
b4e0: 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e  ;......cackey_en
b4f0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
b500: 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  ot);.......retur
b510: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
b520: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
b530: 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ..}....} else {.
b540: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b550: 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e  _PRINTF("Disconn
b560: 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a  ecting card");..
b570: 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
b580: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
b590: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
b5a0: 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74  _CARD);.....slot
b5b0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
b5c0: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09  ected = 0;......
b5d0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b5e0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b5f0: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
b600: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b  ction_depth = 1;
b610: 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  .....cackey_end_
b620: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b630: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
b640: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
b650: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b660: 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28  e");.....return(
b670: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
b680: 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
b690: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
b6a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b6b0: 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e  TF("Disconnectin
b6c0: 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53 43  g card");.....SC
b6d0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
b6e0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
b6f0: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
b700: 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f  ;....slot->pcsc_
b710: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
b720: 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53   0;...../* End S
b730: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b740: 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d  tion */....slot-
b750: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
b760: 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65  th = 1;....cacke
b770: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
b780: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41 43  n(slot);.....CAC
b790: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b7a0: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  ("Returning in f
b7b0: 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72 65 74  ailure");....ret
b7c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b7d0: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
b7e0: 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
b7f0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
b800: 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65 3a 22  Returned Value:"
b810: 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65 63 76  , recv_buf, recv
b820: 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63  _len);...if (rec
b830: 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f  v_len < 2) {.../
b840: 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e  * Minimal respon
b850: 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32 20 62  se length is 2 b
b860: 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  ytes, returning 
b870: 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09  in failure */...
b880: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b890: 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 74 6f  NTF("Response to
b8a0: 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69  o small, returni
b8b0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 72  ng in failure (r
b8c0: 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  ecv_len = %lu)",
b8d0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b8e0: 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f   recv_len);..../
b8f0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
b900: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
b910: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
b920: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
b930: 09 09 2f 2a 20 53 75 70 70 6c 79 20 61 6e 20 69  ../* Supply an i
b940: 6e 76 61 6c 69 64 20 72 65 73 70 6f 6e 73 65 20  nvalid response 
b950: 63 6f 64 65 20 2a 2f 0a 09 09 69 66 20 28 72 65  code */...if (re
b960: 73 70 63 6f 64 65 29 20 7b 0a 09 09 09 2a 72 65  spcode) {....*re
b970: 73 70 63 6f 64 65 20 3d 20 30 3b 0a 09 09 7d 0a  spcode = 0;...}.
b980: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b990: 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54 41 29 3b  _PCSC_E_NODATA);
b9a0: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
b9b0: 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a  ne result code *
b9c0: 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65  /..major_rc = re
b9d0: 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20  cv_buf[recv_len 
b9e0: 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20  - 2];..minor_rc 
b9f0: 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f  = recv_buf[recv_
ba00: 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72  len - 1];..if (r
ba10: 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65  espcode) {...*re
ba20: 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f  spcode = (major_
ba30: 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72  rc << 8) | minor
ba40: 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a  _rc;..}.../* Adj
ba50: 75 73 74 20 6d 65 73 73 61 67 65 20 62 75 66 66  ust message buff
ba60: 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20  er */..recv_len 
ba70: 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62  -= 2;.../* Add b
ba80: 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20 76  ytes to return v
ba90: 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73  alue */..tmp_res
baa0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09  pdata_len = 0;..
bab0: 69 66 20 28 72 65 73 70 64 61 74 61 20 26 26 20  if (respdata && 
bac0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a  respdata_len) {.
bad0: 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  ..tmp_respdata_l
bae0: 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c  en = *respdata_l
baf0: 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f  en;....bytes_to_
bb00: 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74 61  copy = *respdata
bb10: 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63  _len;....if (rec
bb20: 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f  v_len < bytes_to
bb30: 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74 65  _copy) {....byte
bb40: 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76  s_to_copy = recv
bb50: 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  _len;...}....CAC
bb60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bb70: 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62 79  ("Copying %lu by
bb80: 74 65 73 20 74 6f 20 74 68 65 20 62 75 66 66 65  tes to the buffe
bb90: 72 20 28 72 65 63 76 27 64 20 25 6c 75 20 62 79  r (recv'd %lu by
bba0: 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25 6c  tes, but only %l
bbb0: 75 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  u bytes left in 
bbc0: 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20 28 75  our buffer)", (u
bbd0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79  nsigned long) by
bbe0: 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 6e  tes_to_copy, (un
bbf0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63  signed long) rec
bc00: 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64  v_len, (unsigned
bc10: 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61 74 61   long) *respdata
bc20: 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 79  _len);....memcpy
bc30: 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76 5f  (respdata, recv_
bc40: 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  buf, bytes_to_co
bc50: 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61 20  py);...respdata 
bc60: 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  += bytes_to_copy
bc70: 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f 6c  ;....*respdata_l
bc80: 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  en = bytes_to_co
bc90: 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61  py;...tmp_respda
bca0: 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f  ta_len -= bytes_
bcb0: 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65  to_copy;..} else
bcc0: 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65   {...if (recv_le
bcd0: 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  n != 0) {....CAC
bce0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bcf0: 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79 20  ("Throwing away 
bd00: 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 65  %lu bytes, nowhe
bd10: 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21 22  re to put them!"
bd20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
bd30: 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d  ) recv_len);...}
bd40: 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  ..}...if (major_
bd50: 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09  rc == 0x61) {...
bd60: 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52 45  /* We need to RE
bd70: 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  AD */...CACKEY_D
bd80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66  EBUG_PRINTF("Buf
bd90: 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72 65  fer read require
bda0: 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f  d");....if (mino
bdb0: 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20 7b 0a  r_rc == 0x00) {.
bdc0: 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43 41  ...minor_rc = CA
bdd0: 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09  CKEY_APDU_MTU;..
bde0: 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74 72 65  .}....pcsc_getre
bdf0: 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  sp_ret = cackey_
be00: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
be10: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
be20: 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  816, GSCIS_INSTR
be30: 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30  _GET_RESPONSE, 0
be40: 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55  x00, 0x00, 0, NU
be50: 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65  LL, minor_rc, re
be60: 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74 61  spcode, respdata
be70: 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  , &tmp_respdata_
be80: 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 70 63 73  len);....if (pcs
be90: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21 3d  c_getresp_ret !=
bea0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
beb0: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
bec0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66  EBUG_PRINTF("Buf
bed0: 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 64 21  fer read failed!
bee0: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66    Returning in f
bef0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a  ailure");...../*
bf00: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
bf10: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
bf20: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
bf30: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
bf40: 09 09 09 69 66 20 28 70 63 73 63 5f 67 65 74 72  ...if (pcsc_getr
bf50: 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  esp_ret == CACKE
bf60: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20  Y_PCSC_E_RETRY) 
bf70: 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  {.....return(CAC
bf80: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
bf90: 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  );....}.....retu
bfa0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
bfb0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
bfc0: 09 09 69 66 20 28 72 65 73 70 64 61 74 61 5f 6c  ..if (respdata_l
bfd0: 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70 64 61  en) {....*respda
bfe0: 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65  ta_len += tmp_re
bff0: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a  spdata_len;...}.
c000: 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
c010: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
c020: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
c030: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
c040: 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
c050: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
c060: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20  ning in success 
c070: 28 62 75 66 66 65 72 20 72 65 61 64 20 63 6f 6d  (buffer read com
c080: 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65 74 75  plete)");...retu
c090: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
c0a0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  _OK);..}.../* En
c0b0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
c0c0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b  saction */..cack
c0d0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
c0e0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28  on(slot);...if (
c0f0: 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30  major_rc == 0x90
c100: 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73 73  ) {.../* Success
c110: 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
c120: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
c130: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20  ning in success 
c140: 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30  (major_rc = 0x90
c150: 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  )");....return(C
c160: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
c170: 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44  ;..}....CACKEY_D
c180: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44  EBUG_PRINTF("APD
c190: 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65 72  U Returned an er
c1a0: 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ror, returning i
c1b0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72  n failure");...r
c1c0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
c1d0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a  C_E_GENERIC);.}.
c1e0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
c1f0: 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f 72 65   char *cackey_re
c200: 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 75 6e  ad_bertlv_tag(un
c210: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c220: 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 62 75 66  fer, size_t *buf
c230: 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73 69 67  fer_len_p, unsig
c240: 6e 65 64 20 63 68 61 72 20 74 61 67 2c 20 75 6e  ned char tag, un
c250: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74  signed char *out
c260: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a  buffer, size_t *
c270: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 29  outbuffer_len_p)
c280: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
c290: 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73 69  r *buffer_p;..si
c2a0: 7a 65 5f 74 20 6f 75 74 62 75 66 66 65 72 5f 6c  ze_t outbuffer_l
c2b0: 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a  en, buffer_len;.
c2c0: 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 09 69  .size_t size;..i
c2d0: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
c2e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
c2f0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
c300: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20  buffer_len_p == 
c310: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
c320: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 62  _DEBUG_PRINTF("b
c330: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e  uffer_len_p is N
c340: 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ULL.  Returning 
c350: 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a  in failure.");..
c360: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c370: 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 66  .}...if (outbuff
c380: 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c  er_len_p == NULL
c390: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c3a0: 55 47 5f 50 52 49 4e 54 46 28 22 6f 75 74 62 75  UG_PRINTF("outbu
c3b0: 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55  ffer_len_p is NU
c3c0: 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69  LL.  Returning i
c3d0: 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09  n failure.");...
c3e0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
c3f0: 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d  }...buffer_len =
c400: 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f   *outbuffer_len_
c410: 70 3b 0a 09 6f 75 74 62 75 66 66 65 72 5f 6c 65  p;..outbuffer_le
c420: 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c  n = *outbuffer_l
c430: 65 6e 5f 70 3b 0a 0a 09 69 66 20 28 62 75 66 66  en_p;...if (buff
c440: 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09  er_len < 2) {...
c450: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c460: 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65 6e 20  NTF("buffer_len 
c470: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 32 2c 20  is less than 2, 
c480: 73 6f 20 77 65 20 63 61 6e 27 74 20 72 65 61 64  so we can't read
c490: 20 61 6e 79 20 74 61 67 2e 20 20 52 65 74 75 72   any tag.  Retur
c4a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
c4b0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
c4c0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72  LL);..}...buffer
c4d0: 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 66  _p = buffer;..if
c4e0: 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 21 3d   (buffer_p[0] !=
c4f0: 20 74 61 67 29 20 7b 0a 09 09 43 41 43 4b 45 59   tag) {...CACKEY
c500: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
c510: 61 67 20 66 6f 75 6e 64 20 77 61 73 20 6e 6f 74  ag found was not
c520: 20 74 61 67 20 65 78 70 65 63 74 65 64 2e 20 20   tag expected.  
c530: 54 61 67 20 3d 20 25 30 32 78 2c 20 45 78 70 65  Tag = %02x, Expe
c540: 63 74 65 64 20 3d 20 25 30 32 78 2e 20 20 52 65  cted = %02x.  Re
c550: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
c560: 72 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  re.", (unsigned 
c570: 69 6e 74 29 20 62 75 66 66 65 72 5f 70 5b 30 5d  int) buffer_p[0]
c580: 2c 20 74 61 67 29 3b 0a 0a 09 09 72 65 74 75 72  , tag);....retur
c590: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75  n(NULL);..}...bu
c5a0: 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65  ffer_p++;..buffe
c5b0: 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 28  r_len--;...if ((
c5c0: 62 75 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78  buffer_p[0] & 0x
c5d0: 38 30 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09  80) == 0x80) {..
c5e0: 09 73 69 7a 65 20 3d 20 30 3b 0a 09 09 69 64 78  .size = 0;...idx
c5f0: 20 3d 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20   = (buffer_p[0] 
c600: 26 20 30 78 37 66 29 3b 0a 0a 09 09 69 66 20 28  & 0x7f);....if (
c610: 69 64 78 20 3e 20 62 75 66 66 65 72 5f 6c 65 6e  idx > buffer_len
c620: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
c630: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66  BUG_PRINTF("Malf
c640: 6f 72 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20  ormed BER value 
c650: 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  -- not enough by
c660: 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  tes available to
c670: 20 72 65 61 64 20 6c 65 6e 67 74 68 20 28 69 64   read length (id
c680: 78 20 3d 20 25 69 2c 20 62 75 66 66 65 72 5f 6c  x = %i, buffer_l
c690: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 69 64 78 2c  en = %lu)", idx,
c6a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c6b0: 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09   buffer_len);...
c6c0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c6d0: 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64  ..}....for (; id
c6e0: 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a  x > 0; idx--) {.
c6f0: 09 09 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09  ...buffer_p++;..
c700: 09 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a  ..buffer_len--;.
c710: 0a 09 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a  ....size <<= 8;.
c720: 09 09 09 73 69 7a 65 20 7c 3d 20 62 75 66 66 65  ...size |= buffe
c730: 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09 7d 20 65  r_p[0];...}..} e
c740: 6c 73 65 20 7b 0a 09 09 73 69 7a 65 20 3d 20 62  lse {...size = b
c750: 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a  uffer_p[0];..}..
c760: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75  .buffer_p++;..bu
c770: 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66  ffer_len--;...if
c780: 20 28 73 69 7a 65 20 3e 20 6f 75 74 62 75 66 66   (size > outbuff
c790: 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b  er_len) {...CACK
c7a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c7b0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 70 79 20  "Unable to copy 
c7c0: 76 61 6c 75 65 20 62 75 66 66 65 72 20 74 6f 20  value buffer to 
c7d0: 6f 75 74 62 75 66 66 65 72 2c 20 6e 6f 74 20 65  outbuffer, not e
c7e0: 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20 20 56 61 6c  nough room.  Val
c7f0: 75 65 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68  ue buffer length
c800: 20 3d 20 25 6c 75 2c 20 6f 75 74 20 62 75 66 66   = %lu, out buff
c810: 65 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 22  er length = %lu"
c820: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
c830: 29 20 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65  ) size, (unsigne
c840: 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 66 65  d long) outbuffe
c850: 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  r_len);....retur
c860: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f  n(NULL);..}...*o
c870: 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d  utbuffer_len_p =
c880: 20 73 69 7a 65 3b 0a 09 69 66 20 28 6f 75 74 62   size;..if (outb
c890: 75 66 66 65 72 29 20 7b 0a 09 09 6d 65 6d 63 70  uffer) {...memcp
c8a0: 79 28 6f 75 74 62 75 66 66 65 72 2c 20 62 75 66  y(outbuffer, buf
c8b0: 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09  fer_p, size);...
c8c0: 62 75 66 66 65 72 5f 70 20 2b 3d 20 73 69 7a 65  buffer_p += size
c8d0: 3b 0a 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 2d  ;...buffer_len -
c8e0: 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a 62 75 66 66  = size;....*buff
c8f0: 65 72 5f 6c 65 6e 5f 70 20 3d 20 62 75 66 66 65  er_len_p = buffe
c900: 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43 4b 45 59  r_len;....CACKEY
c910: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
c920: 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73  "BER-TLV results
c930: 3a 22 2c 20 6f 75 74 62 75 66 66 65 72 2c 20 73  :", outbuffer, s
c940: 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ize);..} else {.
c950: 09 09 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72  ..memmove(buffer
c960: 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65  , buffer_p, size
c970: 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 3d 20  );...buffer_p = 
c980: 62 75 66 66 65 72 3b 0a 0a 09 09 43 41 43 4b 45  buffer;....CACKE
c990: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
c9a0: 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74  ("BER-TLV result
c9b0: 73 3a 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a  s:", buffer, siz
c9c0: 65 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  e);..}...CACKEY_
c9d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
c9e0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
c9f0: 73 73 2e 20 20 53 69 7a 65 20 6f 66 20 63 6f 6e  ss.  Size of con
ca00: 74 65 6e 74 73 20 66 6f 72 20 74 61 67 20 25 30  tents for tag %0
ca10: 32 78 20 69 73 20 25 6c 75 22 2c 20 28 75 6e 73  2x is %lu", (uns
ca20: 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 2c 20  igned int) tag, 
ca30: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ca40: 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28  size);...return(
ca50: 62 75 66 66 65 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a  buffer_p);.}../*
ca60: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
ca70: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
ca80: 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75  ey_get_data(stru
ca90: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
caa0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
cab0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
cac0: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  e_t buffer_len, 
cad0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69  unsigned char oi
cae0: 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  d[3]);. *. * ARG
caf0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
cb00: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
cb10: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
cb20: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
cb30: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
cb40: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
cb50: 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20  ar *buffer. *   
cb60: 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66        [OUT] Buff
cb70: 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  er. *. *     siz
cb80: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 0a 20  e_t buffer_len. 
cb90: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
cba0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
cbb0: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
cbc0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
cbd0: 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20 2a 20 20  char oid[3]. *  
cbe0: 20 20 20 20 20 20 20 33 2d 62 79 74 65 20 4f 49         3-byte OI
cbf0: 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 0a  D to read. *. *.
cc00: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
cc10: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
cc20: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
cc30: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
cc40: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
cc50: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
cc60: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
cc70: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
cc80: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
cc90: 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74  ckey_get_data(st
cca0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
ccb0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
ccc0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
ccd0: 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
cce0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
ccf0: 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67  oid[3]) {..unsig
cd00: 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 3d  ned char cmd[] =
cd10: 20 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30 78   {0x5C, 0x03, 0x
cd20: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b  00, 0x00, 0x00};
cd30: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
cd40: 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65  *buffer_p;..size
cd50: 5f 74 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c  _t init_buffer_l
cd60: 65 6e 2c 20 73 69 7a 65 3b 0a 09 75 69 6e 74 31  en, size;..uint1
cd70: 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69  6_t respcode;..i
cd80: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
cd90: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cda0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
cdb0: 09 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e  .init_buffer_len
cdc0: 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a   = buffer_len;..
cdd0: 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d  .cmd[2] = oid[0]
cde0: 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b  ;..cmd[3] = oid[
cdf0: 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69  1];..cmd[4] = oi
ce00: 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74  d[2];.../* 256 t
ce10: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c  o indicate the l
ce20: 61 72 67 65 73 74 20 6d 65 73 73 61 67 65 20 73  argest message s
ce30: 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72  ize -- not clear
ce40: 20 69 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f   if this will wo
ce50: 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73  rk with all mess
ce60: 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  ages */..send_re
ce70: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
ce80: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
ce90: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
cea0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49  NISTSP800_73_3_I
ceb0: 4e 53 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30  NSTR_GET_DATA, 0
cec0: 78 33 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f  x3F, 0xFF, sizeo
ced0: 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36  f(cmd), cmd, 256
cee0: 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66  , &respcode, buf
cef0: 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
cf00: 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
cf10: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
cf20: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41  _E_RETRY) {...CA
cf30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cf40: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
cf50: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
cf60: 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a   read buffer");.
cf70: 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
cf80: 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20  _get_data(slot, 
cf90: 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 62 75 66  buffer, init_buf
cfa0: 66 65 72 5f 6c 65 6e 2c 20 6f 69 64 29 29 3b 0a  fer_len, oid));.
cfb0: 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  .}...if (send_re
cfc0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
cfd0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
cfe0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cff0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
d000: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
d010: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
d020: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
d030: 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
d040: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
d050: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
d060: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 62 75 66 66  ZE_MAX..if (buff
d070: 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  er_len > _POSIX_
d080: 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
d090: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d0a0: 54 46 28 22 52 65 61 64 20 62 79 74 65 73 20 28  TF("Read bytes (
d0b0: 62 75 66 66 65 72 5f 6c 65 6e 29 20 65 78 63 65  buffer_len) exce
d0c0: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
d0d0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
d0e0: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
d0f0: 25 6c 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20  %li, buffer_len 
d100: 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
d110: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
d120: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
d130: 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a  ) buffer_len);..
d140: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
d150: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
d160: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65  ...if (buffer_le
d170: 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41 43 4b 45  n < 2) {...CACKE
d180: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d190: 41 50 44 55 20 47 45 54 20 44 41 54 41 20 72 65  APDU GET DATA re
d1a0: 74 75 72 6e 65 64 20 25 6c 75 20 62 79 74 65 73  turned %lu bytes
d1b0: 2c 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  , which is too s
d1c0: 68 6f 72 74 20 66 6f 72 20 61 20 42 45 52 2d 54  hort for a BER-T
d1d0: 4c 56 20 72 65 73 70 6f 6e 73 65 22 2c 20 28 75  LV response", (u
d1e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
d1f0: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  ffer_len);....re
d200: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73  turn(-1);..}...s
d210: 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e  ize = buffer_len
d220: 3b 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61  ;..buffer_p = ca
d230: 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76  ckey_read_bertlv
d240: 5f 74 61 67 28 62 75 66 66 65 72 2c 20 26 62 75  _tag(buffer, &bu
d250: 66 66 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c 20  ffer_len, 0x53, 
d260: 4e 55 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a 09  NULL, &size);...
d270: 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20  if (buffer_p == 
d280: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
d290: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
d2a0: 61 67 20 64 65 63 6f 64 69 6e 67 20 66 61 69 6c  ag decoding fail
d2b0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
d2c0: 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72 65   error.");....re
d2d0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43  turn(-1);..}...C
d2e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d2f0: 54 42 55 46 28 22 47 45 54 20 44 41 54 41 20 72  TBUF("GET DATA r
d300: 65 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20  esult", buffer, 
d310: 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  size);...CACKEY_
d320: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
d330: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
d340: 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74  ss, read %lu byt
d350: 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  es", (unsigned l
d360: 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65  ong) size);...re
d370: 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f  turn(size);.}../
d380: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
d390: 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63       ssize_t cac
d3a0: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
d3b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
d3c0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
d3d0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
d3e0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75   size_t count, u
d3f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
d400: 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74  r_v, size_t init
d410: 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a  ial_offset);. *.
d420: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
d430: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
d440: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
d450: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
d460: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
d470: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
d480: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
d490: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
d4a0: 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20  ] Buffer. *. *  
d4b0: 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a     size_t count.
d4c0: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
d4d0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74  r of bytes to at
d4e0: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a  tempt to read. *
d4f0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
d500: 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20   char t_or_v. * 
d510: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74          Select t
d520: 68 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29  he T-buffer (01)
d530: 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32   or V-buffer (02
d540: 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20  ) to read from. 
d550: 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65   . *. *     size
d560: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
d570: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65  t. *         Spe
d580: 63 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20  cify the offset 
d590: 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61  to begin the rea
d5a0: 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20  d from. *. *. * 
d5b0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
d5c0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
d5d0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
d5e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
d5f0: 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20  tually read, or 
d600: 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a  -1 on error.. *.
d610: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
d620: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  None. *. */.stat
d630: 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65  ic ssize_t cacke
d640: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74  y_read_buffer(st
d650: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
d660: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
d670: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
d680: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73  ize_t count, uns
d690: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
d6a0: 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61  v, size_t initia
d6b0: 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73  l_offset) {..uns
d6c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74  igned char *init
d6d0: 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74  _buffer;..size_t
d6e0: 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69   init_count;..si
d6f0: 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61  ze_t init_initia
d700: 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65  l_offset;...size
d710: 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d  _t offset = 0, m
d720: 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63  ax_offset, max_c
d730: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
d740: 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69  char cmd[2];..ui
d750: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
d760: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
d770: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d780: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
d790: 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20  ;...init_buffer 
d7a0: 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f  = buffer;..init_
d7b0: 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09  count = count;..
d7c0: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66  init_initial_off
d7d0: 73 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66  set = initial_of
d7e0: 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73  fset;...max_offs
d7f0: 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78  et = count;..max
d800: 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f  _count = CACKEY_
d810: 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28  APDU_MTU;...if (
d820: 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74  t_or_v != 1 && t
d830: 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09  _or_v != 2) {...
d840: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d850: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f  NTF("Invalid T o
d860: 72 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70  r V parameter sp
d870: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
d880: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
d890: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
d8a0: 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f  .}...cmd[0] = t_
d8b0: 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31  or_v;...while (1
d8c0: 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74  ) {...if (offset
d8d0: 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20   >= max_offset) 
d8e0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
d8f0: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
d900: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
d910: 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f  rning what we go
d920: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61  t...");.....brea
d930: 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20  k;...}....count 
d940: 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f  = max_offset - o
d950: 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75  ffset;...if (cou
d960: 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20  nt > max_count) 
d970: 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78  {....count = max
d980: 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63  _count;...}....c
d990: 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a  md[1] = count;..
d9a0: 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
d9b0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
d9c0: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
d9d0: 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
d9e0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41   GSCIS_INSTR_REA
d9f0: 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74  D_BUFFER, ((init
da00: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
da10: 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66  set) >> 8) & 0xf
da20: 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  f, (initial_offs
da30: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30  et + offset) & 0
da40: 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  xff, sizeof(cmd)
da50: 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65  , cmd, 0x00, &re
da60: 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b  spcode, buffer +
da70: 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29   offset, &count)
da80: 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  ;....if (send_re
da90: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
daa0: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43  _E_RETRY) {....C
dab0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
dac0: 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67  TF("ADPU Sending
dad0: 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e   failed, retryin
dae0: 67 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b  g read buffer");
daf0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b  .....return(cack
db00: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
db10: 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72  lot, init_buffer
db20: 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f  , init_count, t_
db30: 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69  or_v, init_initi
db40: 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d  al_offset));...}
db50: 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
db60: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
db70: 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72  S_OK) {....if (r
db80: 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38  espcode == 0x6A8
db90: 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78  6) {.....if (max
dba0: 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09  _count == 1) {..
dbb0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
dbc0: 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20  ......max_count 
dbd0: 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b  = max_count / 2;
dbe0: 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
dbf0: 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
dc00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
dc10: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29  ckey_send_apdu()
dc20: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
dc30: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
dc40: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
dc50: 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b  ...}....offset +
dc60: 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28  = count;....if (
dc70: 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e  count < max_coun
dc80: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
dc90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f  EBUG_PRINTF("Sho
dca0: 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74  rt read -- count
dcb0: 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20   = %i, cmd[1] = 
dcc0: 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74  %i", (int) count
dcd0: 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b  , (int) cmd[1]);
dce0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
dcf0: 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
dd00: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
dd10: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
dd20: 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74  _MAX..if (offset
dd30: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
dd40: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
dd50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66  DEBUG_PRINTF("Of
dd60: 66 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78  fset exceeds max
dd70: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
dd80: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
dd90: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66  . (max = %li, of
dda0: 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  fset = %lu)", (l
ddb0: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
ddc0: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
ddd0: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
dde0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
ddf0: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
de00: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
de10: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
de20: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
de30: 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20  ead %lu bytes", 
de40: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
de50: 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72  offset);...retur
de60: 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  n(offset);.}../*
de70: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
de80: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
de90: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
dea0: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
deb0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
dec0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64  signed char *aid
ded0: 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e  , size_t aid_len
dee0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
def0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
df00: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
df10: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
df20: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
df30: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
df40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
df50: 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42  aid. *         B
df60: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
df70: 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65   Applet ID to se
df80: 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73  lect. *. *     s
df90: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a  ize_t aid_len. *
dfa0: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
dfb0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
dfc0: 22 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44  "aid" (Applet ID
dfd0: 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20  ) parameter. *. 
dfe0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
dff0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
e000: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
e010: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
e020: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
e030: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
e040: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
e050: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
e060: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
e070: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
e080: 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20  t_applet(struct 
e090: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
e0a0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
e0b0: 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69   *aid, size_t ai
e0c0: 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65  d_len) {..int se
e0d0: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
e0e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
e0f0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
e100: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
e110: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70  F("Selecting app
e120: 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f  let:", aid, aid_
e130: 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74  len);...send_ret
e140: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
e150: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
e160: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
e170: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
e180: 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53  T, GSCIS_PARAM_S
e190: 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78  ELECT_APPLET, 0x
e1a0: 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64  00, aid_len, aid
e1b0: 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55  , 0x00, NULL, NU
e1c0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  LL, NULL);...if 
e1d0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
e1e0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
e1f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
e200: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
e210: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
e220: 72 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20  retrying select 
e230: 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74  applet");....ret
e240: 75 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63  urn(cackey_selec
e250: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61  t_applet(slot, a
e260: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09  id, aid_len));..
e270: 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  }...if (send_ret
e280: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
e290: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
e2a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
e2b0: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70  ailed to open ap
e2c0: 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  plet, returning 
e2d0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
e2e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
e2f0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
e300: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
e310: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
e320: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20  sfully selected 
e330: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  file");...return
e340: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
e350: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
e360: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
e370: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
e380: 20 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61   cackey_detect_a
e390: 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61  nd_select_root_a
e3a0: 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63  pplet(struct cac
e3b0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
e3c0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74  cackey_pcsc_id_t
e3d0: 79 70 65 20 74 79 70 65 5f 68 69 6e 74 29 3b 0a  ype type_hint);.
e3e0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e3f0: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
e400: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
e410: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
e420: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
e430: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 63 61   to. *. *     ca
e440: 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
e450: 65 20 74 79 70 65 5f 68 69 6e 74 0a 20 2a 20 20  e type_hint. *  
e460: 20 20 20 20 20 20 20 41 20 68 69 6e 74 20 61 73         A hint as
e470: 20 74 6f 20 77 68 69 63 68 20 74 79 70 65 20 6f   to which type o
e480: 66 20 63 61 72 64 20 6d 69 67 68 74 20 62 65 20  f card might be 
e490: 69 6e 20 74 68 69 73 20 73 6c 6f 74 20 28 43 41  in this slot (CA
e4a0: 43 20 6f 72 20 50 49 56 29 0a 20 2a 0a 20 2a 20  C or PIV). *. * 
e4b0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
e4c0: 20 20 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59      CACKEY_ID_TY
e4d0: 50 45 5f 50 49 56 20 20 20 20 20 20 20 49 66 20  PE_PIV       If 
e4e0: 74 68 65 20 63 61 72 64 20 63 6f 6e 6e 65 63 74  the card connect
e4f0: 65 64 20 69 73 20 61 20 50 49 56 0a 20 2a 20 20  ed is a PIV. *  
e500: 20 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50     CACKEY_ID_TYP
e510: 45 5f 43 41 43 20 20 20 20 20 20 20 49 66 20 74  E_CAC       If t
e520: 68 65 20 63 61 72 64 20 63 6f 6e 6e 65 63 74 65  he card connecte
e530: 64 20 69 73 20 61 20 43 41 43 20 77 69 74 68 20  d is a CAC with 
e540: 74 68 65 20 43 43 43 0a 20 2a 20 20 20 20 20 20  the CCC. *      
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 20 20 20 20 61 70 70 6c 65 74 0a 20          applet. 
e570: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 49 44 5f  *     CACKEY_ID_
e580: 54 59 50 45 5f 45 52 52 4f 52 20 20 20 20 20 49  TYPE_ERROR     I
e590: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
e5a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61  to determine wha
e5b0: 74 20 74 79 70 65 20 6f 66 20 63 61 72 64 0a 20  t type of card. 
e5c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
e5e0: 73 20 63 6f 6e 6e 65 63 74 65 64 0a 20 2a 0a 20  s connected. *. 
e5f0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
e600: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
e610: 65 6c 65 63 74 73 20 74 68 65 20 22 72 6f 6f 74  elects the "root
e620: 22 20 61 70 70 6c 65 74 2c 20 61 66 74 65 72 20  " applet, after 
e630: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
e640: 20 63 61 6c 6c 65 64 0a 20 2a 20 20 20 20 20 74   called. *     t
e650: 68 65 20 75 73 65 72 20 6d 61 79 20 62 65 20 72  he user may be r
e660: 65 71 75 69 72 65 64 20 74 6f 20 6c 6f 67 69 6e  equired to login
e670: 20 61 67 61 69 6e 0a 20 2a 0a 20 2a 2f 0a 73 74   again. *. */.st
e680: 61 74 69 63 20 63 61 63 6b 65 79 5f 70 63 73 63  atic cackey_pcsc
e690: 5f 69 64 5f 74 79 70 65 20 63 61 63 6b 65 79 5f  _id_type cackey_
e6a0: 64 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63  detect_and_selec
e6b0: 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 74  t_root_applet(st
e6c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e6d0: 20 2a 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 70   *slot, cackey_p
e6e0: 63 73 63 5f 69 64 5f 74 79 70 65 20 74 79 70 65  csc_id_type type
e6f0: 5f 68 69 6e 74 29 20 7b 0a 09 75 6e 73 69 67 6e  _hint) {..unsign
e700: 65 64 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b  ed char ccc_aid[
e710: 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43  ] = {GSCIS_AID_C
e720: 43 43 7d 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d  CC}, piv_aid[] =
e730: 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33   {NISTSP800_73_3
e740: 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 63 61 63 6b  _PIV_AID};..cack
e750: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
e760: 74 72 79 5f 74 79 70 65 73 5b 32 5d 2c 20 74 72  try_types[2], tr
e770: 79 5f 74 79 70 65 3b 0a 09 69 6e 74 20 73 65 6e  y_type;..int sen
e780: 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b  d_ret;..int idx;
e790: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e7a0: 50 52 49 4e 54 46 28 22 52 65 73 65 6c 65 63 74  PRINTF("Reselect
e7b0: 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 61 70 70  ing the root app
e7c0: 6c 65 74 22 29 3b 0a 0a 09 69 66 20 28 74 79 70  let");...if (typ
e7d0: 65 5f 68 69 6e 74 20 3d 3d 20 43 41 43 4b 45 59  e_hint == CACKEY
e7e0: 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  _ID_TYPE_UNKNOWN
e7f0: 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e  ) {...if (slot->
e800: 63 61 63 68 65 64 5f 63 65 72 74 73 20 26 26 20  cached_certs && 
e810: 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
e820: 74 73 5f 63 6f 75 6e 74 20 3e 20 30 29 20 7b 0a  ts_count > 0) {.
e830: 09 09 09 74 79 70 65 5f 68 69 6e 74 20 3d 20 73  ...type_hint = s
e840: 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
e850: 73 5b 30 5d 2e 69 64 5f 74 79 70 65 3b 0a 09 09  s[0].id_type;...
e860: 7d 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74  }..}...switch (t
e870: 79 70 65 5f 68 69 6e 74 29 20 7b 0a 09 09 63 61  ype_hint) {...ca
e880: 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
e890: 45 5f 50 49 56 3a 0a 09 09 09 43 41 43 4b 45 59  E_PIV:....CACKEY
e8a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
e8b0: 72 79 69 6e 67 20 74 6f 20 72 65 73 65 6c 65 63  rying to reselec
e8c0: 74 20 74 68 65 20 50 49 56 20 72 6f 6f 74 20 61  t the PIV root a
e8d0: 70 70 6c 65 74 20 66 69 72 73 74 22 29 3b 0a 0a  pplet first");..
e8e0: 09 09 09 74 72 79 5f 74 79 70 65 73 5b 30 5d 20  ...try_types[0] 
e8f0: 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
e900: 5f 50 49 56 3b 0a 09 09 09 74 72 79 5f 74 79 70  _PIV;....try_typ
e910: 65 73 5b 31 5d 20 3d 20 43 41 43 4b 45 59 5f 49  es[1] = CACKEY_I
e920: 44 5f 54 59 50 45 5f 43 41 43 3b 0a 0a 09 09 09  D_TYPE_CAC;.....
e930: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
e940: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
e950: 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67  G_PRINTF("Trying
e960: 20 74 6f 20 72 65 73 65 6c 65 63 74 20 74 68 65   to reselect the
e970: 20 43 41 43 20 43 43 43 20 61 70 70 6c 65 74 20   CAC CCC applet 
e980: 66 69 72 73 74 22 29 3b 0a 0a 09 09 09 74 72 79  first");.....try
e990: 5f 74 79 70 65 73 5b 30 5d 20 3d 20 43 41 43 4b  _types[0] = CACK
e9a0: 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a  EY_ID_TYPE_CAC;.
e9b0: 09 09 09 74 72 79 5f 74 79 70 65 73 5b 31 5d 20  ...try_types[1] 
e9c0: 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
e9d0: 5f 50 49 56 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  _PIV;.....break;
e9e0: 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
e9f0: 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
ea00: 66 28 74 72 79 5f 74 79 70 65 73 29 20 2f 20 73  f(try_types) / s
ea10: 69 7a 65 6f 66 28 74 72 79 5f 74 79 70 65 73 5b  izeof(try_types[
ea20: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
ea30: 09 74 72 79 5f 74 79 70 65 20 3d 20 74 72 79 5f  .try_type = try_
ea40: 74 79 70 65 73 5b 69 64 78 5d 3b 0a 0a 09 09 73  types[idx];....s
ea50: 77 69 74 63 68 20 28 74 72 79 5f 74 79 70 65 29  witch (try_type)
ea60: 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45   {....case CACKE
ea70: 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09  Y_ID_TYPE_CAC:..
ea80: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ea90: 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74  PRINTF("Trying t
eaa0: 6f 20 73 65 6c 65 63 74 20 74 68 65 20 43 41 43  o select the CAC
eab0: 20 43 43 43 20 61 70 70 6c 65 74 22 29 3b 0a 0a   CCC applet");..
eac0: 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
ead0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
eae0: 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69  let(slot, ccc_ai
eaf0: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69  d, sizeof(ccc_ai
eb00: 64 29 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  d));......break;
eb10: 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
eb20: 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
eb30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
eb40: 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20  INTF("Trying to 
eb50: 73 65 6c 65 63 74 20 74 68 65 20 50 49 56 20 72  select the PIV r
eb60: 6f 6f 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09  oot applet");...
eb70: 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
eb80: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
eb90: 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 64  et(slot, piv_aid
eba0: 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 64  , sizeof(piv_aid
ebb0: 29 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ));......break;.
ebc0: 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  ..}....if (send_
ebd0: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
ebe0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
ebf0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ec00: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
ec10: 73 65 6c 65 63 74 65 64 20 74 68 65 20 25 73 20  selected the %s 
ec20: 61 70 70 6c 65 74 20 2d 2d 20 73 65 74 74 69 6e  applet -- settin
ec30: 67 20 74 68 65 20 5c 22 4c 4f 47 49 4e 20 52 45  g the \"LOGIN RE
ec40: 51 55 49 52 45 44 5c 22 20 66 6c 61 67 20 6f 6e  QUIRED\" flag on
ec50: 20 74 68 65 20 74 6f 6b 65 6e 22 2c 0a 09 09 09   the token",....
ec60: 09 74 72 79 5f 74 79 70 65 20 3d 3d 20 43 41 43  .try_type == CAC
ec70: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 20  KEY_ID_TYPE_CAC 
ec80: 3f 20 22 43 41 43 22 20 3a 20 22 50 49 56 22 0a  ? "CAC" : "PIV".
ec90: 09 09 09 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e  ...);.....slot->
eca0: 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
ecb0: 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
ecc0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 74 72 79  ;.....return(try
ecd0: 5f 74 79 70 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  _type);...}..}..
ece0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ecf0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
ed00: 73 65 6c 65 63 74 20 61 6e 79 20 61 70 70 6c 65  select any apple
ed10: 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  t, returning in 
ed20: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74  failure");...ret
ed30: 75 72 6e 28 43 41 43 4b 45 59 5f 49 44 5f 54 59  urn(CACKEY_ID_TY
ed40: 50 45 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a  PE_ERROR);.}../*
ed50: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
ed60: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
ed70: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
ed80: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
ed90: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
eda0: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20  16_t ef);. *. * 
edb0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
edc0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
edd0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
ede0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
edf0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
ee00: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
ee10: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45   ef. *         E
ee20: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f  lemental File to
ee30: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45   select. *. * RE
ee40: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
ee50: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
ee60: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
ee70: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
ee80: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
ee90: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
eea0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
eeb0: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61    This selects a
eec0: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c  n Elementary Fil
eed0: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65  e (EF) under the
eee0: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63   currently selec
eef0: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63  ted. *     Dedic
ef00: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20  ated File (DF). 
ef10: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c  *. *     Typical
ef20: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  ly this is calle
ef30: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e  d after selectin
ef40: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70  g the correct Ap
ef50: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20  plet (using. *  
ef60: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74     cackey_select
ef70: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20  _applet) for VM 
ef80: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61  cards. *. */.sta
ef90: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
efa0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
efb0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
efc0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
efd0: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69  16_t ef) {..unsi
efe0: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75  gned char fid_bu
eff0: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  f[2];..int send_
f000: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
f010: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
f020: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ed.");.../* Open
f030: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20   the elementary 
f040: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66  file */..fid_buf
f050: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20  [0] = (ef >> 8) 
f060: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66  & 0xff;..fid_buf
f070: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b  [1] = ef & 0xff;
f080: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f090: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
f0a0: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20  g file: %04lx", 
f0b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f0c0: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  ef);...send_ret 
f0d0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
f0e0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
f0f0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
f100: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
f110: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69  , 0x02, 0x0C, si
f120: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66  zeof(fid_buf), f
f130: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55  id_buf, 0x00, NU
f140: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
f150: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
f160: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
f170: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
f180: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
f190: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
f1a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
f1b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
f1c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
f1d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
f1e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f1f0: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
f200: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
f210: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
f220: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
f230: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
f240: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
f250: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
f260: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
f270: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20  entity *root);. 
f280: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
f290: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
f2a0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
f2b0: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  root. *         
f2c0: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20  Root of the TLV 
f2d0: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72  list to start fr
f2e0: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55  eeing. *. * RETU
f2f0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
f300: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
f310: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
f320: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20  ction frees the 
f330: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65  TLV linked liste
f340: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a  d returned from.
f350: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72   *     "cackey_r
f360: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a  ead_tlv". *. */.
f370: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
f380: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
f390: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
f3a0: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73  tity *root) {..s
f3b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
f3c0: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a  _entity *curr, *
f3d0: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74  next;...if (root
f3e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
f3f0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
f400: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72  curr = root; cur
f410: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20  r; curr = next) 
f420: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d  {...next = curr-
f430: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63  >_next;....switc
f440: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a  h (curr->tag) {.
f450: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
f460: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
f470: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
f480: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
f490: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29  if (curr->value)
f4a0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
f4b0: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d  r->value);.....}
f4c0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
f4d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
f4e0: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63  RDURL:.....if (c
f4f0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
f500: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  rl) {......free(
f510: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
f520: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  url);.....}.....
f530: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72  break;...}....fr
f540: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72  ee(curr);..}...r
f550: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
f560: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
f570: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
f580: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
f590: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
f5a0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
f5b0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
f5c0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
f5d0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
f5e0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b  tlv_entity *cack
f5f0: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75  ey_read_tlv(stru
f600: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
f610: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  slot) {..struct 
f620: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
f630: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20  y *curr_entity, 
f640: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  *root = NULL, *l
f650: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73  ast = NULL;..uns
f660: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f  igned char tlen_
f670: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66  buf[2], tval_buf
f680: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09  [1024], *tval;..
f690: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c  unsigned char vl
f6a0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f  en_buf[2], vval_
f6b0: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c  buf[8192], *vval
f6c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
f6d0: 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67   *tmpbuf;..unsig
f6e0: 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c  ned long tmpbufl
f6f0: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65  en;..ssize_t tle
f700: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  n, vlen;..ssize_
f710: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
f720: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30  e_t offset_t = 0
f730: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a  , offset_v = 0;.
f740: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
f750: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
f760: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  th;.#ifdef HAVE_
f770: 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70  LIBZ..int uncomp
f780: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66  ress_ret;.#endif
f790: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f7a0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
f7b0: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  );...read_ret = 
f7c0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
f7d0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75  er(slot, tlen_bu
f7e0: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62  f, sizeof(tlen_b
f7f0: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  uf), 1, offset_t
f800: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
f810: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f   != sizeof(tlen_
f820: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
f830: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
f840: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
f850: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
f860: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
f870: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d  LL);..}...tlen =
f880: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (tlen_buf[1] <<
f890: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30   8) | tlen_buf[0
f8a0: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  ];...read_ret = 
f8b0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
f8c0: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75  er(slot, vlen_bu
f8d0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62  f, sizeof(vlen_b
f8e0: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  uf), 2, offset_v
f8f0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
f900: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f   != sizeof(vlen_
f910: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
f920: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
f930: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
f940: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
f950: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
f960: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d  LL);..}...vlen =
f970: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (vlen_buf[1] <<
f980: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30   8) | vlen_buf[0
f990: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ];...CACKEY_DEBU
f9a0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65  G_PRINTF("Tag Le
f9b0: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75  ngth = %lu, Valu
f9c0: 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c  e Length = %lu",
f9d0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
f9e0: 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64   tlen, (unsigned
f9f0: 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09   long) vlen);...
fa00: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09  offset_t += 2;..
fa10: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a  offset_v += 2;..
fa20: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65  .if (tlen > size
fa30: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(tval_buf)) {.
fa40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fa50: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74  RINTF("Tag lengt
fa60: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
fa70: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
fa80: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
fa90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
faa0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (vlen > sizeof(
fab0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  vval_buf)) {...C
fac0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fad0: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68  TF("Value length
fae0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
faf0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
fb00: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
fb10: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
fb20: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
fb30: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
fb40: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c   tval_buf, tlen,
fb50: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
fb60: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
fb70: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  tlen) {...CACKEY
fb80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
fb90: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
fba0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72  tire T-buffer, r
fbb0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
fbc0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
fbd0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
fbe0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
fbf0: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
fc00: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c   vval_buf, vlen,
fc10: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
fc20: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
fc30: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  vlen) {...CACKEY
fc40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
fc50: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
fc60: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72  tire V-buffer, r
fc70: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
fc80: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
fc90: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61  (NULL);..}...tva
fca0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76  l = tval_buf;..v
fcb0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a  val = vval_buf;.
fcc0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30  .while (tlen > 0
fcd0: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a   && vlen > 0) {.
fce0: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09  ..tag = *tval;..
fcf0: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d  .tval++;...tlen-
fd00: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20  -;....if (*tval 
fd10: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65  == 0xff) {....le
fd20: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20  ngth = (tval[2] 
fd30: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b  << 8) | tval[1];
fd40: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09  ....tval += 3;..
fd50: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d  ..tlen -= 3;...}
fd60: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74   else {....lengt
fd70: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76  h = *tval;....tv
fd80: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b  al++;....tlen--;
fd90: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
fda0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
fdb0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41  : %s (%02x)", CA
fdc0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
fdd0: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c  TAG_TO_STR(tag),
fde0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
fdf0: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44  tag);...CACKEY_D
fe00: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56  EBUG_PRINTBUF("V
fe10: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65  alue:", vval, le
fe20: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65  ngth);....curr_e
fe30: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
fe40: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09  switch (tag) {..
fe50: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
fe60: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75  _CARDURL:.....cu
fe70: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
fe80: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
fe90: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75  entity));.....cu
fea0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
feb0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f  _cardurl = mallo
fec0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
fed0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
fee0: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d  durl));......mem
fef0: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d  cpy(curr_entity-
ff00: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
ff10: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09  rid, vval, 5);..
ff20: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
ff30: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
ff40: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d  pptype = vval[5]
ff50: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
ff60: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
ff70: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76  ->objectid = (vv
ff80: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[6] << 8) | vv
ff90: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[7];.....curr_
ffa0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
ffb0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28  rdurl->appid = (
ffc0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20  vval[8] << 8) | 
ffd0: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75  vval[9];......cu
ffe0: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
fff0: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
10000 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
10010 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
10020 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
10030 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
10040 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
10050 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
10060 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
10070 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
10080 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  c(length);......
10090 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
100a0 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09  val, length);...
100b0 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
100c0 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
100d0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
100e0 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  th = length;....
100f0 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
10100 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
10110 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
10120 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
10130 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10140 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
10150 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72  FICATE:.....curr
10160 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
10170 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
10180 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20  tity));..#ifdef 
10190 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d  HAVE_LIBZ.....tm
101a0 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
101b0 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66   * 2;.....tmpbuf
101c0 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
101d0 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d  len);......uncom
101e0 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f  press_ret = unco
101f0 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26  mpress(tmpbuf, &
10200 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c  tmpbuflen, vval,
10210 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66   length);.....if
10220 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
10230 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09   != Z_OK) {.....
10240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10250 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
10260 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f  decompress, unco
10270 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65  mpress() returne
10280 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e  d %i -- resortin
10290 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79  g to direct copy
102a0 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ", uncompress_re
102b0 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66  t);.......tmpbuf
102c0 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
102d0 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
102e0 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
102f0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
10300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
10310 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20  F("Decompressed 
10320 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  to:", tmpbuf, tm
10330 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a  pbuflen);.#else.
10340 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10350 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67  _PRINTF("Missing
10360 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74   ZLIB Support, t
10370 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
10380 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73  is likely useles
10390 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70  s...");......tmp
103a0 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
103b0 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
103c0 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
103d0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63  );.#endif......c
103e0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
103f0 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
10400 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
10410 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09   tmpbuflen;.....
10420 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
10430 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ue = tmpbuf;....
10440 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
10450 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
10460 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
10470 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
10480 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
10490 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
104a0 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
104b0 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
104c0 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
104d0 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
104e0 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61  value_byte = vva
104f0 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[0];.....curr_e
10500 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
10510 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
10520 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20  ...}....vval += 
10530 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d  length;...vlen -
10540 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20  = length;....if 
10550 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20  (curr_entity != 
10560 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72  NULL) {....if (r
10570 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
10580 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65  ...root = curr_e
10590 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
105a0 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c  if (last != NULL
105b0 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e  ) {.....last->_n
105c0 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ext = curr_entit
105d0 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74  y;....}.....last
105e0 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
105f0 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
10600 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  root);.}../*. * 
10610 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
10620 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
10630 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
10640 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
10650 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
10660 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
10670 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
10680 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
10690 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  ee_certs(struct 
106a0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
106b0 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
106c0 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66  e_t count, int f
106d0 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69  ree_start) {..si
106e0 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
106f0 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
10700 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
10710 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
10720 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
10730 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
10740 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
10750 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
10760 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
10770 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
10780 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
10790 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
107a0 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73  }...return;.}..s
107b0 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
107c0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
107d0 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63  y *cackey_copy_c
107e0 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
107f0 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
10800 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20 63   *dest, struct c
10810 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
10820 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65  ity *start, size
10830 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a  _t count) {..siz
10840 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73  e_t idx;...if (s
10850 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tart == NULL) {.
10860 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
10870 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d  .}...if (dest ==
10880 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20   NULL) {...dest 
10890 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
108a0 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b  *dest) * count);
108b0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
108c0 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b   0; idx < count;
108d0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73 74   idx++) {...dest
108e0 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d 20  [idx].id_type = 
108f0 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74 79  start[idx].id_ty
10900 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 64  pe;....switch (d
10910 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65  est[idx].id_type
10920 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ) {....case CACK
10930 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
10940 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b  ....memcpy(dest[
10950 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70  idx].card.cac.ap
10960 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78 5d  plet, start[idx]
10970 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  .card.cac.applet
10980 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64  , sizeof(dest[id
10990 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  x].card.cac.appl
109a0 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74 5b 69  et));.....dest[i
109b0 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c  dx].card.cac.fil
109c0 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  e = start[idx].c
109d0 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09 09  ard.cac.file;...
109e0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
109f0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
10a00 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b 69 64  PIV:.....dest[id
10a10 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f  x].card.piv.key_
10a20 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  id = start[idx].
10a30 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 3b  card.piv.key_id;
10a40 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74  .....memcpy(dest
10a50 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c  [idx].card.piv.l
10a60 61 62 65 6c 2c 20 73 74 61 72 74 5b 69 64 78 5d  abel, start[idx]
10a70 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c  .card.piv.label,
10a80 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78   sizeof(dest[idx
10a90 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ].card.piv.label
10aa0 29 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ));.....break;..
10ab0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
10ac0 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a  _TYPE_CERT_ONLY:
10ad0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
10ae0 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  ..dest[idx].cert
10af0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74  ificate_len = st
10b00 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
10b10 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74  cate_len;...dest
10b20 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20  [idx].keysize = 
10b30 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69  start[idx].keysi
10b40 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d  ze;....dest[idx]
10b50 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  .certificate = m
10b60 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e  alloc(dest[idx].
10b70 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
10b80 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b  ;...memcpy(dest[
10b90 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
10ba0 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72  , start[idx].cer
10bb0 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b 69  tificate, dest[i
10bc0 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
10bd0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  len);..}...retur
10be0 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  n(dest);.}../*. 
10bf0 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
10c00 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
10c10 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
10c20 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
10c30 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
10c40 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
10c50 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
10c60 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
10c70 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
10c80 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72  *cackey_read_cer
10c90 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
10ca0 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
10cb0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
10cc0 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c  identity *certs,
10cd0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
10ce0 63 6f 75 6e 74 29 20 7b 0a 09 63 61 63 6b 65 79  count) {..cackey
10cf0 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 63 68  _pcsc_id_type ch
10d00 65 63 6b 5f 69 64 5f 74 79 70 65 3b 0a 09 73 74  eck_id_type;..st
10d10 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
10d20 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  _identity *curr_
10d30 69 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  id;..struct cack
10d40 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
10d50 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72  cc_tlv, *ccc_cur
10d60 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70  r, *app_tlv, *ap
10d70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65  p_curr;..unsigne
10d80 64 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c  d char *piv_oid,
10d90 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68   piv_oid_pivauth
10da0 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
10db0 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48  73_3_OID_PIVAUTH
10dc0 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61  }, piv_oid_signa
10dd0 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  ture[] = {NISTSP
10de0 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
10df0 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64  NATURE}, piv_oid
10e00 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53  _keymgt[] = {NIS
10e10 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
10e20 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e  KEYMGT};..unsign
10e30 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64  ed char curr_aid
10e40 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  [7];..unsigned c
10e50 68 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d  har buffer[8192]
10e60 2c 20 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d  , *buffer_p, *tm
10e70 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  pbuf;..unsigned 
10e80 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b  long outidx = 0;
10e90 0a 09 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65  ..char *piv_labe
10ea0 6c 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74  l;..cackey_ret t
10eb0 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a  ransaction_ret;.
10ec0 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65  .ssize_t read_re
10ed0 74 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65  t;..size_t buffe
10ee0 72 5f 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e  r_len, tmpbuflen
10ef0 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73  ;..int certs_res
10f00 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e  izable;..int sen
10f10 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65  d_ret, select_re
10f20 74 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c  t;..int piv_key,
10f30 20 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 63   piv = 0;..int c
10f40 61 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69  ached_certs_vali
10f50 64 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 09 63 61  d;..int idx;..ca
10f60 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
10f70 65 20 69 64 5f 74 79 70 65 3b 0a 23 69 66 64 65  e id_type;.#ifde
10f80 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74  f HAVE_LIBZ..int
10f90 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b   uncompress_ret;
10fa0 0a 09 7a 5f 73 74 72 65 61 6d 20 67 7a 69 70 5f  ..z_stream gzip_
10fb0 73 74 72 65 61 6d 3b 0a 23 65 6e 64 69 66 0a 0a  stream;.#endif..
10fc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10fd0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
10fe0 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20  ...if (count == 
10ff0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
11000 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
11010 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65  ount is NULL, re
11020 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
11030 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
11040 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
11050 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  certs != NULL) {
11060 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d  ...if (*count ==
11070 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
11080 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11090 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75 72  quested we retur
110a0 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f  n 0 objects, sho
110b0 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09  rt-circuit");...
110c0 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b  ..return(certs);
110d0 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 68 65 64  ...}..}...cached
110e0 5f 63 65 72 74 73 5f 76 61 6c 69 64 20 3d 20 30  _certs_valid = 0
110f0 3b 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c  ;..if (!slot->sl
11100 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66  ot_reset) {...if
11110 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63   (slot->cached_c
11120 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63 68 65  erts) {....cache
11130 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 20 3d 20  d_certs_valid = 
11140 31 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d  1;.....if (slot-
11150 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
11160 75 6e 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 63  unt > 0) {.....c
11170 61 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69  ached_certs_vali
11180 64 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a  d = 1;....}...}.
11190 09 7d 0a 0a 09 69 66 20 28 63 61 63 68 65 64 5f  .}...if (cached_
111a0 63 65 72 74 73 5f 76 61 6c 69 64 29 20 7b 0a 09  certs_valid) {..
111b0 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55  .if (certs == NU
111c0 4c 4c 29 20 7b 0a 09 09 09 63 65 72 74 73 20 3d  LL) {....certs =
111d0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
111e0 63 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d 3e 63  certs) * slot->c
111f0 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
11200 74 29 3b 0a 09 09 09 2a 63 6f 75 6e 74 20 3d 20  t);....*count = 
11210 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
11220 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 7d 20 65 6c  ts_count;...} el
11230 73 65 20 7b 0a 09 09 09 69 66 20 28 2a 63 6f 75  se {....if (*cou
11240 6e 74 20 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65  nt > slot->cache
11250 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b  d_certs_count) {
11260 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c  .....*count = sl
11270 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
11280 5f 63 6f 75 6e 74 3b 0a 09 09 09 7d 0a 09 09 7d  _count;....}...}
11290 0a 0a 09 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f  ....cackey_copy_
112a0 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c 6f  certs(certs, slo
112b0 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c  t->cached_certs,
112c0 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43   *count);....CAC
112d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
112e0 28 22 52 65 74 75 72 6e 69 6e 67 20 63 61 63 68  ("Returning cach
112f0 65 64 20 63 65 72 74 69 66 69 63 61 74 65 73 20  ed certificates 
11300 66 6f 72 20 74 68 69 73 20 73 6c 6f 74 20 28 63  for this slot (c
11310 61 72 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ard has not been
11320 20 72 65 73 65 74 20 61 6e 64 20 74 68 65 72 65   reset and there
11330 20 61 72 65 20 63 61 63 68 65 64 20 63 65 72 74   are cached cert
11340 73 20 61 76 61 69 6c 61 62 6c 65 29 22 29 3b 0a  s available)");.
11350 0a 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29  ...return(certs)
11360 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  ;..}...if (slot-
11370 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
11380 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
11390 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65  erts(slot->cache
113a0 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  d_certs, slot->c
113b0 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
113c0 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e  t, 1);....slot->
113d0 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e  cached_certs = N
113e0 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ULL;..}.../* Beg
113f0 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74  in a SmartCard t
11400 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74  ransaction */..t
11410 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d  ransaction_ret =
11420 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
11430 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
11440 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f  ..if (transactio
11450 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
11460 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
11470 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11480 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e  TF("Unable begin
11490 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
114a0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
114b0 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
114c0 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74  NULL);..}...id_t
114d0 79 70 65 20 3d 20 63 61 63 6b 65 79 5f 64 65 74  ype = cackey_det
114e0 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72  ect_and_select_r
114f0 6f 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  oot_applet(slot,
11500 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
11510 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09 73 77 69 74  UNKNOWN);...swit
11520 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
11530 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
11540 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 70 69 76  TYPE_CAC:....piv
11550 20 3d 20 30 3b 0a 0a 09 09 09 62 72 65 61 6b 3b   = 0;.....break;
11560 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
11570 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 70  D_TYPE_PIV:....p
11580 69 76 20 3d 20 31 3b 0a 0a 09 09 09 62 72 65 61  iv = 1;.....brea
11590 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  k;...case CACKEY
115a0 5f 49 44 5f 54 59 50 45 5f 45 52 52 4f 52 3a 0a  _ID_TYPE_ERROR:.
115b0 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
115c0 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61  SmartCard Transa
115d0 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ction */....cack
115e0 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
115f0 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66  on(slot);.....if
11600 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29   (certs == NULL)
11610 20 7b 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20   {.....*count = 
11620 30 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  0;....}.....retu
11630 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 09 09 62 72  rn(NULL);.....br
11640 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b  eak;...case CACK
11650 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
11660 4f 4e 4c 59 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ONLY:....CACKEY_
11670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11680 72 6f 72 2e 20 20 49 6d 70 6f 73 73 69 62 6c 65  ror.  Impossible
11690 20 63 6f 6e 64 69 74 69 6f 6e 20 72 65 61 63 68   condition reach
116a0 65 64 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b  ed.");.....break
116b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73  ;..}...if (certs
116c0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65   == NULL) {...ce
116d0 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rts = malloc(siz
116e0 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29  eof(*certs) * 5)
116f0 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a  ;...*count = 5;.
11700 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  ..certs_resizabl
11710 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  e = 1;..} else {
11720 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
11730 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  le = 0;..}...if 
11740 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69  (piv) {...for (i
11750 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b  dx = 0; idx < 3;
11760 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69   idx++) {....swi
11770 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09  tch (idx) {.....
11780 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76  case 0:......piv
11790 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70  _oid = piv_oid_p
117a0 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76  ivauth;......piv
117b0 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
117c0 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54  _78_3_KEY_PIVAUT
117d0 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65  H;......piv_labe
117e0 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 63 61 74  l = "Authenticat
117f0 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65 61 6b  ion";......break
11800 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09  ;.....case 1:...
11810 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
11820 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a  _oid_signature;.
11830 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e  .....piv_key = N
11840 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45  ISTSP800_78_3_KE
11850 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09  Y_SIGNATURE;....
11860 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 53  ..piv_label = "S
11870 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 09 09 09  ignature";......
11880 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20  break;.....case 
11890 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20  2:......piv_oid 
118a0 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74  = piv_oid_keymgt
118b0 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d  ;......piv_key =
118c0 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
118d0 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09  KEY_KEYMGT;.....
118e0 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 4b 65  .piv_label = "Ke
118f0 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b 0a 09  y Management";..
11900 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
11910 0a 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63  ....read_ret = c
11920 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73  ackey_get_data(s
11930 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a  lot, buffer, siz
11940 65 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69 76  eof(buffer), piv
11950 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72  _oid);.....if (r
11960 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
11970 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
11980 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d  .}.....curr_id =
11990 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b   &certs[outidx];
119a0 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09  ....outidx++;...
119b0 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69  ..curr_id->keysi
119c0 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72  ze = -1;....curr
119d0 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43  _id->id_type = C
119e0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
119f0 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  V;....curr_id->c
11a00 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d  ard.piv.key_id =
11a10 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d 65 6d   piv_key;....mem
11a20 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  cpy(curr_id->car
11a30 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70 69 76  d.piv.label, piv
11a40 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e 28 70  _label, strlen(p
11a50 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29 3b 0a  iv_label) + 1);.
11a60 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
11a70 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 72  tificate_len = r
11a80 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72 72  ead_ret;....curr
11a90 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11aa0 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69   = malloc(curr_i
11ab0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
11ac0 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65 72 5f  en);.....buffer_
11ad0 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66  len = sizeof(buf
11ae0 66 65 72 29 3b 0a 09 09 09 62 75 66 66 65 72 5f  fer);....buffer_
11af0 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  p = cackey_read_
11b00 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66 65  bertlv_tag(buffe
11b10 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20  r, &buffer_len, 
11b20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 2d 3e 63  0x70, curr_id->c
11b30 65 72 74 69 66 69 63 61 74 65 2c 20 26 63 75 72  ertificate, &cur
11b40 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
11b50 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28  e_len);.....if (
11b60 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c  buffer_p == NULL
11b70 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
11b80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
11b90 64 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ding certificate
11ba0 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20 72 65   from BER-TLV re
11bb0 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c 20 73  sponse failed, s
11bc0 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 69 22 2c  kipping key %i",
11bd0 20 69 64 78 29 3b 0a 0a 09 09 09 09 66 72 65 65   idx);......free
11be0 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  (curr_id->certif
11bf0 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 63 75 72  icate);......cur
11c00 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
11c10 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 6f  e = NULL;......o
11c20 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f  utidx--;......co
11c30 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
11c40 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 63 65  .if (curr_id->ce
11c50 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 20  rtificate_len > 
11c60 34 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 65 6d  4) {.....if (mem
11c70 63 6d 70 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  cmp(curr_id->cer
11c80 74 69 66 69 63 61 74 65 2c 20 22 5c 78 31 66 5c  tificate, "\x1f\
11c90 78 38 62 5c 78 30 38 5c 78 30 30 22 2c 20 34 29  x8b\x08\x00", 4)
11ca0 20 3d 3d 20 30 29 20 7b 0a 23 69 66 64 65 66 20   == 0) {.#ifdef 
11cb0 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 09 74  HAVE_LIBZ......t
11cc0 6d 70 62 75 66 6c 65 6e 20 3d 20 63 75 72 72 5f  mpbuflen = curr_
11cd0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
11ce0 6c 65 6e 20 2a 20 32 3b 0a 09 09 09 09 09 74 6d  len * 2;......tm
11cf0 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
11d00 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  pbuflen);.......
11d10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11d20 4e 54 42 55 46 28 22 41 74 74 65 6d 70 74 69 6e  NTBUF("Attemptin
11d30 67 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 3a  g to decompress:
11d40 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ", curr_id->cert
11d50 69 66 69 63 61 74 65 2c 20 63 75 72 72 5f 69 64  ificate, curr_id
11d60 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
11d70 6e 29 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73  n);.......gzip_s
11d80 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 4e  tream.zalloc = N
11d90 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73  ULL;......gzip_s
11da0 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d 20 4e 55  tream.zfree = NU
11db0 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74  LL;......gzip_st
11dc0 72 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55  ream.opaque = NU
11dd0 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73  LL;.......gzip_s
11de0 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d  tream.next_in  =
11df0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
11e00 69 63 61 74 65 3b 0a 09 09 09 09 09 67 7a 69 70  icate;......gzip
11e10 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e  _stream.avail_in
11e20 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74   = curr_id->cert
11e30 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09  ificate_len;....
11e40 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65  ..gzip_stream.ne
11e50 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 3b  xt_out = tmpbuf;
11e60 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61  ......gzip_strea
11e70 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74 6d  m.avail_out = tm
11e80 70 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 09 75  pbuflen;.......u
11e90 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
11ea0 69 6e 66 6c 61 74 65 49 6e 69 74 28 26 67 7a 69  inflateInit(&gzi
11eb0 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09  p_stream);......
11ec0 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72  if (uncompress_r
11ed0 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09  et == Z_OK) {...
11ee0 09 09 09 09 2f 2a 20 54 72 79 20 61 67 61 69 6e  ..../* Try again
11ef0 20 61 73 20 61 20 67 7a 69 70 20 62 75 66 66 65   as a gzip buffe
11f00 72 20 2a 2f 0a 09 09 09 09 09 09 75 6e 63 6f 6d  r */.......uncom
11f10 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c  press_ret = infl
11f20 61 74 65 45 6e 64 28 26 67 7a 69 70 5f 73 74 72  ateEnd(&gzip_str
11f30 65 61 6d 29 3b 0a 09 09 09 09 09 09 69 66 20 28  eam);.......if (
11f40 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
11f50 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09  = Z_OK) {.......
11f60 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c  .gzip_stream.zal
11f70 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  loc = NULL;.....
11f80 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a  ...gzip_stream.z
11f90 66 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  free = NULL;....
11fa0 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
11fb0 6f 70 61 71 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  opaque = NULL;..
11fc0 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  .......gzip_stre
11fd0 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d 20 63 75  am.next_in  = cu
11fe0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11ff0 74 65 3b 0a 09 09 09 09 09 09 09 67 7a 69 70 5f  te;........gzip_
12000 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20  stream.avail_in 
12010 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  = curr_id->certi
12020 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09 09  ficate_len;.....
12030 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e  ...gzip_stream.n
12040 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66  ext_out = tmpbuf
12050 3b 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74  ;........gzip_st
12060 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d  ream.avail_out =
12070 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09   tmpbuflen;.....
12080 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
12090 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 32  t = inflateInit2
120a0 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20 33  (&gzip_stream, 3
120b0 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  1);.......}.....
120c0 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f  .}......if (unco
120d0 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f  mpress_ret == Z_
120e0 4f 4b 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f  OK) {.......unco
120f0 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66  mpress_ret = inf
12100 6c 61 74 65 28 26 67 7a 69 70 5f 73 74 72 65 61  late(&gzip_strea
12110 6d 2c 20 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09  m, 0);......}...
12120 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73  ...if (uncompres
12130 73 5f 72 65 74 20 3d 3d 20 5a 5f 53 54 52 45 41  s_ret == Z_STREA
12140 4d 5f 45 4e 44 29 20 7b 0a 09 09 09 09 09 09 75  M_END) {.......u
12150 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
12160 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70  inflateEnd(&gzip
12170 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 7d  _stream);......}
12180 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6e   else {.......un
12190 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 5a  compress_ret = Z
121a0 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 09 09 09  _DATA_ERROR;....
121b0 09 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63  ..}......if (unc
121c0 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a  ompress_ret == Z
121d0 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 74 6d 70  _OK) {.......tmp
121e0 62 75 66 6c 65 6e 20 3d 20 67 7a 69 70 5f 73 74  buflen = gzip_st
121f0 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a  ream.total_out;.
12200 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
12210 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65  BUG_PRINTBUF("De
12220 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c  compressed to:",
12230 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
12240 65 6e 29 3b 0a 0a 09 09 09 09 09 09 66 72 65 65  en);........free
12250 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  (curr_id->certif
12260 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 09 09 63  icate);........c
12270 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
12280 61 74 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  ate = tmpbuf;...
12290 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
122a0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 74  tificate_len = t
122b0 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 09 7d  mpbuflen;......}
122c0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41   else {.......CA
122d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
122e0 46 28 22 44 65 63 6f 6d 70 72 65 73 73 69 6e 67  F("Decompressing
122f0 20 66 61 69 6c 65 64 21 20 75 6e 63 6f 6d 70 72   failed! uncompr
12300 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25  ess() returned %
12310 69 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  i", uncompress_r
12320 65 74 29 3b 0a 0a 09 09 09 09 09 09 66 72 65 65  et);........free
12330 28 74 6d 70 62 75 66 29 3b 0a 09 09 09 09 09 7d  (tmpbuf);......}
12340 0a 23 65 6c 73 65 0a 09 09 09 09 09 43 41 43 4b  .#else......CACK
12350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12360 22 45 72 72 6f 72 2e 20 20 57 65 20 67 6f 74 20  "Error.  We got 
12370 61 20 63 6f 6d 70 72 65 73 73 65 64 20 63 65 72  a compressed cer
12380 74 69 66 69 63 61 74 65 20 62 75 74 20 77 65 20  tificate but we 
12390 64 6f 20 6e 6f 74 20 68 61 76 65 20 7a 6c 69 62  do not have zlib
123a0 2e 20 20 48 6f 70 69 6e 67 20 66 6f 72 20 74 68  .  Hoping for th
123b0 65 20 62 65 73 74 2e 22 29 3b 0a 23 65 6e 64 69  e best.");.#endi
123c0 66 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d  f.....}....}...}
123d0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20  ..} else {.../* 
123e0 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70  Read all the app
123f0 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43  lets from the CC
12400 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63  C's TLV */...ccc
12410 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65  _tlv = cackey_re
12420 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09  ad_tlv(slot);...
12430 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52  ./* Look for CAR
12440 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65  DURLs that coore
12450 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70  spond to PKI app
12460 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63  lets */...for (c
12470 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c  cc_curr = ccc_tl
12480 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63  v; ccc_curr; ccc
12490 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72  _curr = ccc_curr
124a0 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41  ->_next) {....CA
124b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
124c0 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
124d0 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44   ... ", CACKEY_D
124e0 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
124f0 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74  _STR(ccc_curr->t
12500 61 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63  ag));.....if (cc
12510 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  c_curr->tag != G
12520 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
12530 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
12550 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
12560 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
12570 75 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a  ut CARDURLs)");.
12580 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
12590 09 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63  ..}.....if ((ccc
125a0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
125b0 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20  durl->apptype & 
125c0 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
125d0 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c  KI) != CACKEY_TL
125e0 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09  V_APP_PKI) {....
125f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12600 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
12610 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
12620 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20   care about PKI 
12630 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70  applets, this ap
12640 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25  plet supports: %
12650 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59  s/%02x)", CACKEY
12660 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
12670 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  YPE_TO_STR(ccc_c
12680 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
12690 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75  rl->apptype), (u
126a0 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63  nsigned int) ccc
126b0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
126c0 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a  durl->apptype);.
126d0 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
126e0 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
126f0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52  EBUG_PRINTBUF("R
12700 49 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e  ID:", ccc_curr->
12710 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
12720 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63  id, sizeof(ccc_c
12730 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
12740 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41  rl->rid));....CA
12750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12760 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30  F("AppID = %s/%0
12770 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  4lx", CACKEY_DEB
12780 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
12790 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76  _STR(ccc_curr->v
127a0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
127b0 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  pid), (unsigned 
127c0 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e  long) ccc_curr->
127d0 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
127e0 70 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59  ppid);....CACKEY
127f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
12800 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34  bjectID = %s/%04
12810 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
12820 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
12830 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
12840 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
12850 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  ectid), (unsigne
12860 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72  d long) ccc_curr
12870 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
12880 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09  >objectid);.....
12890 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c  memcpy(curr_aid,
128a0 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
128b0 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73  _cardurl->rid, s
128c0 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e  izeof(ccc_curr->
128d0 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
128e0 69 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69  id));....curr_ai
128f0 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
12900 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63  d) - 2] = (ccc_c
12910 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
12920 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20  rl->appid >> 8) 
12930 26 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f  & 0xff;....curr_
12940 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f  aid[sizeof(curr_
12950 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f  aid) - 1] = ccc_
12960 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
12970 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66  url->appid & 0xf
12980 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74  f;...../* Select
12990 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e   found applet ..
129a0 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72  . */....select_r
129b0 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
129c0 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
129d0 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
129e0 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09  (curr_aid));....
129f0 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
12a00 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
12a10 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
12a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
12a30 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20  ailed to select 
12a40 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67  applet, skipping
12a50 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
12a60 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
12a70 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
12a80 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64  }...../* ... and
12a90 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a   object (file) *
12aa0 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20  /....select_ret 
12ab0 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  = cackey_select_
12ac0 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63  file(slot, ccc_c
12ad0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
12ae0 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09  rl->objectid);..
12af0 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74  ..if (select_ret
12b00 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
12b10 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  S_OK) {.....CACK
12b20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12b30 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
12b40 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67  t file, skipping
12b50 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
12b60 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
12b70 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
12b80 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73  }...../* Process
12b90 20 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56   this file's TLV
12ba0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72   looking for cer
12bb0 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09  tificates */....
12bc0 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  app_tlv = cackey
12bd0 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
12be0 0a 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63  ......for (app_c
12bf0 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61  urr = app_tlv; a
12c00 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72  pp_curr; app_cur
12c10 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e  r = app_curr->_n
12c20 65 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ext) {.....CACKE
12c30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12c40 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20  Found tag: %s", 
12c50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
12c60 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70  C_TAG_TO_STR(app
12c70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09  _curr->tag));...
12c80 09 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e  ..if (app_curr->
12c90 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47  tag != GSCIS_TAG
12ca0 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
12cb0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12cc0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
12cd0 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20  skipping it (we 
12ce0 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
12cf0 43 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b  CERTIFICATEs)");
12d00 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  .......continue;
12d10 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72  .....}......curr
12d20 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74  _id = &certs[out
12d30 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78  idx];.....outidx
12d40 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64  ++;......curr_id
12d50 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b  ->id_type = CACK
12d60 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a  EY_ID_TYPE_CAC;.
12d70 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
12d80 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
12d90 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73  let, curr_aid, s
12da0 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63  izeof(curr_id->c
12db0 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
12dc0 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ;.....curr_id->c
12dd0 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63  ard.cac.file = c
12de0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12df0 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
12e00 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b  ;.....curr_id->k
12e10 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09  eysize = -1;....
12e20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12e30 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63  RINTF("Filling c
12e40 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
12e50 2e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74  .applet (%p) wit
12e60 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63  h %lu bytes:", c
12e70 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
12e80 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e  .applet, (unsign
12e90 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28  ed long) sizeof(
12ea0 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61  curr_id->card.ca
12eb0 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09  c.applet));.....
12ec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12ed0 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75  NTBUF("VAL:", cu
12ee0 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
12ef0 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63  applet, sizeof(c
12f00 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
12f10 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09  .applet));......
12f20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
12f30 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63  cate_len = app_c
12f40 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09  urr->length;....
12f50 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
12f60 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
12f70 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
12f80 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d  cate_len);.....m
12f90 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63  emcpy(curr_id->c
12fa0 65 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f  ertificate, app_
12fb0 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72  curr->value, cur
12fc0 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
12fd0 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20  e_len);......if 
12fe0 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e  (outidx >= *coun
12ff0 74 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65  t) {......if (ce
13000 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b  rts_resizable) {
13010 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d  .......*count *=
13020 20 32 3b 0a 09 09 09 09 09 09 69 66 20 28 2a 63   2;.......if (*c
13030 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
13040 09 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c  ....certs = real
13050 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f  loc(certs, sizeo
13060 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f  f(*certs) * (*co
13070 75 6e 74 29 29 3b 0a 09 09 09 09 09 09 7d 20 65  unt));.......} e
13080 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 63 65 72  lse {........cer
13090 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ts = NULL;......
130a0 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
130b0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
130c0 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ...}.....}....}.
130d0 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
130e0 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09  tlv(app_tlv);...
130f0 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20  ..if (outidx >= 
13100 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72  *count) {.....br
13110 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
13120 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
13130 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09  (ccc_tlv);..}...
13140 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
13150 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
13160 69 7a 61 62 6c 65 29 20 7b 0a 09 09 69 66 20 28  izable) {...if (
13170 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  *count != 0) {..
13180 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f  ..certs = reallo
13190 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28  c(certs, sizeof(
131a0 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e  *certs) * (*coun
131b0 74 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  t));...} else {.
131c0 09 09 09 66 72 65 65 28 63 65 72 74 73 29 3b 0a  ...free(certs);.
131d0 0a 09 09 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c  ....certs = NULL
131e0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  ;...}..}...slot-
131f0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20  >cached_certs = 
13200 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74  cackey_copy_cert
13210 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20 2a  s(NULL, certs, *
13220 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63  count);..slot->c
13230 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
13240 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a  t = *count;.../*
13250 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74   Terminate Smart
13260 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  Card Transaction
13270 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
13280 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
13290 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74  );...return(cert
132a0 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  s);.}../*. * SYN
132b0 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
132c0 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
132d0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
132e0 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
132f0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
13300 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
13310 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
13320 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69  size_t cackey_si
13330 67 6e 64 65 63 72 79 70 74 28 73 74 72 75 63 74  gndecrypt(struct
13340 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
13350 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ot, struct cacke
13360 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
13370 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  tity, unsigned c
13380 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74  har *buf, size_t
13390 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65   buflen, unsigne
133a0 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20  d char *outbuf, 
133b0 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e  size_t outbuflen
133c0 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20  , int padInput, 
133d0 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29  int unpadOutput)
133e0 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f   {..cackey_pcsc_
133f0 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65 2c  id_type id_type,
13400 20 63 68 65 63 6b 5f 69 64 5f 74 79 70 65 3b 0a   check_id_type;.
13410 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  .unsigned char d
13420 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13430 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61 75 74 68 5f  [10], *dyn_auth_
13440 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65  tmpbuf;..unsigne
13450 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20  d char *tmpbuf, 
13460 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62  *tmpbuf_s, *outb
13470 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70 3b  uf_s, *outbuf_p;
13480 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
13490 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70  bytes_to_send, p
134a0 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67  1, class;..unsig
134b0 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79  ned char blockty
134c0 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  pe;..cackey_ret 
134d0 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31  send_ret;..uint1
134e0 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73  6_t respcode;..s
134f0 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20  size_t retval = 
13500 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a  0, unpadoffset;.
13510 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65  .size_t tmpbufle
13520 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75  n, padlen, tmpou
13530 74 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 5f  tbuflen, outbuf_
13540 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74  len;..int free_t
13550 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20  mpbuf = 0;..int 
13560 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  le;...CACKEY_DEB
13570 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
13580 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
13590 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
135a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
135b0 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
135c0 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
135d0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
135e0 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
135f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13600 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
13610 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
13620 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
13630 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
13640 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
13650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13660 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
13670 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
13680 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
13690 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
136a0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
136b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
136c0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69  ror.  identity i
136d0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
136e0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
136f0 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
13700 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  _identity == NUL
13710 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
13720 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13730 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
13740 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e  sc_identity is N
13750 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
13760 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79  (-1);..}...id_ty
13770 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  pe = identity->p
13780 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69 64  csc_identity->id
13790 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64 5f 74  _type;..if (id_t
137a0 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44  ype == CACKEY_ID
137b0 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 29  _TYPE_CERT_ONLY)
137c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
137d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
137e0 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
137f0 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43 41 43  _identity is CAC
13800 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
13810 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63 61 6e  _ONLY, which can
13820 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  not be used for 
13830 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a  sign/decrypt");.
13840 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
13850 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74  }...switch (id_t
13860 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41  ype) {...case CA
13870 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
13880 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  :...case CACKEY_
13890 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09  ID_TYPE_CAC:....
138a0 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
138b0 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
138c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
138d0 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
138e0 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74  _identity is not
138f0 20 61 20 73 75 70 70 6f 72 74 65 64 20 76 61 6c   a supported val
13900 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30 78 25  ue. Type is: 0x%
13910 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c 78 2c  lx (PIV = 0x%lx,
13920 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22 2c 20   CAC = 0x%lx)", 
13930 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
13940 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69 67 6e  id_type, (unsign
13950 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f  ed long) CACKEY_
13960 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28 75 6e  ID_TYPE_PIV, (un
13970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43  signed long) CAC
13980 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 29  KEY_ID_TYPE_CAC)
13990 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
139a0 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
139b0 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79  ine identity Key
139c0 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64   size */..if (id
139d0 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
139e0 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c  ntity->keysize <
139f0 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79   0) {...identity
13a00 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
13a10 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f  >keysize = x509_
13a20 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74  to_keysize(ident
13a30 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
13a40 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
13a50 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
13a60 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
13a70 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  icate_len);..}..
13a80 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20  ./* Pad message 
13a90 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09  to key size */..
13aa0 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a  if (padInput) {.
13ab0 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
13ac0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
13ad0 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09  eysize > 0) {...
13ae0 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69  .if (buflen != i
13af0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13b00 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29  entity->keysize)
13b10 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65   {.....if (bufle
13b20 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  n > (identity->p
13b30 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
13b40 79 73 69 7a 65 20 2d 20 33 29 29 20 7b 0a 09 09  ysize - 3)) {...
13b50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13b60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13b70 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  Message is too l
13b80 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63  arge to sign/dec
13b90 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65  rypt");.......re
13ba0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a  turn(-1);.....}.
13bb0 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
13bc0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
13bd0 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
13be0 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  e;.....tmpbuf = 
13bf0 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
13c00 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  );.....free_tmpb
13c10 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64  uf = 1;......pad
13c20 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20  len = tmpbuflen 
13c30 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09  - buflen - 3;...
13c40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13c50 50 52 49 4e 54 46 28 22 4e 65 65 64 20 74 6f 20  PRINTF("Need to 
13c60 70 61 64 20 74 68 65 20 62 75 66 66 65 72 20 77  pad the buffer w
13c70 69 74 68 20 25 6c 6c 75 20 62 79 74 65 73 20 28  ith %llu bytes (
13c80 74 6d 70 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75  tmpbuflen = %llu
13c90 2c 20 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75 29  , buflen = %llu)
13ca0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13cb0 67 20 6c 6f 6e 67 29 20 70 61 64 6c 65 6e 2c 20  g long) padlen, 
13cc0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
13cd0 6f 6e 67 29 20 74 6d 70 62 75 66 6c 65 6e 2c 20  ong) tmpbuflen, 
13ce0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
13cf0 6f 6e 67 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  ong) buflen);...
13d00 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31  .../* RSA PKCS#1
13d10 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35   EMSA-PKCS1-v1_5
13d20 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09   Padding */.....
13d30 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30  tmpbuf[0] = 0x00
13d40 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20  ;.....tmpbuf[1] 
13d50 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73  = 0x01;.....mems
13d60 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30  et(&tmpbuf[2], 0
13d70 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09  xFF, padlen);...
13d80 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  ..tmpbuf[padlen 
13d90 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09  + 2]= 0x00;.....
13da0 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70  memcpy(&tmpbuf[p
13db0 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c  adlen + 3], buf,
13dc0 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43   buflen);......C
13dd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13de0 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22  TBUF("Unpadded:"
13df0 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a  , buf, buflen);.
13e00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13e10 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65  _PRINTBUF("Padde
13e20 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  d:", tmpbuf, tmp
13e30 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c  buflen);....} el
13e40 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20  se {.....tmpbuf 
13e50 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75  = buf;.....tmpbu
13e60 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
13e70 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
13e80 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d   0;.....padlen =
13e90 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73   0;....}...} els
13ea0 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
13eb0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
13ec0 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
13ed0 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67  key size, hoping
13ee0 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73 20   the message is 
13ef0 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21  properly padded!
13f00 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d  ");.....tmpbuf =
13f10 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c   buf;....tmpbufl
13f20 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09  en = buflen;....
13f30 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
13f40 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ....padlen = 0;.
13f50 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
13f60 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
13f70 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
13f80 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75  en;...free_tmpbu
13f90 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20  f = 0;...padlen 
13fa0 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  = 0;..}.../* Beg
13fb0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  in transaction *
13fc0 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
13fd0 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
13fe0 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63  );.../* Select c
13ff0 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f  orrect applet */
14000 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
14010 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  e) {...case CACK
14020 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
14030 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14040 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
14050 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61  g applet found a
14060 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74  t %p ...", ident
14070 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
14080 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  ty->card.cac.app
14090 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  let);....cackey_
140a0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
140b0 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
140c0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
140d0 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
140e0 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70  zeof(identity->p
140f0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
14100 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
14110 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63  ...../* Select c
14120 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09  orrect file */..
14130 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  ..cackey_select_
14140 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74  file(slot, ident
14150 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
14160 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c  ty->card.cac.fil
14170 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  e);....break;...
14180 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
14190 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f  YPE_PIV:....dyn_
141a0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d  auth_template[0]
141b0 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f   = 0x7C;....dyn_
141c0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d  auth_template[1]
141d0 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
141e0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d  auth_template[2]
141f0 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b   = ((tmpbuflen +
14200 20 36 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e   6) & 0xff00) >>
14210 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f   8;....dyn_auth_
14220 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74  template[3] = (t
14230 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20  mpbuflen + 6) & 
14240 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61  0x00ff;....dyn_a
14250 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20  uth_template[4] 
14260 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61  = 0x82;....dyn_a
14270 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20  uth_template[5] 
14280 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61  = 0x00;....dyn_a
14290 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20  uth_template[6] 
142a0 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61  = 0x81;....dyn_a
142b0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20  uth_template[7] 
142c0 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61  = 0x82;....dyn_a
142d0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20  uth_template[8] 
142e0 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30  = (tmpbuflen & 0
142f0 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09  xff00) >> 8;....
14300 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
14310 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e  e[9] = tmpbuflen
14320 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 64   & 0x00ff;.....d
14330 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 3d  yn_auth_tmpbuf =
14340 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
14350 6e 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61  n + sizeof(dyn_a
14360 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a  uth_template));.
14370 09 09 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75  ...memcpy(dyn_au
14380 74 68 5f 74 6d 70 62 75 66 2c 20 64 79 6e 5f 61  th_tmpbuf, dyn_a
14390 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69  uth_template, si
143a0 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65  zeof(dyn_auth_te
143b0 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65 6d  mplate));....mem
143c0 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d 70  cpy(dyn_auth_tmp
143d0 62 75 66 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e  buf + sizeof(dyn
143e0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c  _auth_template),
143f0 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
14400 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65  en);.....if (fre
14410 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
14420 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09  free(tmpbuf);...
14430 09 7d 0a 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e  .}.....tmpbuflen
14440 20 2b 3d 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61   += sizeof(dyn_a
14450 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 3b 0a 09  uth_template);..
14460 09 09 74 6d 70 62 75 66 20 3d 20 64 79 6e 5f 61  ..tmpbuf = dyn_a
14470 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 09 09 66  uth_tmpbuf;....f
14480 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a  ree_tmpbuf = 1;.
14490 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
144a0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
144b0 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62  _CERT_ONLY:....b
144c0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75  reak;..}...tmpbu
144d0 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f  f_s = tmpbuf;..o
144e0 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66  utbuf_s = outbuf
144f0 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66  ;..while (tmpbuf
14500 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74 62  len) {...tmpoutb
14510 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65  uflen = outbufle
14520 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62 75 66  n;....if (tmpbuf
14530 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
14540 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79 74 65  U_MTU) {....byte
14550 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43 4b  s_to_send = CACK
14560 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d  EY_APDU_MTU;...}
14570 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73   else {....bytes
14580 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75  _to_send = tmpbu
14590 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e  flen;...}....sen
145a0 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59 5f 50  d_ret = CACKEY_P
145b0 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a 09  CSC_E_GENERIC;..
145c0 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65  .switch (id_type
145d0 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ) {....case CACK
145e0 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
145f0 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  ....if (tmpbufle
14600 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  n > CACKEY_APDU_
14610 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31 20 3d  MTU) {......p1 =
14620 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x80;......le =
14630 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73   0x00;.....} els
14640 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78  e {......p1 = 0x
14650 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78  00;......le = 0x
14660 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73  00;.....}......s
14670 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
14680 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
14690 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f   GSCIS_CLASS_GLO
146a0 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53  BAL_PLATFORM, GS
146b0 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45  CIS_INSTR_SIGNDE
146c0 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c  CRYPT, p1, 0x00,
146d0 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
146e0 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73  tmpbuf, le, &res
146f0 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26  pcode, outbuf, &
14700 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09  tmpoutbuflen);..
14710 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
14720 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
14730 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28 74 6d  _PIV:.....if (tm
14740 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59  pbuflen > CACKEY
14750 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09  _APDU_MTU) {....
14760 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a  ..class = 0x10;.
14770 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  .....le = 0x00;.
14780 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
14790 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49 53 5f  ..class = GSCIS_
147a0 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a 09  CLASS_ISO7816;..
147b0 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09 09  ....le = 256;...
147c0 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65  ..}......send_re
147d0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
147e0 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73 73  apdu(slot, class
147f0 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  , NISTSP800_73_3
14800 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20  _INSTR_GENAUTH, 
14810 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41  NISTSP800_78_3_A
14820 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65  LGO_RSA2048, ide
14830 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
14840 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b  tity->card.piv.k
14850 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f 5f  ey_id, bytes_to_
14860 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65  send, tmpbuf, le
14870 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74  , &respcode, out
14880 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c  buf, &tmpoutbufl
14890 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  en);.....break;.
148a0 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
148b0 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
148c0 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
148d0 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
148e0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
148f0 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 66  S_OK) {....if (f
14900 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
14910 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20  ..if (tmpbuf_s) 
14920 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70 62  {......free(tmpb
14930 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09  uf_s);.....}....
14940 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61  }...../* End tra
14950 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  nsaction */....c
14960 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
14970 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
14980 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
14990 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
149a0 45 54 52 59 29 20 7b 0a 09 09 09 09 43 41 43 4b  ETRY) {.....CACK
149b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
149c0 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61  "ADPU Sending Fa
149d0 69 6c 65 64 20 2d 2d 20 72 65 74 72 79 69 6e 67  iled -- retrying
149e0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
149f0 28 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72  (cackey_signdecr
14a00 79 70 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  ypt(slot, identi
14a10 74 79 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 2c  ty, buf, buflen,
14a20 20 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 6c   outbuf, outbufl
14a30 65 6e 2c 20 70 61 64 49 6e 70 75 74 2c 20 75 6e  en, padInput, un
14a40 70 61 64 4f 75 74 70 75 74 29 29 3b 0a 09 09 09  padOutput));....
14a50 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  }.....CACKEY_DEB
14a60 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
14a70 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d  Sending Failed -
14a80 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  - returning in e
14a90 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20  rror.");.....if 
14aa0 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
14ab0 39 38 32 20 7c 7c 20 72 65 73 70 63 6f 64 65 20  982 || respcode 
14ac0 3d 3d 20 30 78 36 65 30 30 20 7c 7c 20 72 65 73  == 0x6e00 || res
14ad0 70 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29  pcode == 0x6d00)
14ae0 20 7b 0a 09 09 09 09 69 66 20 28 72 65 73 70 63   {.....if (respc
14af0 6f 64 65 20 3d 3d 20 30 78 36 65 30 30 29 20 7b  ode == 0x6e00) {
14b00 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14b10 55 47 5f 50 52 49 4e 54 46 28 22 47 6f 74 20 5c  UG_PRINTF("Got \
14b20 22 57 52 4f 4e 47 20 43 4c 41 53 53 5c 22 2c 20  "WRONG CLASS\", 
14b30 74 68 69 73 20 6d 65 61 6e 73 20 77 65 20 61 72  this means we ar
14b40 65 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65  e talking to the
14b50 20 77 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28 6c   wrong object (l
14b60 69 6b 65 6c 79 20 62 65 63 61 75 73 65 20 74 68  ikely because th
14b70 65 20 63 61 72 64 20 77 65 6e 74 20 61 77 61 79  e card went away
14b80 29 20 2d 2d 20 72 65 73 65 74 74 69 6e 67 22 29  ) -- resetting")
14b90 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20  ;.....} else if 
14ba0 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
14bb0 64 30 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  d00) {......CACK
14bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14bd0 22 47 6f 74 20 5c 22 49 4e 56 41 4c 49 44 20 49  "Got \"INVALID I
14be0 4e 53 54 52 55 43 54 49 4f 4e 5c 22 2c 20 74 68  NSTRUCTION\", th
14bf0 69 73 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  is means we are 
14c00 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77  talking to the w
14c10 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b  rong object (lik
14c20 65 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  ely because the 
14c30 63 61 72 64 20 77 65 6e 74 20 61 77 61 79 29 20  card went away) 
14c40 2d 2d 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a  -- resetting");.
14c50 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
14c60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14c70 52 49 4e 54 46 28 22 53 65 63 75 72 69 74 79 20  RINTF("Security 
14c80 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73  status not satis
14c90 69 66 69 65 64 20 28 72 65 73 70 63 6f 64 65 20  ified (respcode 
14ca0 3d 20 30 78 25 30 34 78 29 2e 20 20 52 65 74 75  = 0x%04x).  Retu
14cb0 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22  rning NEEDLOGIN"
14cc0 2c 20 28 69 6e 74 29 20 72 65 73 70 63 6f 64 65  , (int) respcode
14cd0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61  );.....}......ca
14ce0 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
14cf0 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  eset(slot);.....
14d00 09 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61  .cackey_detect_a
14d10 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61  nd_select_root_a
14d20 70 70 6c 65 74 28 73 6c 6f 74 2c 20 43 41 43 4b  pplet(slot, CACK
14d30 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f  EY_ID_TYPE_UNKNO
14d40 57 4e 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e  WN);......slot->
14d50 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
14d60 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
14d70 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  ;......return(CA
14d80 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44  CKEY_PCSC_E_NEED
14d90 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09  LOGIN);....}....
14da0 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
14db0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
14dc0 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
14dd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14de0 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73  RINTF("Token abs
14df0 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
14e00 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a  TOKENABSENT");..
14e10 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
14e20 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
14e30 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  ;......return(CA
14e40 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
14e50 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a  NABSENT);....}..
14e60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14e70 50 52 49 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e  PRINTF("Somethin
14e80 67 20 77 65 6e 74 20 77 72 6f 6e 67 20 64 75 72  g went wrong dur
14e90 69 6e 67 20 73 69 67 6e 69 6e 67 2c 20 72 65 73  ing signing, res
14ea0 65 74 74 69 6e 67 20 74 68 65 20 73 6c 6f 74 20  etting the slot 
14eb0 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74  and hoping for t
14ec0 68 65 20 62 65 73 74 2e 22 29 3b 0a 0a 09 09 09  he best.");.....
14ed0 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
14ee0 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63  onnect();....cac
14ef0 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
14f00 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
14f10 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
14f20 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d  ERIC);...}....tm
14f30 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f  pbuf += bytes_to
14f40 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c  _send;...tmpbufl
14f50 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73  en -= bytes_to_s
14f60 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b  end;....outbuf +
14f70 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a  = tmpoutbuflen;.
14f80 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74  ..outbuflen -= t
14f90 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72  mpoutbuflen;...r
14fa0 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62  etval += tmpoutb
14fb0 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28  uflen;..}...if (
14fc0 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09  free_tmpbuf) {..
14fd0 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b  .if (tmpbuf_s) {
14fe0 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f  ....free(tmpbuf_
14ff0 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74  s);...}..}...out
15000 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a  buf = outbuf_s;.
15010 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63  ../* End transac
15020 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
15030 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
15040 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43  slot);..#ifdef C
15050 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
15060 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
15070 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75  SIZE_MAX..if (ou
15080 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58  tbuflen > _POSIX
15090 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
150a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
150b0 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65  NTF("Outbuflen e
150c0 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
150d0 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
150e0 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
150f0 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65   = %li, outbufle
15100 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  n = %lu)", (long
15110 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
15120 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
15130 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  ng) outbuflen);.
15140 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
15150 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
15160 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72  f.../* We must r
15170 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 74  emove the "7C" t
15180 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65  ag to get to the
15190 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73   signature */..s
151a0 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20  witch (id_type) 
151b0 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  {...case CACKEY_
151c0 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
151d0 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74  outbuf_len = ret
151e0 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70  val;....outbuf_p
151f0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
15200 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66  ertlv_tag(outbuf
15210 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30  , &outbuf_len, 0
15220 78 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74  x7C, NULL,  &out
15230 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20  buf_len);....if 
15240 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c  (outbuf_p == NUL
15250 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
15260 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15270 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20  sponse from PIV 
15280 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 54  for GENERATE AUT
15290 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20  HENTICATION was 
152a0 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c 20  not a 0x7C tag, 
152b0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
152c0 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74  lure");......ret
152d0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09  urn(-1);....}...
152e0 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75  ..retval = outbu
152f0 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75  f_len;.....outbu
15300 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a  f_len = retval;.
15310 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61  ...outbuf_p = ca
15320 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76  ckey_read_bertlv
15330 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75  _tag(outbuf, &ou
15340 74 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20  tbuf_len, 0x82, 
15350 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c  NULL,  &outbuf_l
15360 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62  en);....if (outb
15370 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  uf_p == NULL) {.
15380 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15390 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
153a0 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47  e from PIV for G
153b0 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49  ENERATE AUTHENTI
153c0 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61  CATION was not a
153d0 20 30 78 38 32 20 77 69 74 68 69 6e 20 61 20 30   0x82 within a 0
153e0 78 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69  x7C tag, returni
153f0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
15400 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
15410 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61  ;....}.....retva
15420 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a  l = outbuf_len;.
15430 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
15440 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
15450 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 43  _CAC:...case CAC
15460 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
15470 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b  _ONLY:....break;
15480 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72  ..}.../* Unpad r
15490 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70  eply */..if (unp
154a0 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66  adOutput) {...if
154b0 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a   (retval < 3) {.
154c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
154d0 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73  PRINTF("Reply is
154e0 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61   too small, we a
154f0 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75  re not able to u
15500 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20  npad -- passing 
15510 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
15520 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
15530 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15540 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15550 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
15560 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
15570 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
15580 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
15590 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
155a0 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21  .if (outbuf[0] !
155b0 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43  = 0x00) {....CAC
155c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
155d0 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70  ("Unrecognized p
155e0 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d  adding scheme --
155f0 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e   passing back an
15600 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
15610 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41   best!");.....CA
15620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15630 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
15640 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
15650 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
15660 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
15670 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
15680 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74  );...}....blockt
15690 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b  ype = outbuf[1];
156a0 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  ...unpadoffset =
156b0 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62   0;....switch (b
156c0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63  locktype) {....c
156d0 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a  ase 0x00:...../*
156e0 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20   Padding Scheme 
156f0 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  1, the first non
15700 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68  -zero byte is th
15710 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20  e start of data 
15720 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
15730 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
15740 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
15750 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
15760 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
15770 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
15780 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   != 0x00) {.....
15790 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
157a0 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
157b0 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09  ....case 0x01:..
157c0 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
157d0 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65  heme 2, pad byte
157e0 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f  s are 0xFF follo
157f0 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09  wed by 0x00 */..
15800 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
15810 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
15820 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
15830 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
15840 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
15850 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20  unpadoffset] != 
15860 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66  0xFF) {.......if
15870 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
15880 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b  fset] == 0x00) {
15890 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66  ........unpadoff
158a0 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62  set++;.........b
158b0 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c  reak;.......} el
158c0 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b  se {........CACK
158d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
158e0 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
158f0 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
15900 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
15910 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
15920 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30  een 0x00 found 0
15930 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
15940 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
15950 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
15960 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
15970 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20  .......}......} 
15980 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43  else {.......CAC
15990 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
159a0 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
159b0 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
159c0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
159d0 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
159e0 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20  been 0xFF found 
159f0 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
15a00 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
15a10 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
15a20 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
15a30 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
15a40 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
15a50 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61   0x02:...../* Pa
15a60 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20  dding Scheme 3, 
15a70 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f  pad bytes are no
15a80 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72  n-zero first zer
15a90 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20  o byte found is 
15aa0 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79  the seperator by
15ab0 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  te */.....for (u
15ac0 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
15ad0 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
15ae0 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
15af0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
15b00 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
15b10 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09  et] == 0x00) {..
15b20 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
15b30 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
15b40 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
15b50 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
15b60 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74  .if (unpadoffset
15b70 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09   > retval) {....
15b80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15b90 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61  NTF("Offset grea
15ba0 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73  ter than reply s
15bb0 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20  ize, aborting.  
15bc0 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25  (unpadoffset = %
15bd0 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75  lu, retval = %lu
15be0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
15bf0 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  ng) unpadoffset,
15c00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15c10 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65   retval);.....re
15c20 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
15c30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15c40 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22  INTBUF("Padded:"
15c50 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c  , outbuf, retval
15c60 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20  );....retval -= 
15c70 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d  unpadoffset;...m
15c80 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f  emmove(outbuf, o
15c90 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66  utbuf + unpadoff
15ca0 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  set, retval);...
15cb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15cc0 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64  INTBUF("Unpadded
15cd0 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
15ce0 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  al);..}....CACKE
15cf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15d00 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
15d10 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
15d20 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
15d30 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  ng) retval);...r
15d40 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
15d50 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
15d60 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15d70 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
15d80 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
15d90 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
15da0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
15db0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15dc0 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
15dd0 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65  _ret cackey_toke
15de0 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63 74  n_present(struct
15df0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
15e00 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65  ot) {..cackey_re
15e10 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
15e20 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64 65  et;..DWORD reade
15e30 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74 65  r_len = 0, state
15e40 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d   = 0, protocol =
15e50 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59   0, atr_len;..BY
15e60 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53  TE atr[MAX_ATR_S
15e70 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74  IZE];..LONG stat
15e80 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65  us_ret, scard_re
15e90 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
15ea0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15eb0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
15ec0 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c   (slot->internal
15ed0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15ee0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
15ef0 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65  ning token prese
15f00 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b  nt (internal tok
15f10 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  en)");....return
15f20 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54  (CACKEY_PCSC_S_T
15f30 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d  OKENPRESENT);..}
15f40 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
15f50 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
15f60 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
15f70 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
15f80 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
15f90 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
15fa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15fb0 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
15fc0 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
15fd0 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
15fe0 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74  absent");....ret
15ff0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16000 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
16010 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
16020 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e  G_PRINTF("Callin
16030 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20  g SCardStatus() 
16040 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 61 72  to determine car
16050 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09 61 74  d status");...at
16060 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61  r_len = sizeof(a
16070 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74  tr);..status_ret
16080 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73   = SCardStatus(s
16090 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
160a0 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65  NULL, &reader_le
160b0 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74  n, &state, &prot
160c0 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f  ocol, atr, &atr_
160d0 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61 74  len);...if (stat
160e0 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  us_ret == SCARD_
160f0 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  E_INVALID_HANDLE
16100 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16110 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
16120 53 74 61 74 75 73 28 29 20 72 65 74 75 72 6e 65  Status() returne
16130 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  d SCARD_E_INVALI
16140 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e  D_HANDLE, markin
16150 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
16160 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 74   connected and t
16170 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09  rying again");..
16180 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
16190 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
161a0 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
161b0 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
161c0 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
161d0 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
161e0 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
161f0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
16200 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16210 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
16220 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
16230 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
16240 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72   absent");.....r
16250 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
16260 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
16270 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
16280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
16290 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74 75  lling SCardStatu
162a0 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09  s() again");....
162b0 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  atr_len = sizeof
162c0 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73 5f  (atr);...status_
162d0 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75  ret = SCardStatu
162e0 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  s(slot->pcsc_car
162f0 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72  d, NULL, &reader
16300 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70  _len, &state, &p
16310 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61  rotocol, atr, &a
16320 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66  tr_len);..}...if
16330 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20   (status_ret != 
16340 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
16350 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b   {...cackey_mark
16360 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
16370 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75 73  );....if (status
16380 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f  _ret == SCARD_W_
16390 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09  RESET_CARD) {...
163a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
163b0 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75  INTF("Reset requ
163c0 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c  ired, please hol
163d0 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  d...");.....scar
163e0 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  d_reconn_ret = c
163f0 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
16400 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44  card(slot, SCARD
16410 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
16420 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
16430 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
16440 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  reconn_ret == SC
16450 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
16460 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62  ...../* Re-estab
16470 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e  lish transaction
16480 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73  , if it was pres
16490 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ent */.....if (s
164a0 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
164b0 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
164c0 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
164d0 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09  tion_depth--;...
164e0 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
164f0 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
16500 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b  k = 1;......cack
16510 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
16520 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09  tion(slot);.....
16530 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
16540 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
16550 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  t successful, re
16560 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 09  querying");.....
16570 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
16580 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
16590 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
165a0 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
165b0 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
165c0 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
165d0 09 09 09 09 69 66 20 28 73 74 61 74 75 73 5f 72  ....if (status_r
165e0 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
165f0 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41  CCESS) {......CA
16600 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16610 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20  F("Still unable 
16620 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
16630 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
16640 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
16650 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
16660 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
16670 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
16680 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
16690 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  ));.......return
166a0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
166b0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
166c0 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
166d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
166e0 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
166f0 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63  o reconnect to c
16700 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ard, returning t
16710 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
16720 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d  ardReconnect() =
16730 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
16740 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
16750 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 65  _TO_STR(scard_re
16760 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09  conn_ret));.....
16770 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
16780 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
16790 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  T);....}...} els
167a0 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
167b0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
167c0 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64  le to query card
167d0 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69   status, returni
167e0 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e  ng token absent.
167f0 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20    SCardStatus() 
16800 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  = %s", CACKEY_DE
16810 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
16820 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f  R_TO_STR(status_
16830 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 72  ret));.....retur
16840 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
16850 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
16860 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 74  }..}...if ((stat
16870 65 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e 54  e & SCARD_ABSENT
16880 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 4e  ) == SCARD_ABSEN
16890 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
168a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64  BUG_PRINTF("Card
168b0 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74 75   is absent, retu
168c0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
168d0 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  nt");....return(
168e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
168f0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a  KENABSENT);..}..
16900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16910 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16920 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 29  token present.")
16930 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
16940 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
16950 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ESENT);.}../*. *
16960 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
16970 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
16980 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
16990 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
169a0 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
169b0 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
169c0 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
169d0 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
169e0 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28 73 74 72  ckey_set_pin(str
169f0 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
16a00 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
16a10 63 68 61 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20 75  char *old_pin, u
16a20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c 64  nsigned long old
16a30 5f 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e  _pin_len, unsign
16a40 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e  ed char *pin, un
16a50 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f  signed long pin_
16a60 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 63  len) {..struct c
16a70 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
16a80 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
16a90 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
16aa0 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20  char cac_pin[8] 
16ab0 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30  = {0xFF, 0xFF, 0
16ac0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
16ad0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
16ae0 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  F};..unsigned ch
16af0 61 72 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b 38  ar old_cac_pin[8
16b00 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c  ] = {0xFF, 0xFF,
16b10 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
16b20 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
16b30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  xFF};..unsigned 
16b40 63 68 61 72 20 70 69 6e 5f 75 70 64 61 74 65 5b  char pin_update[
16b50 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 20  sizeof(cac_pin) 
16b60 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63  + sizeof(old_cac
16b70 5f 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e 65  _pin)];..unsigne
16b80 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
16b90 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
16ba0 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20  onse_code;..int 
16bb0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
16bc0 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
16bd0 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e  .int key_referen
16be0 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20  ce = 0x00;.../* 
16bf0 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20  Apparently, CAC 
16c00 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c  PINs are *EXACTL
16c10 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20  Y* 8 bytes long 
16c20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46  -- pad with 0xFF
16c30 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f   if too short */
16c40 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d  ..if (pin_len >=
16c50 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63   8) {...memcpy(c
16c60 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b  ac_pin, pin, 8);
16c70 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
16c80 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
16c90 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  , pin_len);..}..
16ca0 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e  .if (old_pin_len
16cb0 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70   >= 8) {...memcp
16cc0 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f  y(old_cac_pin, o
16cd0 6c 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65  ld_pin, 8);..} e
16ce0 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f  lse {...memcpy(o
16cf0 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f  ld_cac_pin, old_
16d00 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e  pin, old_pin_len
16d10 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 61  );..}.../* Conca
16d20 74 65 6e 61 74 65 20 62 6f 74 68 20 50 49 4e 73  tenate both PINs
16d30 20 74 6f 67 65 74 68 65 72 20 74 6f 20 73 65 6e   together to sen
16d40 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
16d50 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d 65  struction */..me
16d60 6d 63 70 79 28 70 69 6e 5f 75 70 64 61 74 65 2c  mcpy(pin_update,
16d70 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 73 69   old_cac_pin, si
16d80 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e  zeof(old_cac_pin
16d90 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f  ));..memcpy(pin_
16da0 75 70 64 61 74 65 20 2b 20 73 69 7a 65 6f 66 28  update + sizeof(
16db0 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 2c 20 63 61  old_cac_pin), ca
16dc0 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28 63 61  c_pin, sizeof(ca
16dd0 63 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52 65  c_pin));.../* Re
16de0 6a 65 63 74 20 50 49 4e 73 20 77 68 69 63 68 20  ject PINs which 
16df0 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f  are too short */
16e00 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20  ..if (pin_len < 
16e10 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  5) {...CACKEY_DE
16e20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65  BUG_PRINTF("Reje
16e30 63 74 69 6e 67 20 4e 65 77 20 50 49 4e 20 77 68  cting New PIN wh
16e40 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74  ich is too short
16e50 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20   (length = %lu, 
16e60 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 20  must be atleast 
16e70 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a  5)", pin_len);..
16e80 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
16e90 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
16ea0 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e  .}...if (old_pin
16eb0 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41  _len < 5) {...CA
16ec0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16ed0 46 28 22 52 65 6a 65 63 74 69 6e 67 20 4f 6c 64  F("Rejecting Old
16ee0 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f   PIN which is to
16ef0 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20  o short (length 
16f00 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61  = %lu, must be a
16f10 74 6c 65 61 73 74 20 35 29 22 2c 20 6f 6c 64 5f  tleast 5)", old_
16f20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  pin_len);....ret
16f30 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16f40 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09  E_BADPIN);..}...
16f50 2f 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69 63  /* PIV authentic
16f60 61 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65  ation uses a "ke
16f70 79 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20  y_reference" of 
16f80 30 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64  0x80 */..pcsc_id
16f90 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
16fa0 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f  y_read_certs(slo
16fb0 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65  t, NULL, &num_ce
16fc0 72 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63  rts);..if (num_c
16fd0 65 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 63  erts > 0 && pcsc
16fe0 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  _identities != N
16ff0 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20  ULL) {...switch 
17000 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
17010 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09  [0].id_type) {..
17020 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
17030 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43  _TYPE_PIV:.....C
17040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17050 54 46 28 22 57 65 20 68 61 76 65 20 50 49 56 20  TF("We have PIV 
17060 63 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c  card, so we will
17070 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 68   attempt to auth
17080 65 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20 74  enticate using t
17090 68 65 20 50 49 56 20 41 70 70 6c 69 63 61 74 69  he PIV Applicati
170a0 6f 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63 65  on key reference
170b0 22 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66  ");......key_ref
170c0 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09  erence = 0x80;..
170d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66  ...break;....def
170e0 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b  ault:.....break;
170f0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
17100 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
17110 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
17120 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  erts, 1);..}.../
17130 2a 20 49 73 73 75 65 20 61 20 53 65 74 20 50 49  * Issue a Set PI
17140 4e 20 28 43 48 41 4e 47 45 20 52 45 46 45 52 45  N (CHANGE REFERE
17150 4e 43 45 29 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  NCE) */..send_re
17160 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
17170 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
17180 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
17190 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e  GSCIS_INSTR_CHAN
171a0 47 45 5f 52 45 46 45 52 45 4e 43 45 2c 20 30 78  GE_REFERENCE, 0x
171b0 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63  00, key_referenc
171c0 65 2c 20 73 69 7a 65 6f 66 28 70 69 6e 5f 75 70  e, sizeof(pin_up
171d0 64 61 74 65 29 2c 20 70 69 6e 5f 75 70 64 61 74  date), pin_updat
171e0 65 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e  e, 0x00, &respon
171f0 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e  se_code, NULL, N
17200 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  ULL);...if (send
17210 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
17220 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
17230 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65   ((response_code
17240 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78   & 0x63C0) == 0x
17250 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73  63C0) {....tries
17260 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65  _remaining = (re
17270 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
17280 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  F);.....CACKEY_D
17290 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
172a0 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
172b0 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72  iled, %i tries r
172c0 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73  emaining", tries
172d0 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09  _remaining);....
172e0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
172f0 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
17300 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e  .}....if (respon
17310 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  se_code == 0x698
17320 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  3) {....CACKEY_D
17330 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
17340 62 6c 65 20 74 6f 20 73 65 74 20 50 49 4e 2c 20  ble to set PIN, 
17350 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64  device is locked
17360 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 74 68 65   or changing the
17370 20 50 49 4e 20 69 73 20 64 69 73 61 62 6c 65 64   PIN is disabled
17380 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
17390 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
173a0 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74  KED);...}....ret
173b0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
173c0 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
173d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
173e0 49 4e 54 46 28 22 50 49 4e 20 43 68 61 6e 67 65  INTF("PIN Change
173f0 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09   succeeded");...
17400 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
17410 53 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 44  SC_S_OK);.../* D
17420 69 73 61 62 6c 65 20 61 20 77 61 72 6e 69 6e 67  isable a warning
17430 2c 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 20  , since this is 
17440 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 64 65 62  only used in deb
17450 75 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 72 69 65  ug mode */..trie
17460 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 74 72  s_remaining = tr
17470 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 7d  ies_remaining;.}
17480 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
17490 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
174a0 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
174b0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
174c0 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
174d0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
174e0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
174f0 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
17500 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69  _ret cackey_logi
17510 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
17520 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
17530 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20  gned char *pin, 
17540 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69  unsigned long pi
17550 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65  n_len, int *trie
17560 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 69  s_remaining_p, i
17570 6e 74 20 72 65 74 72 69 65 73 29 20 7b 0a 09 73  nt retries) {..s
17580 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
17590 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
175a0 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
175b0 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f  signed char cac_
175c0 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20  pin[8] = {0xFF, 
175d0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
175e0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
175f0 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69  FF, 0xFF};..unsi
17600 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
17610 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  rts;..uint16_t r
17620 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69  esponse_code;..i
17630 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  nt tries_remaini
17640 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  ng;..int send_re
17650 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65  t;..int key_refe
17660 72 65 6e 63 65 20 3d 20 30 78 30 30 2c 20 68 61  rence = 0x00, ha
17670 76 65 5f 70 69 76 20 3d 20 30 3b 0a 09 63 61 63  ve_piv = 0;..cac
17680 6b 65 79 5f 72 65 74 20 63 6f 6e 6e 65 63 74 5f  key_ret connect_
17690 72 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b 0a  ret, token_ret;.
176a0 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68  ../* Indicate th
176b0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  at we do not kno
176c0 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79  w about how many
176d0 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69   tries are remai
176e0 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69  ning */..if (tri
176f0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
17700 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  {...*tries_remai
17710 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a  ning_p = -1;..}.
17720 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c  ../* Apparently,
17730 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45   CAC PINs are *E
17740 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20  XACTLY* 8 bytes 
17750 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68  long -- pad with
17760 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f   0xFF if too sho
17770 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c  rt */..if (pin_l
17780 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d  en >= 8) {...mem
17790 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
177a0 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  , 8);..} else {.
177b0 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e  ..memcpy(cac_pin
177c0 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b  , pin, pin_len);
177d0 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20  ..}.../* Reject 
177e0 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20 74  PINs which are t
177f0 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20  oo short */..if 
17800 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a  (pin_len < 5) {.
17810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17820 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67  RINTF("Rejecting
17830 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f   PIN which is to
17840 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20  o short (length 
17850 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61  = %lu, must be a
17860 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f  tleast 5)", pin_
17870 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
17880 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
17890 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50  DPIN);..}.../* P
178a0 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  IV authenticatio
178b0 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65  n uses a "key_re
178c0 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30  ference" of 0x80
178d0 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69   */..pcsc_identi
178e0 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
178f0 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e  ad_certs(slot, N
17900 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
17910 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73  ;..if (num_certs
17920 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65   > 0 && pcsc_ide
17930 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
17940 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63 73   {...switch (pcs
17950 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e  c_identities[0].
17960 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61  id_type) {....ca
17970 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
17980 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45  E_PIV:.....CACKE
17990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
179a0 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72 64  We have PIV card
179b0 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 74  , so we will att
179c0 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74 69  empt to authenti
179d0 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20 50  cate using the P
179e0 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b  IV Application k
179f0 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b 0a  ey reference");.
17a00 0a 09 09 09 09 68 61 76 65 5f 70 69 76 20 3d 20  .....have_piv = 
17a10 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
17a20 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72  .default:.....br
17a30 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  eak;...}....cack
17a40 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
17a50 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
17a60 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d  um_certs, 1);..}
17a70 0a 0a 09 69 66 20 28 68 61 76 65 5f 70 69 76 20  ...if (have_piv 
17a80 3d 3d 20 31 29 20 7b 0a 09 09 6b 65 79 5f 72 65  == 1) {...key_re
17a90 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a  ference = 0x80;.
17aa0 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49  .}.../* Issue PI
17ab0 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e  N Verify */..sen
17ac0 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
17ad0 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
17ae0 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
17af0 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  16, GSCIS_INSTR_
17b00 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65  VERIFY, 0x00, ke
17b10 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a  y_reference, siz
17b20 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61  eof(cac_pin), ca
17b30 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65  c_pin, 0x00, &re
17b40 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c  sponse_code, NUL
17b50 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28  L, NULL);...if (
17b60 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
17b70 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
17b80 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f  ..if ((response_
17b90 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d  code & 0x63C0) =
17ba0 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74  = 0x63C0) {....t
17bb0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
17bc0 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20   (response_code 
17bd0 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b  & 0xF);.....CACK
17be0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17bf0 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f  "PIN Verificatio
17c00 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69  n failed, %i tri
17c10 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74  es remaining", t
17c20 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b  ries_remaining);
17c30 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72  .....if (tries_r
17c40 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09  emaining_p) {...
17c50 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ..*tries_remaini
17c60 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d  ng_p = tries_rem
17c70 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09  aining;....}....
17c80 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
17c90 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
17ca0 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e  .}....if (respon
17cb0 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  se_code == 0x698
17cc0 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  3) {....CACKEY_D
17cd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
17ce0 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
17cf0 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20  iled, device is 
17d00 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65  locked");.....re
17d10 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
17d20 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a  _E_LOCKED);...}.
17d30 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
17d40 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29 20  code == 0x6d00) 
17d50 7b 0a 09 09 09 69 66 20 28 72 65 74 72 69 65 73  {....if (retries
17d60 20 3e 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b   > 0) {.....CACK
17d70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17d80 22 47 6f 74 20 49 53 4f 20 37 38 31 36 20 52 65  "Got ISO 7816 Re
17d90 73 70 6f 6e 73 65 20 5c 22 36 44 20 30 30 5c 22  sponse \"6D 00\"
17da0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
17db0 61 20 56 45 52 49 46 59 20 72 65 71 75 65 73 74  a VERIFY request
17dc0 2e 22 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f  .");.....CACKEY_
17dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
17de0 20 64 69 64 20 6e 6f 74 20 65 78 70 65 63 74 20   did not expect 
17df0 74 68 69 73 20 62 65 63 61 75 73 65 20 69 74 20  this because it 
17e00 69 73 20 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65 64  is not mentioned
17e10 20 69 6e 20 4e 49 53 54 20 53 50 20 38 30 30 2d   in NIST SP 800-
17e20 37 33 2d 33 20 50 61 72 74 20 32 20 53 65 63 74  73-3 Part 2 Sect
17e30 69 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 47 53 43  ion 3.2.1 or GSC
17e40 2d 49 53 20 76 32 2e 31 22 29 3b 0a 09 09 09 09  -IS v2.1");.....
17e50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17e60 4e 54 46 28 22 57 65 20 61 72 65 20 67 6f 69 6e  NTF("We are goin
17e70 67 20 74 6f 20 74 72 79 20 74 6f 20 72 65 73 65  g to try to rese
17e80 74 20 74 68 65 20 63 61 72 64 20 61 6e 64 20 73  t the card and s
17e90 65 6c 65 63 74 20 74 68 65 20 61 70 70 6c 65 74  elect the applet
17ea0 20 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 09 09 09   again.");......
17eb0 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
17ec0 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69  0 && pcsc_identi
17ed0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
17ee0 09 09 09 09 09 63 61 63 6b 65 79 5f 64 65 74 65  .....cackey_dete
17ef0 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f  ct_and_select_ro
17f00 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ot_applet(slot, 
17f10 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
17f20 30 5d 2e 69 64 5f 74 79 70 65 29 3b 0a 09 09 09  0].id_type);....
17f30 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  .}......cackey_m
17f40 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
17f50 6c 6f 74 29 3b 0a 0a 09 09 09 09 63 6f 6e 6e 65  lot);......conne
17f60 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
17f70 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
17f80 74 29 3b 0a 09 09 09 09 69 66 20 28 63 6f 6e 6e  t);.....if (conn
17f90 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
17fa0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
17fb0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17fc0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
17fd0 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 61 66 74  to reconnect aft
17fe0 65 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  er resetting the
17ff0 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
18000 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09   in error.");...
18010 09 09 09 09 72 65 74 75 72 6e 28 63 6f 6e 6e 65  ....return(conne
18020 63 74 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a  ct_ret);.....}..
18030 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18040 5f 50 52 49 4e 54 46 28 22 56 65 72 69 66 79 69  _PRINTF("Verifyi
18050 6e 67 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65  ng we still have
18060 20 61 20 74 6f 6b 65 6e 2e 22 29 3b 0a 09 09 09   a token.");....
18070 09 74 6f 6b 65 6e 5f 72 65 74 20 3d 20 63 61 63  .token_ret = cac
18080 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
18090 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20  t(slot);.....if 
180a0 28 74 6f 6b 65 6e 5f 72 65 74 20 21 3d 20 43 41  (token_ret != CA
180b0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
180c0 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 09 09  NPRESENT) {.....
180d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
180e0 49 4e 54 46 28 22 54 6f 6b 65 6e 20 6e 6f 74 20  INTF("Token not 
180f0 70 72 65 73 65 6e 74 2c 20 72 65 74 75 72 6e 69  present, returni
18100 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a  ng in error.");.
18110 0a 09 09 09 09 09 72 65 74 75 72 6e 28 74 6f 6b  ......return(tok
18120 65 6e 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a  en_ret);.....}..
18130 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18140 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20  _PRINTF("Trying 
18150 74 6f 20 6c 6f 67 69 6e 20 61 67 61 69 6e 22 29  to login again")
18160 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 63  ;.....return(cac
18170 6b 65 79 5f 6c 6f 67 69 6e 28 73 6c 6f 74 2c 20  key_login(slot, 
18180 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 2c 20 74 72  pin, pin_len, tr
18190 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c  ies_remaining_p,
181a0 20 72 65 74 72 69 65 73 20 2d 20 31 29 29 3b 0a   retries - 1));.
181b0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ...}...}....retu
181c0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
181d0 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
181e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
181f0 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63  NTF("PIN Verific
18200 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64 22  ation succeeded"
18210 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
18220 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
18230 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
18240 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
18250 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
18260 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
18270 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
18280 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
18290 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
182a0 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
182b0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
182c0 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28  entity_to_label(
182d0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
182e0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
182f0 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
18300 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c  char *label_buf,
18310 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
18320 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a  abel_buf_len) {.
18330 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63  .unsigned long c
18340 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
18350 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e  .void *label_asn
18360 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66  1;..void *certif
18370 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39  icate;..int x509
18380 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72  _read_ret;...cer
18390 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
183a0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
183b0 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
183c0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
183d0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
183e0 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
183f0 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72  e_len < 0) {...r
18400 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
18410 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
18420 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
18430 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
18440 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76  tificate_len, (v
18450 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61  oid **) &label_a
18460 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f  sn1);..if (x509_
18470 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
18480 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
18490 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
184a0 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74   = x509_dn_to_st
184b0 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c  ring(label_asn1,
184c0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20   x509_read_ret, 
184d0 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62  (char *) label_b
184e0 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  uf, label_buf_le
184f0 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78  n, "CN");..if (x
18500 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
18510 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64  0) {...x509_read
18520 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74  _ret = x509_dn_t
18530 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61  o_string(label_a
18540 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  sn1, x509_read_r
18550 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62  et, (char *) lab
18560 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75  el_buf, label_bu
18570 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  f_len, NULL);...
18580 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
18590 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65  et <= 0) {....re
185a0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
185b0 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
185c0 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
185d0 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
185e0 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  AX..if (x509_rea
185f0 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53  d_ret > _POSIX_S
18600 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
18610 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18620 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74  F("x509_read_ret
18630 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
18640 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
18650 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
18660 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72  ax = %li, x509_r
18670 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c  ead_ret = %lu)",
18680 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
18690 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
186a0 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72  ned long) x509_r
186b0 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ead_ret);....ret
186c0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
186d0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65  ndif.#endif...re
186e0 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72  turn(x509_read_r
186f0 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  et);.}../* Retur
18700 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
18710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
18720 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
18730 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20  e(void **mutex) 
18740 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
18750 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
18760 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
18770 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
18780 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
18790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
187a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
187b0 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
187c0 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
187d0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
187e0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
187f0 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
18800 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73  mutex = malloc(s
18810 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d  izeof(*pthread_m
18820 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70  utex));...if (!p
18830 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a  thread_mutex) {.
18840 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18850 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
18860 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
18870 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  y.");.....return
18880 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  (-1);...}....pth
18890 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
188a0 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
188b0 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20  (pthread_mutex, 
188c0 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68  NULL);...if (pth
188d0 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
188e0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
188f0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
18900 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29  ead_mutex_init()
18910 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
18920 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
18930 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
18940 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
18950 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64  *mutex = pthread
18960 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20  _mutex;..} else 
18970 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
18980 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29  rgs.CreateMutex)
18990 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
189a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
189b0 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75  s.CreateMutex(mu
189c0 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
189d0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
189e0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
189f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18a00 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ("cackey_args.Cr
18a10 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75  eateMutex() retu
18a20 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
18a30 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
18a40 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
18a50 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
18a60 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
18a70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18a80 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
18a90 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
18aa0 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
18ab0 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
18ac0 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
18ad0 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  t cackey_mutex_l
18ae0 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
18af0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
18b00 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
18b10 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
18b20 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
18b30 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
18b40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18b50 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
18b60 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
18b70 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
18b80 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
18b90 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
18ba0 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
18bb0 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
18bc0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
18bd0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
18be0 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  x_lock(pthread_m
18bf0 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
18c00 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
18c10 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
18c20 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
18c30 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29  ead_mutex_lock()
18c40 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
18c50 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
18c60 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
18c70 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20  urn(-1);...}..} 
18c80 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
18c90 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
18ca0 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
18cb0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
18cc0 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d  args.LockMutex(m
18cd0 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
18ce0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
18cf0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
18d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18d10 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  F("cackey_args.L
18d20 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
18d30 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
18d40 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
18d50 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
18d60 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
18d70 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
18d80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18d90 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
18da0 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
18db0 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
18dc0 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
18dd0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
18de0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
18df0 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
18e00 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
18e10 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
18e20 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
18e30 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
18e40 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
18e50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18e60 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
18e70 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
18e80 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
18e90 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
18ea0 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
18eb0 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
18ec0 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
18ed0 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
18ee0 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
18ef0 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61  ex_unlock(pthrea
18f00 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
18f10 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
18f20 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
18f30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
18f40 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
18f50 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
18f60 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
18f70 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
18f80 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
18f90 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
18fa0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e   (cackey_args.Un
18fb0 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  lockMutex) {....
18fc0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
18fd0 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
18fe0 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  ckMutex(mutex);.
18ff0 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
19000 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
19010 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
19020 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
19030 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
19040 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
19050 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
19060 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
19070 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
19080 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
19090 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
190a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
190b0 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
190c0 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
190d0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f  );.}..static CK_
190e0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61  ATTRIBUTE_PTR ca
190f0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
19100 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  tes(CK_OBJECT_CL
19110 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c  ASS objectclass,
19120 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
19130 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
19140 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
19150 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e   long identity_n
19160 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  um, CK_ULONG_PTR
19170 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
19180 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
19190 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74  _true = 1;..stat
191a0 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66  ic CK_BBOOL ck_f
191b0 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69  alse = 0;..stati
191c0 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72  c CK_TRUST ck_tr
191d0 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54  usted = CK_TRUST
191e0 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43  ED_DELEGATOR;..C
191f0 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73  K_ULONG numattrs
19200 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75   = 0, retval_cou
19210 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  nt;..CK_ATTRIBUT
19220 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72  E_TYPE curr_attr
19230 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49  _type;..CK_ATTRI
19240 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20  BUTE curr_attr, 
19250 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49  *retval;..CK_VOI
19260 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
19270 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
19280 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43  en;..CK_OBJECT_C
19290 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63  LASS ck_object_c
192a0 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46  lass;..CK_CERTIF
192b0 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65  ICATE_TYPE ck_ce
192c0 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
192d0 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f  .CK_KEY_TYPE ck_
192e0 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54  key_type;..CK_UT
192f0 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b  F8CHAR ucTmpBuf[
19300 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74  1024];..SHA1Cont
19310 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d  ext sha1_ctx;..M
19320 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a  D5_CTX md5_ctx;.
19330 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61  .uint8_t sha1_ha
19340 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d  sh[SHA1HashSize]
19350 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68  ;..uint8_t md5_h
19360 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d  ash[MD5HashSize]
19370 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
19380 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
19390 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63  ssize_t certific
193a0 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35  ate_len = -1, x5
193b0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  09_read_ret;..in
193c0 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a  t pValue_free;..
193d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
193e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62  INTF("Called (ob
193f0 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c  jectClass = %lu,
19400 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20   identity_num = 
19410 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
19420 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c  d long) objectcl
19430 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75  ass, identity_nu
19440 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  m);...*pulCount 
19450 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63  = 0;...if (objec
19460 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
19470 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
19480 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19490 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62  PUBLIC_KEY && ob
194a0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
194b0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
194c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
194d0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
194e0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
194f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
19500 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
19510 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
19520 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a  object class");.
19530 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
19540 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72  ..}.../* Get Cer
19550 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  t */..if (identi
19560 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
19570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19580 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
19590 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
195a0 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79   invalid identiy
195b0 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09   provided");....
195c0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
195d0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
195e0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
195f0 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
19600 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
19610 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
19620 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
19630 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d  ificate_len == -
19640 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65  1 || certificate
19650 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
19660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19670 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
19680 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
19690 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65  his identity doe
196a0 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e  s not have an X.
196b0 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
196c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
196d0 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  it and will not 
196e0 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72  work");....retur
196f0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
19700 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72   Verify that cer
19710 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e  tificate is ASN.
19720 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20  1 encoded X.509 
19730 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
19740 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69  if (x509_to_seri
19750 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
19760 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
19770 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09   NULL) < 0) {...
19780 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19790 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
197a0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
197b0 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69   the X.509 certi
197c0 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
197d0 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e  d with this iden
197e0 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69  tity is not vali
197f0 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
19800 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  ULL);..}...retva
19810 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72  l_count = 64;..r
19820 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72  etval = malloc(r
19830 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
19840 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
19850 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
19860 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f  _type = 0; curr_
19870 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65  attr_type < 0xce
19880 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74  5363bf; curr_att
19890 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66  r_type++) {...if
198a0 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
198b0 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09   == 0x800) {....
198c0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
198d0 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d   0xce536300;...}
198e0 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20  ....pValue_free 
198f0 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20  = 0;...pValue = 
19900 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
19910 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
19920 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  1;....switch (cu
19930 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a  rr_attr_type) {.
19940 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53  ...case CKA_CLAS
19950 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
19960 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
19970 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
19980 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30   CKA_CLASS (0x%0
19990 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
199a0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
199b0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
199c0 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  .ck_object_class
199d0 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a   = objectclass;.
199e0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
199f0 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
19a00 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
19a10 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63   sizeof(ck_objec
19a20 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43  t_class);......C
19a30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19a40 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
19a50 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
19a60 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19a70 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  ) *((CK_OBJECT_C
19a80 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c  LASS *) pValue),
19a90 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
19aa0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
19ab0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
19ac0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  ;....case CKA_TO
19ad0 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  KEN:.....CACKEY_
19ae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19af0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19b00 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78  te CKA_TOKEN (0x
19b10 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
19b20 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
19b30 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
19b40 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
19b50 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
19b60 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
19b70 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
19b80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19b90 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
19ba0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
19bb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19bc0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
19bd0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
19be0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19bf0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19c00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19c10 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
19c20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19c30 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
19c40 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
19c50 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78  PRIVATE (0x%08lx
19c60 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19c70 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19c80 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
19c90 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
19ca0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19cb0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
19cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19cd0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
19ce0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
19cf0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65   we are not a Ne
19d00 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
19d10 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
19d20 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70  ak;.....}......p
19d30 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
19d40 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
19d50 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
19d60 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
19d70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19d80 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
19d90 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
19da0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
19db0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
19dc0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
19dd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
19de0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
19df0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
19e00 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09  KA_TRUSTED:.....
19e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19e20 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
19e30 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
19e40 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20  USTED (0x%08lx) 
19e50 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
19e60 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
19e70 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
19e80 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
19e90 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
19ea0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
19eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19ec0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
19ed0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
19ee0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
19ef0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
19f00 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
19f10 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
19f20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
19f30 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
19f40 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
19f50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19f60 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
19f70 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
19f80 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
19f90 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
19fa0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
19fb0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
19fc0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
19fd0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19fe0 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46  ..case CKA_MODIF
19ff0 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45  IABLE:.....CACKE
1a000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a010 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1a020 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  bute CKA_MODIFIA
1a030 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
1a040 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1a050 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1a060 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
1a070 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
1a080 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1a090 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
1a0a0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1a0b0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1a0c0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1a0d0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1a0e0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
1a0f0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
1a100 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1a110 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1a120 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1a130 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41  ;....case CKA_LA
1a140 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BEL:.....CACKEY_
1a150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a160 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1a170 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78  te CKA_LABEL (0x
1a180 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1a190 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1a1a0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1a1b0 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
1a1c0 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b  >id_type == CACK
1a1d0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 29 20  EY_ID_TYPE_PIV) 
1a1e0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1a1f0 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70  identity->card.p
1a200 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75  iv.label;......u
1a210 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c  lValueLen = strl
1a220 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  en(pValue);.....
1a230 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c  } else {......ul
1a240 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69  ValueLen = snpri
1a250 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75 63 54  ntf((char *) ucT
1a260 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63  mpBuf, sizeof(uc
1a270 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69  TmpBuf), "Identi
1a280 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67  ty #%lu", (unsig
1a290 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
1a2a0 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56  ty_num);......pV
1a2b0 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b  alue = ucTmpBuf;
1a2c0 0a 0a 09 09 09 09 09 69 66 20 28 75 6c 56 61 6c  .......if (ulVal
1a2d0 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28  ueLen >= sizeof(
1a2e0 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09  ucTmpBuf)) {....
1a2f0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1a300 30 3b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20  0;.......pValue 
1a310 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09  = NULL;......}..
1a320 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1a330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a340 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
1a350 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
1a360 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a370 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1a380 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1a390 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09  e CKA_VALUE:....
1a3a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a3b0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1a3c0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56   attribute CKA_V
1a3d0 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ALUE (0x%08lx) .
1a3e0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1a3f0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1a400 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63  ype);......switc
1a410 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20  h (objectclass) 
1a420 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  {......case CKO_
1a430 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09  PRIVATE_KEY:....
1a440 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a450 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1a460 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1a470 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
1a480 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b   private key.");
1a490 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
1a4a0 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54  ....case CKO_NET
1a4b0 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09  SCAPE_TRUST:....
1a4c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a4d0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1a4e0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1a4f0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
1a500 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1a510 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1a520 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
1a530 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  e CKO_PUBLIC_KEY
1a540 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65 72 74  :.......if (cert
1a550 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
1a560 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f  ) {........x509_
1a570 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
1a580 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66  to_pubkey(certif
1a590 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
1a5a0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
1a5b0 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78 35 30  ;........if (x50
1a5c0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
1a5d0 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75  { .........pValu
1a5e0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  e = NULL;.......
1a5f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1a600 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
1a610 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
1a620 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a  .....}.......}..
1a630 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1a640 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49  ..case CKO_CERTI
1a650 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56  FICATE:.......pV
1a660 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61  alue = certifica
1a670 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  te;.......ulValu
1a680 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61  eLen = certifica
1a690 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62  te_len;........b
1a6a0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1a6b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a6c0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1a6d0 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
1a6e0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1a6f0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1a700 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1a710 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
1a720 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
1a730 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1a740 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1a750 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25   CKA_ISSUER (0x%
1a760 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a770 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a780 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a790 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1a7a0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
1a7b0 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
1a7c0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
1a7d0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1a7e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a7f0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1a800 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1a810 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
1a820 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  t a certificate 
1a830 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73  or Netscape trus
1a840 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1a850 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1a860 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
1a870 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
1a880 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
1a890 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73  et = x509_to_iss
1a8a0 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c  uer(certificate,
1a8b0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
1a8c0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
1a8d0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
1a8e0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
1a8f0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
1a900 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1a910 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1a920 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
1a930 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
1a940 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a950 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1a960 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
1a970 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1a980 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1a990 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1a9a0 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
1a9b0 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41  L_NUMBER:.....CA
1a9c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a9d0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1a9e0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49  tribute CKA_SERI
1a9f0 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38  AL_NUMBER (0x%08
1aa00 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1aa10 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1aa20 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1aa30 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1aa40 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
1aa50 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
1aa60 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
1aa70 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1aa80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1aa90 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1aaa0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1aab0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
1aac0 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72  a certificate or
1aad0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1aae0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1aaf0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1ab00 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
1ab10 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
1ab20 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
1ab30 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61   = x509_to_seria
1ab40 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
1ab50 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
1ab60 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
1ab70 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
1ab80 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
1ab90 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
1aba0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1abb0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
1abc0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
1abd0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
1abe0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1abf0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1ac00 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
1ac10 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1ac20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1ac30 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1ac40 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45  ..case CKA_SUBJE
1ac50 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  CT:.....CACKEY_D
1ac60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1ac70 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1ac80 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30  e CKA_SUBJECT (0
1ac90 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1aca0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1acb0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1acc0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1acd0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
1ace0 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
1acf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ad00 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1ad10 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1ad20 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
1ad30 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a   certificate");.
1ad40 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1ad50 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
1ad60 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
1ad70 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
1ad80 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
1ad90 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69  _subject(certifi
1ada0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
1adb0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
1adc0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
1add0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
1ade0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
1adf0 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
1ae00 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
1ae10 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
1ae20 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
1ae30 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1ae40 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1ae50 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
1ae60 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
1ae70 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1ae80 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1ae90 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1aea0 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ID:.....CACKEY_D
1aeb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1aec0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1aed0 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c  e CKA_ID (0x%08l
1aee0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1aef0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1af00 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1af10 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1af20 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1af30 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1af40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1af50 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1af60 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1af70 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
1af80 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1af90 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1afa0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d  .....}......ucTm
1afb0 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e  pBuf[0] = ((iden
1afc0 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e  tity_num + 1) >>
1afd0 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09   8) & 0xff;.....
1afe0 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28  ucTmpBuf[1] =  (
1aff0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31  identity_num + 1
1b000 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70  ) & 0xff;......p
1b010 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75  Value = &ucTmpBu
1b020 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  f;.....ulValueLe
1b030 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b  n = 2;......CACK
1b040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b050 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1b060 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
1b070 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b080 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1b090 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1b0a0 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
1b0b0 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b  E_TYPE:.....CACK
1b0c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b0d0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1b0e0 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46  ibute CKA_CERTIF
1b0f0 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 30  ICATE_TYPE (0x%0
1b100 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1b110 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1b120 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1b130 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1b140 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
1b150 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
1b160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b170 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1b180 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1b190 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
1b1a0 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09  rtificate.");...
1b1b0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1b1c0 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79  ....../* We only
1b1d0 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72   support one cer
1b1e0 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f  tificate type */
1b1f0 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63  .....ck_certific
1b200 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58  ate_type = CKC_X
1b210 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _509;......pValu
1b220 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63  e = &ck_certific
1b230 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  ate_type;.....ul
1b240 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1b250 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  f(ck_certificate
1b260 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
1b270 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b280 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1b290 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29   CKC_X_509 (%lu)
1b2a0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1b2b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1b2c0 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
1b2d0 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
1b2e0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1b2f0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1b300 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1b310 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f  ...case CKA_KEY_
1b320 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
1b330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b340 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1b350 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ute CKA_KEY_TYPE
1b360 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1b370 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b380 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1b390 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1b3a0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52  tclass != CKO_PR
1b3b0 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a  IVATE_KEY && obj
1b3c0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
1b3d0 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
1b3e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b3f0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1b400 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1b410 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1b420 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09  ot a key.");....
1b430 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1b440 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20  ...../* We only 
1b450 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20  support one key 
1b460 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b  type */.....ck_k
1b470 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53  ey_type = CKK_RS
1b480 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  A;......pValue =
1b490 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09   &ck_key_type;..
1b4a0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1b4b0 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79  sizeof(ck_key_ty
1b4c0 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  pe);......CACKEY
1b4d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b4e0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b  ... returning CK
1b4f0 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f  K_RSA (%lu) (%p/
1b500 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
1b510 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
1b520 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
1b530 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
1b540 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1b550 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1b560 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1b570 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
1b580 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b590 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1b5a0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
1b5b0 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  IGN (0x%08lx) ..
1b5c0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1b5d0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1b5e0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1b5f0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1b600 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1b610 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1b620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b630 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1b640 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1b650 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1b660 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1b670 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1b680 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
1b690 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
1b6a0 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
1b6b0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
1b6c0 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
1b6d0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1b6e0 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
1b6f0 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
1b700 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
1b710 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1b720 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
1b730 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
1b740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b750 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1b760 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1b770 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b780 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1b790 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1b7a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b7b0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1b7c0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1b7d0 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
1b7e0 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
1b7f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1b800 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1b810 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
1b820 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
1b830 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1b840 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1b850 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1b860 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
1b870 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1b880 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b890 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b8a0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1b8b0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1b8c0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
1b8d0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1b8e0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1b8f0 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65  ...../* We curre
1b900 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ntly only suppor
1b910 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70  t "Sign with App
1b920 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56  endix" */.....pV
1b930 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
1b940 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1b950 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
1b960 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
1b970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b980 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1b990 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1b9a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1b9b0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
1b9c0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1b9d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1b9e0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1b9f0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1ba00 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43  A_DECRYPT:.....C
1ba10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ba20 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1ba30 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43  ttribute CKA_DEC
1ba40 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e  RYPT (0x%08lx) .
1ba50 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1ba60 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1ba70 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1ba80 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1ba90 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1baa0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1bab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1bac0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1bad0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1bae0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
1baf0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1bb00 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1bb10 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
1bb20 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
1bb30 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62  RIVATE_KEY || ob
1bb40 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1bb50 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
1bb60 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1bb70 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
1bb80 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1bb90 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
1bba0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
1bbb0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
1bbc0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1bbd0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
1bbe0 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
1bbf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bc00 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1bc10 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
1bc20 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1bc30 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
1bc40 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
1bc50 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1bc60 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1bc70 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1bc80 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  se CKA_SENSITIVE
1bc90 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1bca0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1bcb0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1bcc0 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30  CKA_SENSITIVE (0
1bcd0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1bce0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1bcf0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1bd00 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1bd10 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1bd20 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1bd30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bd40 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1bd50 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1bd60 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1bd70 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1bd80 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1bd90 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1bda0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1bdb0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
1bdc0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
1bdd0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1bde0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1bdf0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1be00 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1be10 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1be20 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
1be30 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1be40 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
1be50 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1be60 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1be70 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1be80 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1be90 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1bea0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1beb0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1bec0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1bed0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1bee0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45  k;....case CKA_E
1bef0 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09  XTRACTABLE:.....
1bf00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bf10 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1bf20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58  attribute CKA_EX
1bf30 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38  TRACTABLE (0x%08
1bf40 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1bf50 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1bf60 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1bf70 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1bf80 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
1bf90 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1bfa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bfb0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1bfc0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1bfd0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
1bfe0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1bff0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1c000 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1c010 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1c020 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
1c030 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
1c040 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
1c050 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1c060 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
1c070 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1c080 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
1c090 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
1c0a0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1c0b0 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
1c0c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c0d0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1c0e0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
1c0f0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1c100 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
1c110 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
1c120 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1c130 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1c140 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1c150 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
1c160 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  US:.....CACKEY_D
1c170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1c180 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1c190 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30  e CKA_MODULUS (0
1c1a0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1c1b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1c1c0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1c1d0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1c1e0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1c1f0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1c200 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c210 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1c220 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1c230 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1c240 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1c250 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1c260 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1c270 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
1c280 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
1c290 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
1c2a0 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75  = x509_to_modulu
1c2b0 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  s(certificate, c
1c2c0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
1c2d0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
1c2e0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
1c2f0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
1c300 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
1c310 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1c320 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
1c330 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
1c340 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
1c350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c360 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1c370 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
1c380 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1c390 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1c3a0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1c3b0 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49  ..case CKA_PUBLI
1c3c0 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09  C_EXPONENT:.....
1c3d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c3e0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1c3f0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55  attribute CKA_PU
1c400 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30  BLIC_EXPONENT (0
1c410 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1c420 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1c430 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1c440 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1c450 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1c460 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1c470 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c480 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1c490 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1c4a0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1c4b0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1c4c0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1c4d0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1c4e0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
1c4f0 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
1c500 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
1c510 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65  = x509_to_expone
1c520 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  nt(certificate, 
1c530 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
1c540 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
1c550 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
1c560 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
1c570 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
1c580 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1c590 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
1c5a0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
1c5b0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
1c5c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c5d0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1c5e0 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
1c5f0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1c600 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1c610 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1c620 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1c630 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54  T_DIGITAL_SIGNAT
1c640 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  URE:....case CKA
1c650 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44  _TRUST_NON_REPUD
1c660 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20  IATION:....case 
1c670 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e  CKA_TRUST_KEY_EN
1c680 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63  CIPHERMENT:....c
1c690 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41  ase CKA_TRUST_DA
1c6a0 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a  TA_ENCIPHERMENT:
1c6b0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1c6c0 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54  ST_KEY_AGREEMENT
1c6d0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1c6e0 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47  UST_KEY_CERT_SIG
1c6f0 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  N:....case CKA_T
1c700 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09  RUST_CRL_SIGN:..
1c710 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1c720 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09  _SERVER_AUTH:...
1c730 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
1c740 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09  CLIENT_AUTH:....
1c750 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
1c760 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09  ODE_SIGNING:....
1c770 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45  case CKA_TRUST_E
1c780 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a  MAIL_PROTECTION:
1c790 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c7a0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1c7b0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1c7c0 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78  KA_TRUST_... (0x
1c7d0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1c7e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1c7f0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1c800 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1c810 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56  trusted;.....ulV
1c820 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1c830 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09  (ck_trusted);...
1c840 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c850 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1c860 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
1c870 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1c880 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53  long) *((CK_TRUS
1c890 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  T *) pValue), pV
1c8a0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1c8b0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1c8c0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1c8d0 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
1c8e0 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43  SHA1_HASH:.....C
1c8f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c900 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1c910 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
1c920 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 25  T_SHA1_HASH (0x%
1c930 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1c940 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1c950 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1c960 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1c970 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
1c980 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1c990 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c9a0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1c9b0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1c9c0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
1c9d0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1c9e0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1c9f0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1ca00 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73 68  ...SHA1Reset(&sh
1ca10 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41  a1_ctx);.....SHA
1ca20 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78  1Input(&sha1_ctx
1ca30 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  , certificate, c
1ca40 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1ca50 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 28  .....SHA1Result(
1ca60 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f  &sha1_ctx, sha1_
1ca70 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c  hash);......pVal
1ca80 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a  ue = sha1_hash;.
1ca90 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1caa0 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73   sizeof(sha1_has
1cab0 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  h);......CACKEY_
1cac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1cad0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
1cae0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
1caf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1cb00 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1cb10 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1cb20 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48  KA_CERT_MD5_HASH
1cb30 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1cb40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1cb50 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1cb60 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53  CKA_CERT_MD5_HAS
1cb70 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
1cb80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1cb90 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1cba0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1cbb0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
1cbc0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1cbd0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1cbe0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1cbf0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1cc00 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1cc10 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
1cc20 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1cc30 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1cc40 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74  ..}......MD5Init
1cc50 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09  (&md5_ctx);.....
1cc60 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63  MD5Update(&md5_c
1cc70 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c  tx, certificate,
1cc80 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
1cc90 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28  );.....MD5Final(
1cca0 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63  md5_hash, &md5_c
1ccb0 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  tx);......pValue
1ccc0 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09   = md5_hash;....
1ccd0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1cce0 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a  zeof(md5_hash);.
1ccf0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1cd00 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1cd10 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
1cd20 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1cd30 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1cd40 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1cd50 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  k;....default:..
1cd60 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
1cd70 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1cd80 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
1cd90 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
1cda0 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47  ...if (((CK_LONG
1cdb0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d  ) ulValueLen) !=
1cdc0 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29   ((CK_LONG) -1))
1cdd0 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75   {..../* Push cu
1cde0 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65  rr_attr onto the
1cdf0 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72   stack */....cur
1ce00 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75  r_attr.type = cu
1ce10 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09  rr_attr_type;...
1ce20 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  .curr_attr.ulVal
1ce30 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c  ueLen = ulValueL
1ce40 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  en;.....curr_att
1ce50 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f  r.pValue = mallo
1ce60 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  c(curr_attr.ulVa
1ce70 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  lueLen);....memc
1ce80 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61  py(curr_attr.pVa
1ce90 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72  lue, pValue, cur
1cea0 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
1ceb0 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c  n);.....if (pVal
1cec0 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75  ue_free && pValu
1ced0 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56  e) {.....free(pV
1cee0 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  alue);....}.....
1cef0 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20  if (numattrs >= 
1cf00 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a  retval_count) {.
1cf10 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ....retval = rea
1cf20 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
1cf30 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
1cf40 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09  of(*retval));...
1cf50 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72  .}.....memcpy(&r
1cf60 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c  etval[numattrs],
1cf70 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a   &curr_attr, siz
1cf80 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b  eof(curr_attr));
1cf90 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a  ....numattrs++;.
1cfa0 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d  ..}..}...if (num
1cfb0 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09  attrs != 0) {...
1cfc0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e  retval_count = n
1cfd0 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61  umattrs;...retva
1cfe0 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76  l = realloc(retv
1cff0 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74  al, retval_count
1d000 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
1d010 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  l));..} else {..
1d020 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a  .free(retval);..
1d030 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b  ..retval = NULL;
1d040 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  ..}...*pulCount 
1d050 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41  = numattrs;...CA
1d060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d070 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75  F("Returning %lu
1d080 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c   objects (%p).",
1d090 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64   numattrs, (void
1d0a0 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72   *) retval);...r
1d0b0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
1d0c0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
1d0d0 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
1d0e0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1d0f0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
1d100 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
1d110 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65  d long identitie
1d120 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  s_count) {..CK_A
1d130 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
1d140 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ttr;..unsigned l
1d150 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72  ong id_idx, attr
1d160 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e  _idx;...if (iden
1d170 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c  tities == NULL |
1d180 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  | identities_cou
1d190 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  nt == 0) {...ret
1d1a0 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  urn;..}...for (i
1d1b0 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64  d_idx = 0; id_id
1d1c0 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63  x < identities_c
1d1d0 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20  ount; id_idx++) 
1d1e0 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  {...if (identiti
1d1f0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1d200 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20  butes) {....for 
1d210 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
1d220 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
1d230 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1d240 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61  ributes_count; a
1d250 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
1d260 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64  .curr_attr = &id
1d270 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1d280 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72  .attributes[attr
1d290 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28  _idx];......if (
1d2a0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1d2b0 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
1d2c0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
1d2d0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
1d2e0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1d2f0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1d300 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28  tes) {.....free(
1d310 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1d320 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a  x].attributes);.
1d330 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
1d340 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74  free_certs(ident
1d350 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1d360 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20  sc_identity, 1, 
1d370 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65  1);...}..}...fre
1d380 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d  e(identities);.}
1d390 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
1d3a0 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65  d long cackey_re
1d3b0 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
1d3c0 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
1d3d0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
1d3e0 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ties, unsigned l
1d3f0 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  ong num_dod_cert
1d400 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  s) {..unsigned l
1d410 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64  ong cert_idx, id
1d420 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28  _idx = 0;...if (
1d430 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
1d440 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e  LL) {...return(n
1d450 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33  um_dod_certs * 3
1d460 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72  );..}...for (cer
1d470 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f  t_idx = 0; cert_
1d480 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65  idx < num_dod_ce
1d490 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29  rts; cert_idx++)
1d4a0 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b   {...identities[
1d4b0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1d4c0 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
1d4d0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1d4e0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
1d4f0 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
1d500 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46  butes(CKO_CERTIF
1d510 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65  ICATE, &extra_ce
1d520 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
1d530 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
1d540 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1d550 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1d560 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
1d570 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69  x++;....identiti
1d580 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1d590 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
1d5a0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1d5b0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1d5c0 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
1d5d0 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42  tributes(CKO_PUB
1d5e0 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f  LIC_KEY, &extra_
1d5f0 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1d600 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1d610 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1d620 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1d630 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1d640 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69  idx++;....identi
1d650 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1d660 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c  c_identity = NUL
1d670 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  L;...identities[
1d680 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1d690 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
1d6a0 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e  attributes(CKO_N
1d6b0 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26  ETSCAPE_TRUST, &
1d6c0 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
1d6d0 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
1d6e0 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1d6f0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1d700 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1d710 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a  ...id_idx++;..}.
1d720 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29  ..return(id_idx)
1d730 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75  ;.}..static stru
1d740 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1d750 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
1d760 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
1d770 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
1d780 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  lot, unsigned lo
1d790 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b  ng *ids_found) {
1d7a0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
1d7b0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
1d7c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
1d7d0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
1d7e0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
1d7f0 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
1d800 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f  ong num_ids, id_
1d810 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70  idx, curr_id_typ
1d820 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e;..unsigned lon
1d830 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d  g num_certs, num
1d840 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74  _dod_certs, cert
1d850 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75  _idx;..int inclu
1d860 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1d870 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f   0, include_dod_
1d880 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  certs;...CACKEY_
1d890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1d8a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69  lled.");...if (i
1d8b0 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c  ds_found == NULL
1d8c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d8d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d8e0 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20  .  ids_found is 
1d8f0 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
1d900 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66  n(NULL);..}..#if
1d910 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f  def CACKEY_CARD_
1d920 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54  SLOT_INCLUDE_EXT
1d930 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64  RA_CERTS..includ
1d940 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
1d950 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28  1;.#endif...if (
1d960 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1d970 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53  OD_CERTS_ON_HW_S
1d980 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  LOTS") != NULL) 
1d990 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  {...include_extr
1d9a0 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a  a_certs = 1;..}.
1d9b0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1d9c0 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54  CKEY_NO_DOD_CERT
1d9d0 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20  S_ON_HW_SLOTS") 
1d9e0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1d9f0 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1da00 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66   = 0;..}..#ifdef
1da10 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41   CACKEY_NO_EXTRA
1da20 5f 43 45 52 54 53 0a 09 69 66 20 28 67 65 74 65  _CERTS..if (gete
1da30 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41  nv("CACKEY_EXTRA
1da40 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _CERTS") != NULL
1da50 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f  ) {...include_do
1da60 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20  d_certs = 1;..} 
1da70 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65  else {...include
1da80 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1da90 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65  .}.#else..if (ge
1daa0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
1dab0 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1dac0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1dad0 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30  de_dod_certs = 0
1dae0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e  ;..} else {...in
1daf0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1db00 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  = 1;..}.#endif..
1db10 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64  .if (include_dod
1db20 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f  _certs) {...num_
1db30 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65  dod_certs = size
1db40 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20  of(extra_certs) 
1db50 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63  / sizeof(extra_c
1db60 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73  erts[0]);..} els
1db70 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  e {...num_dod_ce
1db80 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  rts = 0;..}...if
1db90 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c   (slot->internal
1dba0 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20  ) {...num_ids = 
1dbb0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1dbc0 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c  identities(NULL,
1dbd0 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1dbe0 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20  ....if (num_ids 
1dbf0 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74  != 0) {....ident
1dc00 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e  ities = malloc(n
1dc10 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28  um_ids * sizeof(
1dc20 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a  *identities));..
1dc30 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  ...cackey_read_d
1dc40 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64  od_identities(id
1dc50 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f  entities, num_do
1dc60 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c  d_certs);...} el
1dc70 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69  se {....identiti
1dc80 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  es = NULL;...}..
1dc90 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e  ..*ids_found = n
1dca0 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72  um_ids;....retur
1dcb0 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09  n(identities);..
1dcc0 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74  }...pcsc_identit
1dcd0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
1dce0 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55  d_certs(slot, NU
1dcf0 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
1dd00 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
1dd10 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
1dd20 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75  .../* Convert nu
1dd30 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f  mber of Certs to
1dd40 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
1dd50 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20  ts */...num_ids 
1dd60 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  = (CKO_PRIVATE_K
1dd70 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49  EY - CKO_CERTIFI
1dd80 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f  CATE + 1) * num_
1dd90 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e  certs;....if (in
1dda0 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1ddb0 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20  s) {....num_ids 
1ddc0 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  += cackey_read_d
1ddd0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55  od_identities(NU
1dde0 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  LL, num_dod_cert
1ddf0 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74  s);...}....ident
1de00 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e  ities = malloc(n
1de10 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28  um_ids * sizeof(
1de20 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a  *identities));..
1de30 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69  ../* Add certifi
1de40 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65  cates, public ke
1de50 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20  ys, and private 
1de60 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d  keys from the sm
1de70 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f  artcard */...id_
1de80 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28  idx = 0;...for (
1de90 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65  cert_idx = 0; ce
1dea0 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72  rt_idx < num_cer
1deb0 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20  ts; cert_idx++) 
1dec0 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69  {....for (curr_i
1ded0 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52  d_type = CKO_CER
1dee0 54 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69  TIFICATE; curr_i
1def0 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52  d_type <= CKO_PR
1df00 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f  IVATE_KEY; curr_
1df10 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09  id_type++) {....
1df20 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1df30 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
1df40 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
1df50 69 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74  ibutes(curr_id_t
1df60 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74  ype, &pcsc_ident
1df70 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c  ities[cert_idx],
1df80 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1df90 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1dfa0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1dfb0 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
1dfc0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1dfd0 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  dentity = malloc
1dfe0 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74  (sizeof(*identit
1dff0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1e000 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  _identity));....
1e010 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
1e020 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1e030 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f  identity, &pcsc_
1e040 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1e050 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64  idx], sizeof(*id
1e060 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1e070 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
1e080 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
1e090 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1e0a0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
1e0b0 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  cate = malloc(pc
1e0c0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1e0d0 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1e0e0 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
1e0f0 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
1e100 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1e110 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
1e120 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
1e130 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
1e140 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f  rtificate, pcsc_
1e150 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1e160 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
1e170 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69  _len);......id_i
1e180 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  dx++;....}...}..
1e190 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78  ..if (include_ex
1e1a0 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  tra_certs) {....
1e1b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e1c0 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55  NTF("Including U
1e1d0 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72  S Government Cer
1e1e0 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72  tificates on har
1e1f0 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09  dware slot");...
1e200 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  ..cackey_read_do
1e210 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65  d_identities(ide
1e220 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78  ntities + id_idx
1e230 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1e240 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
1e250 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
1e260 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
1e270 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69  certs, 1);....*i
1e280 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69  ds_found = num_i
1e290 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64  ds;....return(id
1e2a0 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09  entities);..}...
1e2b0 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a  *ids_found = 0;.
1e2c0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d  .return(NULL);.}
1e2d0 0a 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  ..static cackey_
1e2e0 72 65 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 70  ret cackey_get_p
1e2f0 69 6e 28 63 68 61 72 20 2a 70 69 6e 62 75 66 29  in(char *pinbuf)
1e300 20 7b 0a 09 46 49 4c 45 20 2a 70 69 6e 66 64 3b   {..FILE *pinfd;
1e310 0a 09 63 68 61 72 20 2a 66 67 65 74 73 5f 72 65  ..char *fgets_re
1e320 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73 65 5f 72  t;..int pclose_r
1e330 65 74 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  et;...if (cackey
1e340 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
1e350 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
1e360 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
1e370 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66  ENERIC);..}...if
1e380 20 28 70 69 6e 62 75 66 20 3d 3d 20 4e 55 4c 4c   (pinbuf == NULL
1e390 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
1e3a0 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
1e3b0 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
1e3c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1e3d0 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1e3e0 44 20 3d 20 25 73 22 2c 20 63 61 63 6b 65 79 5f  D = %s", cackey_
1e3f0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09  pin_command);...
1e400 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e 28 63 61  pinfd = popen(ca
1e410 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1e420 2c 20 22 72 22 29 3b 0a 09 69 66 20 28 70 69 6e  , "r");..if (pin
1e430 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
1e440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e450 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a  NTF("Error.  %s:
1e460 20 55 6e 61 62 6c 65 20 74 6f 20 72 75 6e 22 2c   Unable to run",
1e470 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d   cackey_pin_comm
1e480 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  and);....return(
1e490 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
1e4a0 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 66 67 65 74  DPIN);..}...fget
1e4b0 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28 70 69  s_ret = fgets(pi
1e4c0 6e 62 75 66 2c 20 33 32 2c 20 70 69 6e 66 64 29  nbuf, 32, pinfd)
1e4d0 3b 0a 09 69 66 20 28 66 67 65 74 73 5f 72 65 74  ;..if (fgets_ret
1e4e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 69   == NULL) {...pi
1e4f0 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  nbuf[0] = '\0';.
1e500 09 7d 0a 0a 09 70 63 6c 6f 73 65 5f 72 65 74 20  .}...pclose_ret 
1e510 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66 64 29 3b  = pclose(pinfd);
1e520 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 74  ..if (pclose_ret
1e530 20 3d 3d 20 2d 31 20 26 26 20 65 72 72 6e 6f 20   == -1 && errno 
1e540 3d 3d 20 45 43 48 49 4c 44 29 20 7b 0a 09 09 43  == ECHILD) {...C
1e550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e560 54 46 28 22 4e 6f 74 69 63 65 2e 20 20 70 63 6c  TF("Notice.  pcl
1e570 6f 73 65 28 29 20 69 6e 64 69 63 61 74 65 64 20  ose() indicated 
1e580 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74  it could not get
1e590 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74   the status of t
1e5a0 68 65 20 63 68 69 6c 64 2c 20 61 73 73 75 6d 69  he child, assumi
1e5b0 6e 67 20 69 74 20 73 75 63 63 65 65 65 64 65 64  ng it succeeeded
1e5c0 20 21 22 29 3b 0a 0a 09 09 70 63 6c 6f 73 65 5f   !");....pclose_
1e5d0 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ret = 0;..}...if
1e5e0 20 28 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20   (pclose_ret != 
1e5f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1e600 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e610 72 2e 20 20 25 73 3a 20 65 78 69 74 65 64 20 77  r.  %s: exited w
1e620 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74 61  ith non-zero sta
1e630 74 75 73 20 6f 66 20 25 69 22 2c 20 63 61 63 6b  tus of %i", cack
1e640 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20  ey_pin_command, 
1e650 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a 0a 09 09  pclose_ret);....
1e660 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
1e670 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d  SC_E_BADPIN);..}
1e680 0a 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 70 69  ...if (strlen(pi
1e690 6e 62 75 66 29 20 3c 20 31 29 20 7b 0a 09 09 43  nbuf) < 1) {...C
1e6a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e6b0 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20  TF("Error.  %s: 
1e6c0 72 65 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 61  returned no data
1e6d0 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ", cackey_pin_co
1e6e0 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72  mmand);....retur
1e6f0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
1e700 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66  BADPIN);..}...if
1e710 20 28 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28   (pinbuf[strlen(
1e720 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 3d 20  pinbuf) - 1] == 
1e730 27 5c 6e 27 29 20 7b 0a 09 09 70 69 6e 62 75 66  '\n') {...pinbuf
1e740 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20  [strlen(pinbuf) 
1e750 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a  - 1] = '\0';..}.
1e760 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
1e770 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 43  PCSC_S_OK);.}..C
1e780 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1e790 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69  N(CK_RV, C_Initi
1e7a0 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
1e7b0 54 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a  TR pInitArgs) {.
1e7c0 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45  .CK_C_INITIALIZE
1e7d0 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67  _ARGS CK_PTR arg
1e7e0 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78  s;..uint32_t idx
1e7f0 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a  , highest_slot;.
1e800 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f  .int mutex_init_
1e810 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64  ret;..int includ
1e820 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43  e_dod_certs;...C
1e830 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e840 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e850 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
1e860 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e880 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
1e890 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
1e8a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e8b0 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
1e8c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1e8d0 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67  }...if (pInitArg
1e8e0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61  s != NULL) {...a
1e8f0 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b  rgs = pInitArgs;
1e900 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65  ...memcpy(&cacke
1e910 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69  y_args, args, si
1e920 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73  zeof(cackey_args
1e930 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ));....if (args-
1e940 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20  >CreateMutex == 
1e950 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
1e960 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55  stroyMutex == NU
1e970 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
1e980 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1e990 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
1e9a0 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex == NULL) {...
1e9b0 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
1e9c0 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  eMutex != NULL |
1e9d0 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
1e9e0 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  utex != NULL || 
1e9f0 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
1ea00 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1ea10 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  >UnlockMutex != 
1ea20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  NULL) {.....CACK
1ea30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ea40 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75  "Error. Some, bu
1ea50 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64  t not All thread
1ea60 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70  ing primitives p
1ea70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09  rovided.");.....
1ea80 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1ea90 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d  MENTS_BAD);....}
1eaa0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
1eab0 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  .cackey_args.Cre
1eac0 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ateMutex = NULL;
1ead0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44  ...cackey_args.D
1eae0 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55  estroyMutex = NU
1eaf0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1eb00 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  s.LockMutex = NU
1eb10 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1eb20 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20  s.UnlockMutex = 
1eb30 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1eb40 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09  rgs.flags = 0;..
1eb50 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
1eb60 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
1eb70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1eb80 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1eb90 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
1eba0 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
1ebb0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1ebc0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
1ebd0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1ebe0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1ebf0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1ec00 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ec10 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1ec20 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1ec30 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
1ec40 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1ec50 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
1ec60 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1ec70 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
1ec80 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
1ec90 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1eca0 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
1ecb0 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
1ecc0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1ecd0 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
1ece0 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  set = 0;...cacke
1ecf0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b  y_slots[idx].tok
1ed00 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09  en_flags = 0;...
1ed10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1ed20 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
1ed30 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1ed40 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30  dx].internal = 0
1ed50 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
1ed60 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
1ed70 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  TS..if (getenv("
1ed80 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52  CACKEY_EXTRA_CER
1ed90 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1eda0 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1edb0 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65  rts = 1;..} else
1edc0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1edd0 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23  _certs = 0;..}.#
1ede0 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76  else..if (getenv
1edf0 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52  ("CACKEY_NO_EXTR
1ee00 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c  A_CERTS") != NUL
1ee10 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  L) {...include_d
1ee20 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1ee30 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64   else {...includ
1ee40 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b  e_dod_certs = 1;
1ee50 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1ee60 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  (include_dod_cer
1ee70 74 73 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ts == 0) {...CAC
1ee80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ee90 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69  ("Asked not to i
1eea0 6e 63 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69  nclude DoD certi
1eeb0 66 69 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c  ficates");..} el
1eec0 73 65 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73  se {...highest_s
1eed0 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61  lot = (sizeof(ca
1eee0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1eef0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1ef00 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43  s[0])) - 1;....C
1ef10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ef20 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f  TF("Including Do
1ef30 44 20 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20  D certs in slot 
1ef40 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
1ef50 6c 6f 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c  long) highest_sl
1ef60 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ot);....cackey_s
1ef70 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1ef80 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  t].active = 1;..
1ef90 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1efa0 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65  ghest_slot].inte
1efb0 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b  rnal = 1;...cack
1efc0 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1efd0 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28  _slot].label = (
1efe0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1eff0 20 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20   "US Government 
1f000 43 65 72 74 69 66 69 63 61 74 65 73 22 3b 0a 09  Certificates";..
1f010 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1f020 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63  ghest_slot].pcsc
1f030 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43 4b 65  _reader = "CACKe
1f040 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  y";...cackey_slo
1f050 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1f060 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
1f070 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e  ;..}...cackey_in
1f080 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a  itialized = 1;..
1f090 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67  .if (!cackey_big
1f0a0 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d  lock_init) {...m
1f0b0 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20  utex_init_ret = 
1f0c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65  cackey_mutex_cre
1f0d0 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c  ate(&cackey_bigl
1f0e0 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74  ock);....if (mut
1f0f0 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30  ex_init_ret != 0
1f100 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1f110 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f120 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61  r.  Mutex initia
1f130 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e  lization failed.
1f140 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
1f150 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09  KR_CANT_LOCK);..
1f160 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67  .}....cackey_big
1f170 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09  lock_init = 1;..
1f180 7d 0a 0a 09 2f 2a 20 44 65 66 69 6e 65 20 61 20  }.../* Define a 
1f190 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f 6d 70  command to promp
1f1a0 74 20 75 73 65 72 20 66 6f 72 20 61 20 50 49 4e  t user for a PIN
1f1b0 20 2a 2f 0a 23 69 66 64 65 66 20 43 41 43 4b 45   */.#ifdef CACKE
1f1c0 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45  Y_PIN_COMMAND_DE
1f1d0 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f 70 69  FAULT..cackey_pi
1f1e0 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64  n_command = strd
1f1f0 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1f200 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1f210 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1f220 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69  DEFAULT));.#endi
1f230 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  f..#ifdef CACKEY
1f240 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1f250 4c 59 5f 44 45 46 41 55 4c 54 0a 09 69 66 20 28  LY_DEFAULT..if (
1f260 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22  getenv("DISPLAY"
1f270 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1f280 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1f290 64 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45  d = strdup(CACKE
1f2a0 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f  Y_MACRO_DEFAULT_
1f2b0 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f  XSTR(CACKEY_PIN_
1f2c0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45  COMMAND_XONLY_DE
1f2d0 46 41 55 4c 54 29 29 3b 0a 09 7d 0a 23 65 6e 64  FAULT));..}.#end
1f2e0 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  if...if (getenv(
1f2f0 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1f300 41 4e 44 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  AND") != NULL) {
1f310 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ...cackey_pin_co
1f320 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28 67  mmand = strdup(g
1f330 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1f340 4e 5f 43 4f 4d 4d 41 4e 44 22 29 29 3b 0a 09 7d  N_COMMAND"));..}
1f350 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1f360 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1f370 44 5f 58 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c  D_XONLY") != NUL
1f380 4c 20 26 26 20 67 65 74 65 6e 76 28 22 44 49 53  L && getenv("DIS
1f390 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20  PLAY") != NULL) 
1f3a0 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63  {...cackey_pin_c
1f3b0 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28  ommand = strdup(
1f3c0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1f3d0 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59  IN_COMMAND_XONLY
1f3e0 22 29 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  "));..}..#ifdef 
1f3f0 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49  CACKEY_READERS_I
1f400 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41  NCLUDE_ONLY_DEFA
1f410 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64  ULT..cackey_read
1f420 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1f430 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 59   = strdup(CACKEY
1f440 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58  _MACRO_DEFAULT_X
1f450 53 54 52 28 43 41 43 4b 45 59 5f 52 45 41 44 45  STR(CACKEY_READE
1f460 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f  RS_INCLUDE_ONLY_
1f470 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69  DEFAULT));.#endi
1f480 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  f..#ifdef CACKEY
1f490 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44 45  _READERS_EXCLUDE
1f4a0 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79  _DEFAULT..cackey
1f4b0 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
1f4c0 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 59   = strdup(CACKEY
1f4d0 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58  _MACRO_DEFAULT_X
1f4e0 53 54 52 28 43 41 43 4b 45 59 5f 52 45 41 44 45  STR(CACKEY_READE
1f4f0 52 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 55  RS_EXCLUDE_DEFAU
1f500 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 69  LT));.#endif...i
1f510 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1f520 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44  Y_READERS_INCLUD
1f530 45 5f 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c 4c  E_ONLY") != NULL
1f540 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61  ) {...cackey_rea
1f550 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
1f560 79 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e  y = strdup(geten
1f570 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52  v("CACKEY_READER
1f580 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 29  S_INCLUDE_ONLY")
1f590 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  );....if (cackey
1f5a0 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
1f5b0 5f 6f 6e 6c 79 5b 30 5d 20 3d 3d 20 27 5c 30 27  _only[0] == '\0'
1f5c0 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
1f5d0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1f5e0 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 63 61  de_only);.....ca
1f5f0 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1f600 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c  lude_only = NULL
1f610 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 67  ;...}..}...if (g
1f620 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45  etenv("CACKEY_RE
1f630 41 44 45 52 53 5f 45 58 43 4c 55 44 45 22 29 20  ADERS_EXCLUDE") 
1f640 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1f650 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1f660 75 64 65 20 3d 20 73 74 72 64 75 70 28 67 65 74  ude = strdup(get
1f670 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44  env("CACKEY_READ
1f680 45 52 53 5f 45 58 43 4c 55 44 45 22 29 29 3b 0a  ERS_EXCLUDE"));.
1f690 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65  ...if (cackey_re
1f6a0 61 64 65 72 73 5f 65 78 63 6c 75 64 65 5b 30 5d  aders_exclude[0]
1f6b0 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 66   == '\0') {....f
1f6c0 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65  ree(cackey_reade
1f6d0 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09  rs_exclude);....
1f6e0 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1f6f0 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a  exclude = NULL;.
1f700 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
1f710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1f720 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1f730 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1f740 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1f750 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1f760 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f770 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
1f780 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
1f790 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
1f7a0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1f7b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f7c0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
1f7d0 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
1f7e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f7f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
1f800 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
1f810 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1f820 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1f830 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1f840 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1f850 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1f860 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f870 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1f880 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1f890 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1f8a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f8b0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1f8c0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
1f8d0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1f8e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1f8f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1f900 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1f910 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1f920 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
1f930 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
1f940 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
1f950 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
1f960 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
1f970 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1f980 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
1f990 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1f9a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1f9b0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1f9c0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1f9d0 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61  ots[idx].interna
1f9e0 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  l) {....continue
1f9f0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
1fa00 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1fa10 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09  csc_reader) {...
1fa20 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
1fa30 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
1fa40 64 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  der);...}....if 
1fa50 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1fa60 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 29  x].cached_certs)
1fa70 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65   {....cackey_fre
1fa80 65 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f 73  e_certs(cackey_s
1fa90 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1faa0 5f 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f 73  _certs, cackey_s
1fab0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1fac0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29  _certs_count, 1)
1fad0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
1fae0 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63  ts[idx].cached_c
1faf0 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  erts = NULL;...}
1fb00 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73  ..}...cackey_pcs
1fb10 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a  c_disconnect();.
1fb20 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
1fb30 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
1fb40 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
1fb50 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a  y_pin_command);.
1fb60 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ...cackey_pin_co
1fb70 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  mmand = NULL;..}
1fb80 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65  ...if (cackey_re
1fb90 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1fba0 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ly != NULL) {...
1fbb0 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64  free(cackey_read
1fbc0 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1fbd0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 61  );....cackey_rea
1fbe0 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
1fbf0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69  y = NULL;..}...i
1fc00 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  f (cackey_reader
1fc10 73 5f 65 78 63 6c 75 64 65 20 21 3d 20 4e 55 4c  s_exclude != NUL
1fc20 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  L) {...free(cack
1fc30 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
1fc40 64 65 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72  de);....cackey_r
1fc50 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d  eaders_exclude =
1fc60 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b   NULL;..}...cack
1fc70 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
1fc80 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
1fc90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1fca0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1fcb0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1fcc0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1fcd0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1fce0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1fcf0 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54  Info)(CK_INFO_PT
1fd00 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
1fd10 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1fd20 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
1fd30 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
1fd40 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
1fd50 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79  UTF8CHAR library
1fd60 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1fd70 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b  "CACKey";...CACK
1fd80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fd90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1fda0 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1fdb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fdc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fdd0 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1fde0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fdf0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1fe00 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1fe10 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1fe20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fe30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fe40 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1fe50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fe60 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1fe70 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1fe80 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b  ..pInfo->cryptok
1fe90 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  iVersion.major =
1fea0 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
1feb0 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
1fec0 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
1fed0 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
1fee0 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1fef0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
1ff00 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
1ff10 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1ff20 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
1ff30 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
1ff40 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1ff50 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1ff60 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1ff70 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1ff80 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  , manufacturerID
1ff90 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63  , sizeof(manufac
1ffa0 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a  turerID) - 1);..
1ffb0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1ffc0 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0x00;...memset(p
1ffd0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
1ffe0 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
1fff0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62  izeof(pInfo->lib
20000 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29  raryDescription)
20010 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
20020 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
20030 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73  tion, libraryDes
20040 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66  cription, sizeof
20050 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  (libraryDescript
20060 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e  ion) - 1);...pIn
20070 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
20080 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
20090 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
200a0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
200b0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
200c0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
200d0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
200e0 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
200f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20100 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
20110 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
20120 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
20130 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
20140 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74  . * Process list
20150 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64   of readers, and
20160 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20   create mapping 
20170 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e  between reader n
20180 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a  ame and slot ID.
20190 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
201a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
201b0 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f  GetSlotList)(CK_
201c0 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65  BBOOL tokenPrese
201d0 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  nt, CK_SLOT_ID_P
201e0 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b  TR pSlotList, CK
201f0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
20200 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69  unt) {..static i
20210 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20  nt first_call = 
20220 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  1;..int mutex_re
20230 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f  tval;..int pcsc_
20240 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b  connect_ret;..CK
20250 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c  _ULONG count, sl
20260 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75  ot_count = 0, cu
20270 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78  rrslot, slot_idx
20280 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65  ;..char *pcsc_re
20290 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61  aders, *pcsc_rea
202a0 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65  ders_s, *pcsc_re
202b0 61 64 65 72 73 5f 65 3b 0a 09 63 68 61 72 20 2a  aders_e;..char *
202c0 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74  reader_check_pat
202d0 74 65 72 6e 3b 0a 09 44 57 4f 52 44 20 70 63 73  tern;..DWORD pcs
202e0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09  c_readers_len;..
202f0 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72  LONG scard_listr
20300 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a  eaders_ret;..siz
20310 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f  e_t curr_reader_
20320 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72  len;..int slot_r
20330 65 73 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c 75  eset;..int inclu
20340 64 65 5f 72 65 61 64 65 72 3b 0a 0a 09 43 41 43  de_reader;...CAC
20350 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20360 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20370 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
20380 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
20390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
203a0 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
203b0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
203c0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
203d0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
203e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
203f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20400 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20410 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20420 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20430 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20440 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20450 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
20460 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20470 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
20480 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20490 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
204a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
204b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
204c0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
204d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
204e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
204f0 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
20500 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
20510 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20   */..slot_reset 
20520 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c  = 0;..if (pSlotL
20530 69 73 74 29 20 7b 0a 09 09 69 66 20 28 66 69 72  ist) {...if (fir
20540 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69  st_call) {....fi
20550 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09  rst_call = 0;...
20560 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31  ..slot_reset = 1
20570 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61  ;...}..../* If a
20580 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 20  ny of the slots 
20590 68 61 76 65 20 62 65 65 6e 20 72 65 73 65 74 20  have been reset 
205a0 74 68 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 69  then purge all i
205b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
205c0 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09  heck again */...
205d0 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20  for (currslot = 
205e0 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  0; currslot < (s
205f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
20600 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
20610 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
20620 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
20630 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
20640 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
20650 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74  rnal) {.....cont
20660 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
20670 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
20680 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
20690 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  e) {.....continu
206a0 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
206b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
206c0 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65  rslot].slot_rese
206d0 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65  t) {.....slot_re
206e0 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72  set = 1;......br
206f0 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
20700 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29  .if (slot_reset)
20710 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
20720 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69  UG_PRINTF("Purgi
20730 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f  ng all slot info
20740 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09  rmation.");.....
20750 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
20760 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
20770 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
20780 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79  lly being supply
20790 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
207a0 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ation */....cack
207b0 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
207c0 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66  ect_all();.....f
207d0 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
207e0 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
207f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
20800 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
20810 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
20820 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
20830 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
20840 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
20850 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e  rnal) {......con
20860 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09  tinue;.....}....
20870 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
20880 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
20890 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09  c_reader) {.....
208a0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
208b0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
208c0 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09  c_reader);......
208d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
208e0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
208f0 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  der = NULL;.....
20900 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65  }......if (cacke
20910 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
20920 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 09  ].label) {......
20930 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
20940 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
20950 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79  l);.......cackey
20960 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
20970 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  .label = NULL;..
20980 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
20990 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
209a0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09  .active = 0;....
209b0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65  }...}..}.../* De
209c0 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20  termine list of 
209d0 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63  readers */..pcsc
209e0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
209f0 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
20a00 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  ct();..if (pcsc_
20a10 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
20a20 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
20a30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20a40 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
20a50 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61  tion to PC/SC fa
20a60 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e  iled, assuming n
20a70 6f 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74 73  o hardware slots
20a80 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
20a90 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
20aa0 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c   = 0;....scard_l
20ab0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
20ac0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
20ad0 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
20ae0 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  andle, NULL, NUL
20af0 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73  L, &pcsc_readers
20b00 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63  _len);....if (sc
20b10 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
20b20 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43  ret == SCARD_F_C
20b30 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09  OMM_ERROR) {....
20b40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20b50 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72  NTF("Error. SCar
20b60 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72  dListReaders() r
20b70 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f  eturned SCARD_F_
20b80 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75  COMM_ERROR, assu
20b90 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  ming Connection 
20ba0 74 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77  to PC/SC went aw
20bb0 61 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67  ay. Reconnecting
20bc0 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
20bd0 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
20be0 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
20bf0 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09  c_connect();....
20c00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20c10 49 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61  INTF("Trying SCa
20c20 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20  rdListReaders() 
20c30 61 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72  again");....scar
20c40 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20c50 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
20c60 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
20c70 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
20c80 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
20c90 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09  ers_len);...}...
20ca0 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
20cb0 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
20cc0 41 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26  ARD_S_SUCCESS &&
20cd0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
20ce0 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73  n != 0) {....pcs
20cf0 63 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c  c_readers = mall
20d00 6f 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f  oc(pcsc_readers_
20d10 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65  len);....pcsc_re
20d20 61 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72  aders_s = pcsc_r
20d30 65 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72  eaders;.....scar
20d40 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20d50 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
20d60 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
20d70 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
20d80 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70  pcsc_readers, &p
20d90 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
20da0 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c  ;....if (scard_l
20db0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
20dc0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
20dd0 53 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65  S) {.....pcsc_re
20de0 61 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72  aders_e = pcsc_r
20df0 65 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65  eaders + pcsc_re
20e00 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09  aders_len;......
20e10 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c  /* Start with Sl
20e20 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69  ot ID 1, to avoi
20e30 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f  d a bug in GDM o
20e40 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a  n RHEL */...../*
20e50 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74   Bug 594911: htt
20e60 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65  ps://bugzilla.re
20e70 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75  dhat.com/show_bu
20e80 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20  g.cgi?id=594911 
20e90 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20  */.....currslot 
20ea0 3d 20 31 3b 0a 09 09 09 09 77 68 69 6c 65 20 28  = 1;.....while (
20eb0 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70  pcsc_readers < p
20ec0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
20ed0 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65  ....../* Find ne
20ee0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  xt available slo
20ef0 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b  t */......for (;
20f00 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
20f10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
20f20 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
20f30 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
20f40 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09  rrslot++) {.....
20f50 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
20f60 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
20f70 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 62  tive) {........b
20f80 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09  reak;.......}...
20f90 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f  ...}.......curr_
20fa0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72  reader_len = str
20fb0 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73  len(pcsc_readers
20fc0 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63  );.......if ((pc
20fd0 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72  sc_readers + cur
20fe0 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20  r_reader_len) > 
20ff0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
21000 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  {.......break;..
21010 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
21020 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
21030 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72  == 0) {.......br
21040 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
21050 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e  ..if (currslot >
21060 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
21070 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
21080 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
21090 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  ))) {.......CACK
210a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
210b0 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64  "Found more read
210c0 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61  ers than slots a
210d0 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b  re available!");
210e0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
210f0 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b  ....}.......CACK
21100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21110 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25  "Found reader: %
21120 73 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 25 6c  s (currslot = %l
21130 75 29 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72  u)", pcsc_reader
21140 73 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s, (unsigned lon
21150 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09  g) currslot);...
21160 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72  ....if (cackey_r
21170 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f  eaders_include_o
21180 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nly != NULL) {..
21190 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
211a0 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20  G_PRINTF("Asked 
211b0 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20  to include only 
211c0 72 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e 67  readers matching
211d0 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72 65  : %s", cackey_re
211e0 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
211f0 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c  ly);........incl
21200 75 64 65 5f 72 65 61 64 65 72 20 3d 20 30 3b 0a  ude_reader = 0;.
21210 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65  ......reader_che
21220 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61 63  ck_pattern = cac
21230 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
21240 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09 7d  ude_only;......}
21250 20 65 6c 73 65 20 69 66 20 28 63 61 63 6b 65 79   else if (cackey
21260 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
21270 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
21280 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21290 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f 20  RINTF("Asked to 
212a0 65 78 63 6c 75 64 65 20 72 65 61 64 65 72 73 20  exclude readers 
212b0 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20 63  matching: %s", c
212c0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
212d0 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09 09 09 69  clude);........i
212e0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
212f0 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f  1;.......reader_
21300 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20  check_pattern = 
21310 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
21320 78 63 6c 75 64 65 3b 0a 09 09 09 09 09 7d 20 65  xclude;......} e
21330 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 6e 63 6c  lse {.......incl
21340 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a  ude_reader = 1;.
21350 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65  ......reader_che
21360 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c  ck_pattern = NUL
21370 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  L;......}.......
21380 69 66 20 28 72 65 61 64 65 72 5f 63 68 65 63 6b  if (reader_check
21390 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e 55 4c 4c  _pattern != NULL
213a0 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 74  ) {.......if (st
213b0 72 73 74 72 28 70 63 73 63 5f 72 65 61 64 65 72  rstr(pcsc_reader
213c0 73 2c 20 72 65 61 64 65 72 5f 63 68 65 63 6b 5f  s, reader_check_
213d0 70 61 74 74 65 72 6e 29 20 21 3d 20 4e 55 4c 4c  pattern) != NULL
213e0 29 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45  ) {........CACKE
213f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21400 54 68 69 73 20 72 65 61 64 65 72 20 6d 61 74 63  This reader matc
21410 68 65 64 20 74 68 65 20 70 61 74 74 65 72 6e 2e  hed the pattern.
21420 22 29 3b 0a 09 09 09 09 09 09 0a 09 09 09 09 09  ");.............
21430 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72  ..include_reader
21440 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72 65 61 64   = !include_read
21450 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  er;.......}.....
21460 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 69 6e 63  .}.......if (inc
21470 6c 75 64 65 5f 72 65 61 64 65 72 20 21 3d 20 31  lude_reader != 1
21480 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
21490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
214a0 6b 69 70 70 69 6e 67 20 74 68 69 73 20 72 65 61  kipping this rea
214b0 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09 09 09 70  der.");........p
214c0 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63  csc_readers += c
214d0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b  urr_reader_len +
214e0 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f 6e 74 69   1;........conti
214f0 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  nue;......}.....
21500 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65  ../* Only update
21510 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f   the list of slo
21520 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74  ts if we are act
21530 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65  ually being aske
21540 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  d supply the slo
21550 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
21560 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c  ......if (pSlotL
21570 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20  ist) {.......if 
21580 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  (slot_reset) {..
21590 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
215a0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
215b0 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09  ive = 1;........
215c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
215d0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20  rslot].internal 
215e0 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 0;........cack
215f0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
21600 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
21610 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61   strdup(pcsc_rea
21620 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61  ders);........ca
21630 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
21640 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63  lot].pcsc_card_c
21650 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09  onnected = 0;...
21660 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
21670 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e  s[currslot].tran
21680 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
21690 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
216a0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
216b0 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  .transaction_nee
216c0 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
216d0 09 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
216e0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
216f0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 09  NULL) {.........
21700 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
21710 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  rslot].token_fla
21720 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
21730 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 09  EQUIRED;........
21740 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
21750 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
21760 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  rrslot].token_fl
21770 61 67 73 20 3d 20 30 3b 0a 09 09 09 09 09 09 09  ags = 0;........
21780 7d 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  }........cackey_
21790 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
217a0 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  label = NULL;...
217b0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
217c0 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61  k_slot_reset(&ca
217d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
217e0 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09  lot]);.......}..
217f0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
21800 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
21810 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
21820 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09  ctive) {........
21830 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20  /* Artificially 
21840 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d  increase the num
21850 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c  ber of active sl
21860 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c  ots by what will
21870 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a   become active *
21880 2f 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  /........CACKEY_
21890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
218a0 75 6e 64 20 69 6e 2d 61 63 74 69 76 65 20 73 6c  und in-active sl
218b0 6f 74 20 25 6c 75 2c 20 62 75 74 20 69 74 20 77  ot %lu, but it w
218c0 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66  ill be active af
218d0 74 65 72 20 61 20 72 65 73 65 74 20 2d 2d 20 6d  ter a reset -- m
218e0 61 72 6b 69 6e 67 20 61 73 20 61 63 74 69 76 65  arking as active
218f0 20 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e 67 20   for accounting 
21900 70 75 72 70 6f 73 65 73 22 2c 20 28 75 6e 73 69  purposes", (unsi
21910 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73  gned long) currs
21920 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c  lot);.........sl
21930 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09  ot_count++;.....
21940 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 09  ..}......}......
21950 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09  currslot++;.....
21960 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
21970 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
21980 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09  n + 1;.....}....
21990 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
219a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
219b0 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f  ("Second call to
219c0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
219d0 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
219e0 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
219f0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
21a00 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
21a10 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
21a20 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
21a30 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
21a40 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65  );....}.....free
21a50 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29  (pcsc_readers_s)
21a60 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
21a70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21a80 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20  NTF("First call 
21a90 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
21aa0 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
21ab0 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
21ac0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
21ad0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
21ae0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
21af0 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
21b00 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
21b10 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 6f  et);...}..}...fo
21b20 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
21b30 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
21b40 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21b50 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
21b60 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
21b70 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66  rrslot++) {...if
21b80 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
21b90 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
21ba0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
21bb0 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
21bc0 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75   active slot %lu
21bd0 2c 20 72 65 61 64 65 72 20 3d 20 25 73 22 2c 20  , reader = %s", 
21be0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
21bf0 63 75 72 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79  currslot, cackey
21c00 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
21c10 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  .pcsc_reader);..
21c20 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
21c30 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
21c40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21c50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21c60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21c70 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21c80 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21c90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21ca0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
21cb0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
21cc0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21cd0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
21ce0 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20  f (pSlotList == 
21cf0 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
21d00 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt = slot_count
21d10 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
21d20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21d30 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e  ing CKR_OK (%i).
21d40 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64    Found %lu read
21d50 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f  ers, but not sto
21d60 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c  ring IDs (pSlotL
21d70 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43  ist == NULL)", C
21d80 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64  KR_OK, (unsigned
21d90 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e   long) slot_coun
21da0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
21db0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e  R_OK);..}...coun
21dc0 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09  t = *pulCount;..
21dd0 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74  if (count < slot
21de0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b  _count) {...CACK
21df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21e00 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c  "Error. User all
21e10 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69  ocated %lu entri
21e20 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20  es, but we have 
21e30 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63  %lu entries.", c
21e40 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74  ount, slot_count
21e50 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
21e60 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21e70 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f  ning CKR_BUFFER_
21e80 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09  TOO_SMALL");....
21e90 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
21ea0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09  R_TOO_SMALL);...
21eb0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
21ec0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
21ed0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21ee0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
21ef0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
21f00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21f10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
21f20 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
21f30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21f40 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
21f50 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20  .}...slot_idx = 
21f60 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  0;..for (currslo
21f70 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74  t = 0; (currslot
21f80 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
21f90 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21fa0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21fb0 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  ]))); currslot++
21fc0 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
21fd0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21fe0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63  ].active) {....c
21ff0 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
22000 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20  if (slot_idx >= 
22010 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
22020 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22030 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c  "Error. User all
22040 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69  ocated %lu entri
22050 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20  es, but we just 
22060 74 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74  tried to write t
22070 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20  o the %lu index 
22080 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f  -- ignoring", co
22090 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a  unt, slot_idx);.
220a0 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
220b0 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73  }....pSlotList[s
220c0 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73  lot_idx] = currs
220d0 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b  lot;...slot_idx+
220e0 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  +;..}...mutex_re
220f0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
22100 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
22110 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
22120 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
22130 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22140 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22150 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
22160 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22170 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22180 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75  ERROR);..}...*pu
22190 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
221a0 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  unt;...CACKEY_DE
221b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
221c0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
221d0 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65  ).  Found %lu re
221e0 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c  aders.", CKR_OK,
221f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
22200 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
22210 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
22220 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d  ..tokenPresent =
22230 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f   tokenPresent; /
22240 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
22250 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
22260 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  g */.}..CK_DEFIN
22270 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22280 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29  , C_GetSlotInfo)
22290 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
222a0 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f  ID, CK_SLOT_INFO
222b0 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
222c0 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
222d0 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  R slotDescriptio
222e0 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c  n[] = "CACKey Sl
222f0 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ot";..int mutex_
22300 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74  retval;..int byt
22310 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41  es_to_copy;...CA
22320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22330 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22340 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
22350 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
22360 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22370 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
22380 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22390 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
223a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
223b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
223c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
223d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
223e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
223f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22400 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22410 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22420 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
22430 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
22440 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
22450 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
22460 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
22470 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22480 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22490 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
224a0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
224b0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
224c0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
224d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
224e0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
224f0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
22500 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
22510 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
22520 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22530 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22540 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22550 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22560 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
22570 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22580 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22590 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
225a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
225b0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
225c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
225d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
225e0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
225f0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
22600 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
22610 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
22620 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
22630 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22640 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
22650 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
22660 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49  NVALID);..}...pI
22670 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
22680 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28  _HW_SLOT;...if (
22690 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  !cackey_slots[sl
226a0 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  otID].internal) 
226b0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
226c0 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c   |= CKF_REMOVABL
226d0 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69  E_DEVICE;..}...i
226e0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
226f0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
22700 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d  slots[slotID]) =
22710 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
22720 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
22730 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c  ..pInfo->flags |
22740 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53  = CKF_TOKEN_PRES
22750 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f  ENT;..}...bytes_
22760 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e  to_copy = strlen
22770 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
22780 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65  otID].pcsc_reade
22790 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28  r);..if (sizeof(
227a0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
227b0 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74  rerID) < bytes_t
227c0 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65  o_copy) {...byte
227d0 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65  s_to_copy = size
227e0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
227f0 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d  cturerID);..}..m
22800 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
22810 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63  ufacturerID, cac
22820 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22830 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62  ].pcsc_reader, b
22840 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a  ytes_to_copy);..
22850 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
22860 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22870 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22880 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
22890 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
228a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
228b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
228c0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
228d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
228e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
228f0 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
22900 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
22910 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
22920 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
22930 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
22940 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  py(pInfo->slotDe
22950 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44  scription, slotD
22960 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65  escription, size
22970 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69  of(slotDescripti
22980 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  on) - 1);...mems
22990 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
229a0 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
229b0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
229c0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a  ufacturerID));..
229d0 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
229e0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
229f0 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
22a00 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
22a10 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  ff;..pInfo->hard
22a20 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
22a30 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
22a40 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
22a50 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0xff;...pInfo->
22a60 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
22a70 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70  major = 0x00;..p
22a80 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
22a90 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78  rsion.minor = 0x
22aa0 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  00;...CACKEY_DEB
22ab0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22ac0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
22ad0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
22ae0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
22af0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22b00 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
22b10 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c  TokenInfo)(CK_SL
22b20 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
22b30 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20  _TOKEN_INFO_PTR 
22b40 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63  pInfo) {..static
22b50 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e   CK_UTF8CHAR man
22b60 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20  ufacturerID[] = 
22b70 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74  "U.S. Government
22b80 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
22b90 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61  F8CHAR defaultLa
22ba0 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e  bel[] = "Unknown
22bb0 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63   Token";..static
22bc0 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64   CK_UTF8CHAR mod
22bd0 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65  el[] = "CAC Toke
22be0 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  n";..struct cack
22bf0 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
22c00 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
22c10 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
22c20 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73  g num_certs;..ss
22c30 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b  ize_t label_ret;
22c40 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
22c50 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66  al;..int use_def
22c60 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41  ault_label;...CA
22c70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22c80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22c90 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
22ca0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
22cb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22cc0 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
22cd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22ce0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
22cf0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
22d00 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22d10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22d20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22d30 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22d40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22d50 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22d60 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22d70 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
22d80 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
22d90 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
22da0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
22db0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
22dc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22dd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22de0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
22df0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
22e00 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
22e10 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
22e20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22e30 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
22e40 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
22e50 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
22e60 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
22e70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22e80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22e90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22ea0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22eb0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
22ec0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22ed0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22ee0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
22ef0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
22f00 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
22f10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22f20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
22f30 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
22f40 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
22f50 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
22f60 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
22f70 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
22f80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22f90 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
22fa0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
22fb0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
22fc0 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
22fd0 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
22fe0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d  lots[slotID]) !=
22ff0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
23000 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
23010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23020 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69  INTF("No token i
23030 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f  s present in slo
23040 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74  tID = %lu", slot
23050 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
23060 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23070 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
23080 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
23090 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09  _NOT_PRESENT);..
230a0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
230b0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
230c0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
230d0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
230e0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
230f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23100 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23110 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
23120 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23130 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23140 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  R);..}.../* Dete
23150 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65  rmine token labe
23160 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61  l from certifica
23170 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70  tes */..memset(p
23180 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27  Info->label, ' '
23190 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
231a0 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65  label));..use_de
231b0 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b  fault_label = 1;
231c0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
231d0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
231e0 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70  l == NULL) {...p
231f0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d  csc_identities =
23200 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72   cackey_read_cer
23210 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ts(&cackey_slots
23220 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20  [slotID], NULL, 
23230 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69  &num_certs);...i
23240 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  f (pcsc_identiti
23250 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
23260 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e  .if (num_certs >
23270 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f   0) {.....label_
23280 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73  ret = cackey_pcs
23290 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61  c_identity_to_la
232a0 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74  bel(pcsc_identit
232b0 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65  ies, pInfo->labe
232c0 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
232d0 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66  >label));.....if
232e0 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29   (label_ret > 0)
232f0 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61   {......use_defa
23300 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a  ult_label = 0;..
23310 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
23320 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
23330 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
23340 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
23350 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ......memcpy(cac
23360 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
23370 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e  ].label, pInfo->
23380 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49  label, sizeof(pI
23390 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09  nfo->label));...
233a0 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
233b0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
233c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
233d0 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09  num_certs, 1);..
233e0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  .}..} else {...m
233f0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62  emcpy(pInfo->lab
23400 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  el, cackey_slots
23410 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20  [slotID].label, 
23420 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
23430 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65  bel));....use_de
23440 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b  fault_label = 0;
23450 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65  ..}...if (use_de
23460 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09  fault_label) {..
23470 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
23480 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62  abel, defaultLab
23490 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75  el, sizeof(defau
234a0 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09  ltLabel) - 1);..
234b0 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  }...memset(pInfo
234c0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
234d0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
234e0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
234f0 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  rID));..memcpy(p
23500 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
23510 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72  erID, manufactur
23520 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e  erID, sizeof(man
23530 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31  ufacturerID) - 1
23540 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  );...memset(pInf
23550 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73  o->model, ' ', s
23560 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64  izeof(pInfo->mod
23570 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  el));..memcpy(pI
23580 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65  nfo->model, mode
23590 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29  l, sizeof(model)
235a0 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
235b0 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
235c0 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ber, ' ', sizeof
235d0 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
235e0 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74  mber));...memset
235f0 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c  (pInfo->utcTime,
23600 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
23610 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a  fo->utcTime));..
23620 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
23630 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
23640 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
23650 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
23660 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  ff;..pInfo->hard
23670 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
23680 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
23690 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
236a0 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0xff;...pInfo->
236b0 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
236c0 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70  major = 0x00;..p
236d0 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
236e0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78  rsion.minor = 0x
236f0 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  00;...pInfo->fla
23700 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50  gs = CKF_WRITE_P
23710 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55  ROTECTED | CKF_U
23720 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49  SER_PIN_INITIALI
23730 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f  ZED | CKF_TOKEN_
23740 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61  INITIALIZED | ca
23750 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23760 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a  D].token_flags;.
23770 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
23780 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
23790 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
237a0 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43  gs |= CKF_PROTEC
237b0 54 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49  TED_AUTHENTICATI
237c0 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49  ON_PATH;..}...pI
237d0 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f  nfo->ulMaxSessio
237e0 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66  nCount = (sizeof
237f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23800 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
23810 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20  y_sessions[0])) 
23820 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53  - 1;..pInfo->ulS
23830 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
23840 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
23850 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
23860 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e  ->ulMaxRwSession
23870 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66  Count = 0;..pInf
23880 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f  o->ulRwSessionCo
23890 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
238a0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
238b0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50  ;..pInfo->ulMaxP
238c0 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49  inLen = 128;..pI
238d0 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e  nfo->ulMinPinLen
238e0 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   = 0;..pInfo->ul
238f0 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72  TotalPublicMemor
23900 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
23910 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
23920 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75  .pInfo->ulFreePu
23930 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
23940 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
23950 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
23960 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d  >ulTotalPrivateM
23970 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
23980 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
23990 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72  ON;..pInfo->ulFr
239a0 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  eePrivateMemory 
239b0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
239c0 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09  _INFORMATION;...
239d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
239e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
239f0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
23a00 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
23a10 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
23a20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23a30 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c  _RV, C_WaitForSl
23a40 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47  otEvent)(CK_FLAG
23a50 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54  S flags, CK_SLOT
23a60 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c  _ID_PTR pSlotID,
23a70 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65   CK_VOID_PTR pRe
23a80 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45  served) {..CACKE
23a90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23aa0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23ab0 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
23ac0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
23ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23ae0 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
23af0 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
23b00 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
23b10 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
23b20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23b30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23b40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23b50 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23b60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23b70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23b80 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
23b90 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  LIZED);..}.../* 
23ba0 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65  XXX: TODO: Imple
23bb0 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a  ment this... */.
23bc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23bd0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23be0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23bf0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
23c00 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
23c10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
23c20 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
23c30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23c40 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
23c50 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23c60 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  , C_GetMechanism
23c70 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  List)(CK_SLOT_ID
23c80 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48   slotID, CK_MECH
23c90 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70  ANISM_TYPE_PTR p
23ca0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43  MechanismList, C
23cb0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43  K_ULONG_PTR pulC
23cc0 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
23cd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23ce0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23cf0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23d00 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23d10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23d20 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23d30 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23d40 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23d50 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23d60 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f  ;..}...if (pulCo
23d70 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
23d80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23d90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75  INTF("Error.  pu
23da0 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22  lCount is NULL."
23db0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23dc0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
23dd0 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
23de0 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  nismList == NULL
23df0 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20  ) {...*pulCount 
23e00 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  = 1;....CACKEY_D
23e10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23e20 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
23e30 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
23e40 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
23e50 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f  ..}...if (*pulCo
23e60 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43  unt < 1) {...CAC
23e70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23e80 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72  ("Error.  Buffer
23e90 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a   too small.");..
23ea0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46  ..return(CKR_BUF
23eb0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a  FER_TOO_SMALL);.
23ec0 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c  .}...pMechanismL
23ed0 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41  ist[0] = CKM_RSA
23ee0 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e  _PKCS;..*pulCoun
23ef0 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 1;...CACKEY_
23f00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23f10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
23f20 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
23f30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
23f40 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
23f50 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
23f60 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
23f70 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
23f80 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
23f90 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f  M_TYPE type, CK_
23fa0 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50  MECHANISM_INFO_P
23fb0 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74  TR pInfo) {..int
23fc0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
23fd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23fe0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
23ff0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
24000 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
24010 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24020 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
24030 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
24040 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
24050 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
24060 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24070 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24090 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
240a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
240b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
240c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
240d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
240e0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
240f0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
24100 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
24110 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
24120 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
24130 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24140 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
24150 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
24160 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
24170 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
24180 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
24190 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
241a0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
241b0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
241c0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
241d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
241e0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
241f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
24200 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24210 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
24220 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
24230 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24240 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
24250 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
24260 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
24270 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24280 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24290 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
242a0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
242b0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
242c0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
242d0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
242e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
242f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
24300 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
24310 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
24320 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
24330 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24340 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24350 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
24360 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
24370 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24380 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
24390 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
243a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
243b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
243c0 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79  ..}...switch (ty
243d0 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  pe) {...case CKM
243e0 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49  _RSA_PKCS:....pI
243f0 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a  nfo->ulMinKeySiz
24400 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66  e = 512;....pInf
24410 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20  o->ulMaxKeySize 
24420 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f  = 8192;....pInfo
24430 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
24440 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c   | CKF_ENCRYPT |
24450 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43   CKF_DECRYPT | C
24460 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45  KF_SIGN | CKF_VE
24470 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  RIFY;....break;.
24480 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24490 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
244a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
244b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
244c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
244d0 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
244e0 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
244f0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
24500 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24510 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c  InitToken)(CK_SL
24520 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
24530 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
24540 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
24550 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48  inLen, CK_UTF8CH
24560 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b  AR_PTR pLabel) {
24570 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24580 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24590 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
245a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
245b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
245c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
245d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
245e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
245f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24600 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24620 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24630 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
24640 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20  ROTECTED (%i)", 
24650 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
24660 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65  PROTECTED);...re
24670 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57  turn(CKR_TOKEN_W
24680 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
24690 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
246a0 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
246b0 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
246c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
246d0 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f  , C_InitPIN)(CK_
246e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
246f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
24700 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
24710 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
24720 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
24730 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24740 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
24750 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
24760 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24770 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24780 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
24790 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
247a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
247b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
247c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
247d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
247e0 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
247f0 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
24800 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
24810 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
24820 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
24830 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
24840 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
24850 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24860 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
24870 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24880 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
24890 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
248a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
248b0 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
248c0 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
248d0 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
248e0 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20 6f 6c 64  Len) {..char old
248f0 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e 65 77 70  pinbuf[64], newp
24900 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63 61 63 6b  inbuf[64];..cack
24910 65 79 5f 72 65 74 20 73 65 74 5f 70 69 6e 5f 72  ey_ret set_pin_r
24920 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b  et, get_pin_ret;
24930 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
24940 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
24950 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
24960 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
24970 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
24980 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
24990 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
249a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
249b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
249c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
249d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
249e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
249f0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
24a00 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
24a10 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
24a20 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
24a30 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
24a40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24a50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24a60 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
24a70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24a80 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
24a90 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
24aa0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24ab0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
24ac0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
24ad0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24ae0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
24af0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24b00 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
24b10 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
24b20 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24b30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
24b40 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
24b50 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
24b60 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24b70 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
24b80 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
24b90 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
24ba0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
24bb0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
24bc0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
24bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24be0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
24bf0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
24c00 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
24c10 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
24c20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
24c30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24c40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24c50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
24c60 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
24c70 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
24c80 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
24c90 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
24ca0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24cb0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
24cc0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
24cd0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
24ce0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
24cf0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
24d00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24d10 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24d20 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
24d30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24d40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
24d50 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
24d60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 47  = NULL) {.../* G
24d70 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f 0a 09 09  et old PIN */...
24d80 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61  get_pin_ret = ca
24d90 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6f 6c 64  ckey_get_pin(old
24da0 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28  pinbuf);....if (
24db0 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  get_pin_ret != C
24dc0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
24dd0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
24de0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24df0 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4f   while getting O
24e00 6c 64 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e  ld PIN, returnin
24e10 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  g CKR_PIN_INCORR
24e20 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ECT.");.....cack
24e30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24e40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24e50 0a 09 09 09 0a 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
24e60 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
24e70 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c 64 50 69  );...}....pOldPi
24e80 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
24e90 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62 75 66 3b  _PTR) oldpinbuf;
24ea0 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d  ...ulOldPinLen =
24eb0 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69 6e 62 75   strlen(oldpinbu
24ec0 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74 20 6e 65  f);..../* Get ne
24ed0 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70  w PIN */...get_p
24ee0 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  in_ret = cackey_
24ef0 67 65 74 5f 70 69 6e 28 6e 65 77 70 69 6e 62 75  get_pin(newpinbu
24f00 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70  f);....if (get_p
24f10 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
24f20 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
24f30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24f40 49 4e 54 46 28 22 45 72 72 6f 72 20 77 68 69 6c  INTF("Error whil
24f50 65 20 67 65 74 74 69 6e 67 20 4e 65 77 20 50 49  e getting New PI
24f60 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 52  N, returning CKR
24f70 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e 22 29 3b  _PIN_INVALID.");
24f80 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
24f90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
24fa0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09 09  biglock);.......
24fb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
24fc0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d 0a 0a 09  INVALID);...}...
24fd0 09 70 4e 65 77 50 69 6e 20 3d 20 28 43 4b 5f 55  .pNewPin = (CK_U
24fe0 54 46 38 43 48 41 52 5f 50 54 52 29 20 6e 65 77  TF8CHAR_PTR) new
24ff0 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e 65 77 50  pinbuf;...ulNewP
25000 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  inLen = strlen(n
25010 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  ewpinbuf);..}...
25020 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d 3d 20 4e  if (pOldPin == N
25030 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
25040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c  DEBUG_PRINTF("Ol
25050 64 20 50 49 4e 20 76 61 6c 75 65 20 69 73 20 77  d PIN value is w
25060 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22 29 3b 0a  rong (null).");.
25070 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
25080 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25090 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
250a0 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
250b0 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  ECT);..}...if (u
250c0 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d 20 30 20  lOldPinLen == 0 
250d0 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3e  || ulOldPinLen >
250e0 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   8) {...CACKEY_D
250f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c 64  EBUG_PRINTF("Old
25100 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77   PIN length is w
25110 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20 28 75 6e  rong: %lu.", (un
25120 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 4f  signed long) ulO
25130 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61  ldPinLen);....ca
25140 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25150 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25160 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25170 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
25180 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65 77 50 69  ..}...if (pNewPi
25190 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
251a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
251b0 54 46 28 22 4e 65 77 20 50 49 4e 20 76 61 6c 75  TF("New PIN valu
251c0 65 20 69 73 20 77 72 6f 6e 67 20 28 65 69 74 68  e is wrong (eith
251d0 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74 6f 6f 20  er NULL, or too 
251e0 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22 29 3b 0a  long/short).");.
251f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
25200 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25210 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
25220 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49  n(CKR_PIN_INVALI
25230 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4e  D);..}...if (ulN
25240 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20 7c 7c 20  ewPinLen < 5 || 
25250 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e 20 38 29  ulNewPinLen > 8)
25260 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25270 47 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49  G_PRINTF("New PI
25280 4e 20 6c 65 6e 67 74 68 20 69 73 20 77 72 6f 6e  N length is wron
25290 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20  g: %lu, must be 
252a0 61 74 6c 65 61 73 74 20 35 20 61 6e 64 20 6e 6f  atleast 5 and no
252b0 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e 22 2c 20   more than 8.", 
252c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
252d0 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulNewPinLen);...
252e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
252f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25300 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
25310 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52 41 4e 47  CKR_PIN_LEN_RANG
25320 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f 70 69 6e  E);..}...set_pin
25330 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
25340 74 5f 70 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c  t_pin(&cackey_sl
25350 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 4f 6c  ots[slotID], pOl
25360 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69 6e 4c 65  dPin, ulOldPinLe
25370 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75 6c 4e 65  n, pNewPin, ulNe
25380 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69 66 20 28  wPinLen);...if (
25390 73 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  set_pin_ret != C
253a0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
253b0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
253c0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
253d0 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  ULL) {....cackey
253e0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
253f0 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
25400 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
25410 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 74  ;...}....if (set
25420 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  _pin_ret == CACK
25430 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
25440 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  ) {....cackey_sl
25450 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
25460 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
25470 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a  SER_PIN_LOCKED;.
25480 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
25490 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
254a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
254b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
254c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
254d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
254e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
254f0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
25500 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
25510 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
25520 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
25530 69 74 63 68 20 28 73 65 74 5f 70 69 6e 5f 72 65  itch (set_pin_re
25540 74 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  t) {...case CACK
25550 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a 0a 09 09  EY_PCSC_S_OK:...
25560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25570 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
25580 6c 79 20 73 65 74 20 50 49 4e 2e 22 29 3b 0a 0a  ly set PIN.");..
25590 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
255a0 29 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  );...case CACKEY
255b0 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 3a 0a  _PCSC_E_BADPIN:.
255c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
255d0 50 52 49 4e 54 46 28 22 50 49 4e 20 77 61 73 20  PRINTF("PIN was 
255e0 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a 09 09 09  invalid.");.....
255f0 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
25600 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61 73 65 20  NVALID);...case 
25610 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
25620 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b 45 59 5f  CKED:....CACKEY_
25630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
25640 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72  ken is locked or
25650 20 74 68 69 73 20 63 68 61 6e 67 65 20 69 73 20   this change is 
25660 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 22 29  not permitted.")
25670 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
25680 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  _PIN_LOCKED);...
25690 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b  default:....CACK
256a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
256b0 22 53 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 20  "Something else 
256c0 77 65 6e 74 20 77 72 6f 6e 67 20 63 68 61 6e 67  went wrong chang
256d0 69 6e 67 20 74 68 65 20 50 49 4e 3a 20 25 69 22  ing the PIN: %i"
256e0 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74 29 3b 0a  , set_pin_ret);.
256f0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
25700 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
25710 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  }...return(CKR_G
25720 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 7d  ENERAL_ERROR);.}
25730 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25740 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70  TION(CK_RV, C_Op
25750 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c  enSession)(CK_SL
25760 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
25770 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
25780 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
25790 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46  cation, CK_NOTIF
257a0 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53  Y notify, CK_SES
257b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20  SION_HANDLE_PTR 
257c0 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e  phSession) {..un
257d0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b  signed long idx;
257e0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
257f0 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73  al;..int found_s
25800 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41  ession = 0;...CA
25810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25820 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25830 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46  if ((flags & CKF
25840 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29  _SERIAL_SESSION)
25850 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53   != CKF_SERIAL_S
25860 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75  ESSION) {...retu
25870 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50  rn(CKR_SESSION_P
25880 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50  ARALLEL_NOT_SUPP
25890 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  ORTED);..}...if 
258a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
258b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
258c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
258d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
258e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
258f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
25900 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
25910 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
25920 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
25930 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
25940 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
25950 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
25960 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
25970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25980 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
25990 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
259a0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
259b0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
259c0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
259d0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
259e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
259f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25a00 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
25a10 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25a20 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25a30 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
25a40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25a50 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
25a60 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
25a70 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
25a80 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
25a90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
25aa0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
25ab0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25ac0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25ad0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
25ae0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
25af0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
25b00 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
25b10 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
25b20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25b30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25b40 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
25b50 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
25b60 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
25b70 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61 63  t the card is ac
25b80 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c  tually in the sl
25b90 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20  ot. */../* XXX: 
25ba0 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
25bb0 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74 68  re this is in th
25bc0 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69 66  e PKCS#11 specif
25bd0 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  ication */..if (
25be0 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
25bf0 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
25c00 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43  ts[slotID]) != C
25c10 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
25c20 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43  ENPRESENT) {...C
25c30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25c40 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64  TF("Error.  Card
25c50 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52   not present.  R
25c60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56  eturning CKR_DEV
25c70 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a  ICE_REMOVED");..
25c80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25c90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25ca0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
25cb0 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f  (CKR_DEVICE_REMO
25cc0 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  VED);..}...for (
25cd0 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28  idx = 1; idx < (
25ce0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
25cf0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
25d00 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25d10 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
25d20 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
25d30 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
25d40 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73  ve) {....found_s
25d50 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09  ession = 1;.....
25d60 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78  *phSession = idx
25d70 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
25d80 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
25d90 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79  e = 1;....cackey
25da0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
25db0 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a  lotID = slotID;.
25dc0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
25dd0 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20  ns[idx].state = 
25de0 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
25df0 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79  SSION;....cackey
25e00 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66  _sessions[idx].f
25e10 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09  lags = flags;...
25e20 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25e30 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72  [idx].ulDeviceEr
25e40 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  ror = 0;....cack
25e50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
25e60 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20  .pApplication = 
25e70 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09  pApplication;...
25e80 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25e90 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e  [idx].Notify = n
25ea0 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65  otify;.....cacke
25eb0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
25ec0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
25ed0 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  L;....cackey_ses
25ee0 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
25ef0 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
25f00 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
25f10 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68  ions[idx].search
25f20 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
25f30 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25f40 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76  [idx].sign_activ
25f50 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
25f60 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
25f70 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
25f80 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
25f90 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
25fa0 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
25fb0 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
25fc0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
25fd0 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f  lotID], &cackey_
25fe0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
25ff0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
26000 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
26010 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
26020 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26030 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26040 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
26050 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
26060 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26070 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26080 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
26090 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
260a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
260b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
260c0 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b  found_session) {
260d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
260e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
260f0 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  g CKR_SESSION_CO
26100 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53  UNT (%i)", CKR_S
26110 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a  ESSION_COUNT);..
26120 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
26130 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a  SION_COUNT);..}.
26140 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26150 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
26160 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
26170 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
26180 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
26190 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
261a0 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65  CK_RV, C_CloseSe
261b0 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ssion)(CK_SESSIO
261c0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
261d0 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
261e0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
261f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
26200 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
26210 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
26220 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
26230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26240 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26250 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26260 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26270 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26280 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
26290 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
262a0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
262b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
262c0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
262d0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
262e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
262f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26300 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
26310 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
26320 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
26330 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
26340 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
26350 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
26360 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
26370 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
26380 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
26390 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
263a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
263b0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
263c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
263d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
263e0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
263f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26400 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
26410 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
26420 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26430 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
26440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26450 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
26460 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
26470 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26480 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26490 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
264a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
264b0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20  Session].active 
264c0 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65  = 0;..cackey_fre
264d0 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
264e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
264f0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
26500 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
26510 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
26520 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
26530 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
26540 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
26550 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26560 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
26570 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
26580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26590 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
265a0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
265b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
265c0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
265d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
265e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
265f0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
26600 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
26610 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
26620 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26630 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
26640 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28  oseAllSessions)(
26650 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
26660 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  D) {..uint32_t i
26670 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
26680 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
26690 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
266a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
266b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
266c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
266d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
266e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
266f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
26700 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
26710 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26720 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
26730 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
26740 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
26750 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
26760 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
26770 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
26780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26790 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
267a0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
267b0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
267c0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
267d0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
267e0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
267f0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
26800 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
26810 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
26820 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
26830 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
26840 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
26850 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26860 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
26870 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
26880 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26890 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
268a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
268b0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
268c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
268d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
268e0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
268f0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
26900 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
26910 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
26920 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
26930 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26940 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
26950 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
26960 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
26970 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
26980 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
26990 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
269a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
269b0 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
269c0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
269d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
269e0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66  .active) {....if
269f0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
26a00 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d  s[idx].slotID !=
26a10 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63   slotID) {.....c
26a20 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
26a30 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26a40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26a50 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73  lock);....C_Clos
26a60 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
26a70 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  ..cackey_mutex_l
26a80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26a90 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  ck);...}..}...mu
26aa0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
26ab0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26ac0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26ad0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
26ae0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
26af0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26b00 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
26b10 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
26b20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26b30 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26b40 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26b50 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26b60 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
26b70 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
26b80 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
26b90 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
26ba0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73  (CK_RV, C_GetSes
26bb0 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53  sionInfo)(CK_SES
26bc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26bd0 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e  sion, CK_SESSION
26be0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
26bf0 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
26c00 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
26c10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26c20 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
26c30 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
26c40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26c50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
26c60 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
26c70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
26c80 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
26c90 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
26ca0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
26cb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26cc0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26cd0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
26ce0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
26cf0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
26d00 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
26d10 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
26d20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
26d30 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
26d40 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
26d50 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26d60 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
26d70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26d80 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
26d90 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
26da0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26db0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26dc0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
26dd0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
26de0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
26df0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26e00 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
26e10 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
26e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26e30 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
26e40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
26e50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
26e60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
26e70 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
26e80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
26e90 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
26ea0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26eb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26ec0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26ed0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26ee0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
26ef0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
26f00 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
26f10 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
26f20 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74  .}...pInfo->slot
26f30 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
26f40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
26f50 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73  lotID;..pInfo->s
26f60 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65  tate = cackey_se
26f70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26f80 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e  .state;..pInfo->
26f90 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73  flags = cackey_s
26fa0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26fb0 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d  ].flags;..pInfo-
26fc0 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  >ulDeviceError =
26fd0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
26fe0 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76  [hSession].ulDev
26ff0 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65  iceError;...mute
27000 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
27010 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27020 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27030 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27040 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27060 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
27070 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27080 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27090 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
270a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
270b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
270c0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
270d0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
270e0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
270f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
27100 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61  K_RV, C_GetOpera
27110 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
27120 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27130 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
27140 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
27150 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  te, CK_ULONG_PTR
27160 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61   pulOperationSta
27170 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  teLen) {..CACKEY
27180 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27190 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
271a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
271b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
271c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
271d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
271e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
271f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27200 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27210 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
27220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27230 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
27240 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27250 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
27260 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27270 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
27280 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27290 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
272a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
272b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70  N(CK_RV, C_SetOp
272c0 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
272d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
272e0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
272f0 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
27300 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  State, CK_ULONG 
27310 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
27320 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Len, CK_OBJECT_H
27330 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f  ANDLE hEncryptio
27340 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nKey, CK_OBJECT_
27350 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69  HANDLE hAuthenti
27360 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41  cationKey) {..CA
27370 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27380 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27390 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
273a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
273b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
273c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
273d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
273e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
273f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27400 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
27410 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27420 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
27430 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27440 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
27450 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27460 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
27470 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
27480 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
27490 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
274a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
274b0 6f 67 69 6e 4d 75 74 65 78 41 72 67 29 28 43 4b  oginMutexArg)(CK
274c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
274d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45  hSession, CK_USE
274e0 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c  R_TYPE userType,
274f0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
27500 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
27510 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f  ulPinLen, int lo
27520 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43 4b 5f  ck_mutex) {..CK_
27530 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
27540 09 63 61 63 6b 65 79 5f 72 65 74 20 67 65 74 5f  .cackey_ret get_
27550 70 69 6e 5f 72 65 74 3b 0a 09 63 68 61 72 20 70  pin_ret;..char p
27560 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 69 6e 74 20  inbuf[64];..int 
27570 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
27580 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  nt tries_remaini
27590 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72  ng;..int login_r
275a0 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
275b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
275c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
275d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
275e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
275f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27600 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
27610 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27620 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
27630 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27640 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
27650 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
27660 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
27670 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
27680 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27690 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
276a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
276b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
276c0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
276d0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
276e0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
276f0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
27700 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70  .}...if (userTyp
27710 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b  e != CKU_USER) {
27720 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27730 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27740 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
27750 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64  USER mode, asked
27760 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c   for %lu mode.",
27770 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
27780 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65   userType)....re
27790 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59  turn(CKR_USER_TY
277a0 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  PE_INVALID);..}.
277b0 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
277c0 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76  ) {...mutex_retv
277d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
277e0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
277f0 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75  glock);...if (mu
27800 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
27810 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
27820 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27830 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
27840 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
27850 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
27860 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  OR);...}..}...if
27870 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
27880 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
27890 69 76 65 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63  ive) {...if (loc
278a0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
278b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
278c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
278d0 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
278e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
278f0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
27900 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
27910 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
27920 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
27930 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
27940 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
27950 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
27960 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
27970 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
27980 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
27990 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
279a0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
279b0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
279c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
279d0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
279e0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
279f0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
27a00 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
27a10 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f  otID);....if (lo
27a20 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
27a30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27a40 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27a50 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  k);...}....retur
27a60 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27a70 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
27a80 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
27a90 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
27aa0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27ab0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27ac0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
27ad0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
27ae0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
27af0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
27b00 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f  D);....if (lock_
27b10 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b  mutex) {....cack
27b20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27b30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27b40 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43  ...}....return(C
27b50 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27b60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
27b70 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
27b80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
27b90 70 50 69 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pPin != NULL) {.
27ba0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27bb0 50 52 49 4e 54 46 28 22 50 72 6f 74 65 63 74 65  PRINTF("Protecte
27bc0 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  d authentication
27bd0 20 70 61 74 68 20 69 6e 20 65 66 66 65 63 74 20   path in effect 
27be0 61 6e 64 20 50 49 4e 20 70 72 6f 76 69 64 65 64  and PIN provided
27bf0 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09 09 67 65   !?");...}....ge
27c00 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  t_pin_ret = cack
27c10 65 79 5f 67 65 74 5f 70 69 6e 28 70 69 6e 62 75  ey_get_pin(pinbu
27c20 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70  f);....if (get_p
27c30 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
27c40 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
27c50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27c60 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 67 65 74  INTF("cackey_get
27c70 5f 70 69 6e 28 29 20 72 65 74 75 72 6e 65 64 20  _pin() returned 
27c80 69 6e 20 66 61 69 6c 75 72 65 2c 20 61 73 73 75  in failure, assu
27c90 6d 69 6e 67 20 74 68 65 20 50 49 4e 20 77 61 73  ming the PIN was
27ca0 20 69 6e 63 6f 72 72 65 63 74 2e 22 29 3b 0a 0a   incorrect.");..
27cb0 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
27cc0 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  x) {.....cackey_
27cd0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
27ce0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
27cf0 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  .}.....return(CK
27d00 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
27d10 3b 0a 09 09 7d 0a 0a 09 09 70 50 69 6e 20 3d 20  ;...}....pPin = 
27d20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52  (CK_UTF8CHAR_PTR
27d30 29 20 70 69 6e 62 75 66 3b 0a 09 09 75 6c 50 69  ) pinbuf;...ulPi
27d40 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 69  nLen = strlen(pi
27d50 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  nbuf);..}...logi
27d60 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
27d70 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
27d80 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e  ts[slotID], pPin
27d90 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69  , ulPinLen, &tri
27da0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 2c 20 33 29  es_remaining, 3)
27db0 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ;..if (login_ret
27dc0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
27dd0 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 6c 6f  S_OK) {...if (lo
27de0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
27df0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27e00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27e10 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6c  k);...}....if (l
27e20 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
27e30 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
27e40 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
27e50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27e60 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
27e70 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ked.");.....cack
27e80 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
27e90 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
27ea0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
27eb0 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  KED;.....CACKEY_
27ec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27ed0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f  turning CKR_PIN_
27ee0 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c 20 28 69  LOCKED (%i)", (i
27ef0 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  nt) CKR_PIN_LOCK
27f00 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ED);.....return(
27f10 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
27f20 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
27f30 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
27f40 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
27f50 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
27f60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27f70 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
27f80 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
27f90 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
27fa0 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
27fb0 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
27fc0 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  W;.....if (tries
27fd0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29  _remaining == 1)
27fe0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
27ff0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
28000 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
28010 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52  SER_PIN_FINAL_TR
28020 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  Y;....}.....CACK
28030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28040 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50  "Returning CKR_P
28050 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25 69  IN_INCORRECT (%i
28060 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49  )", (int) CKR_PI
28070 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09  N_INCORRECT);...
28080 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e  ..return(CKR_PIN
28090 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d  _INCORRECT);...}
280a0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
280b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
280c0 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72   Unknown error r
280d0 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63  eturned from cac
280e0 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29  key_login() (%i)
280f0 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a  ", login_ret);..
28100 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
28110 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
28120 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
28130 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
28140 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52  gs &= ~(CKF_USER
28150 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b  _PIN_LOCKED | CK
28160 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
28170 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e  _LOW | CKF_LOGIN
28180 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f  _REQUIRED | CKF_
28190 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
281a0 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  RY);...cackey_se
281b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
281c0 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
281d0 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a  USER_FUNCTIONS;.
281e0 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
281f0 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76  ) {...mutex_retv
28200 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
28210 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28220 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28  biglock);...if (
28230 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
28240 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
28250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28260 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
28270 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
28280 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28290 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a  _ERROR);...}..}.
282a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
282b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
282c0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
282d0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
282e0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
282f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
28300 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28  CK_RV, C_Login)(
28310 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
28320 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
28330 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70  SER_TYPE userTyp
28340 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  e, CK_UTF8CHAR_P
28350 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
28360 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 72  G ulPinLen) {..r
28370 65 74 75 72 6e 28 43 5f 4c 6f 67 69 6e 4d 75 74  eturn(C_LoginMut
28380 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20  exArg(hSession, 
28390 75 73 65 72 54 79 70 65 2c 20 70 50 69 6e 2c 20  userType, pPin, 
283a0 75 6c 50 69 6e 4c 65 6e 2c 20 31 29 29 3b 0a 7d  ulPinLen, 1));.}
283b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
283c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
283d0 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gout)(CK_SESSION
283e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
283f0 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
28400 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
28410 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
28420 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28430 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28440 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28450 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28470 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
28480 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
28490 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
284a0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
284b0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
284c0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
284d0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
284e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
284f0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
28500 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
28510 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
28520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28530 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
28540 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
28550 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
28560 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
28570 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
28580 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28590 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
285a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
285b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
285c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
285d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
285e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
285f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
28600 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28610 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
28620 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
28630 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
28640 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
28650 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28660 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28680 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
28690 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
286a0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
286b0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
286c0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
286d0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
286e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
286f0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
28700 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
28710 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
28720 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
28730 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
28740 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
28750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28760 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
28770 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
28780 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
28790 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
287a0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
287b0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
287c0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
287d0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
287e0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
287f0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
28800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28810 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
28820 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
28830 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
28840 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
28850 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
28860 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28870 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28880 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
28890 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
288a0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
288b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
288c0 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42  ate = CKS_RO_PUB
288d0 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 69  LIC_SESSION;...i
288e0 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
288f0 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mmand == NULL) {
28900 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
28910 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
28920 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
28930 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73  REQUIRED;..} els
28940 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  e {...cackey_slo
28950 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
28960 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _flags = 0;..}..
28970 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
28980 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28990 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
289a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
289b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
289c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
289d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
289e0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
289f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28a00 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28a10 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
28a20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28a30 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
28a40 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
28a50 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
28a60 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
28a70 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65  ION(CK_RV, C_Cre
28a80 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  ateObject)(CK_SE
28a90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
28aa0 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
28ab0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
28ac0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
28ad0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
28ae0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
28af0 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
28b00 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
28b10 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
28b20 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
28b30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28b40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28b50 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
28b60 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28b70 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
28b80 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28b90 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
28ba0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28bb0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
28bc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
28bd0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
28be0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28bf0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28c00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28c10 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
28c20 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
28c30 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65  K_RV, C_CopyObje
28c40 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
28c50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28c60 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
28c70 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
28c80 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
28c90 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
28ca0 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
28cb0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e  T_HANDLE_PTR phN
28cc0 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  ewObject) {..CAC
28cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28ce0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28cf0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28d00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28d10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28d20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
28d30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
28d40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
28d50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
28d60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
28d70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28d80 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
28d90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28da0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
28db0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28dc0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
28dd0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
28de0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
28df0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28e00 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
28e10 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f  stroyObject)(CK_
28e20 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
28e30 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
28e40 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
28e50 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
28e60 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
28e70 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
28e80 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28e90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28ea0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28eb0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
28ec0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28ed0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
28ee0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
28ef0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
28f00 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28f10 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
28f20 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
28f30 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
28f40 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
28f50 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
28f60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28f70 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
28f80 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
28f90 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74  _RV, C_GetObject
28fa0 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Size)(CK_SESSION
28fb0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
28fc0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
28fd0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  LE hObject, CK_U
28fe0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65  LONG_PTR pulSize
28ff0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
29000 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
29010 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29020 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29030 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29040 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29050 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29060 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29070 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29080 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29090 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
290a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
290b0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
290c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
290d0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
290e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
290f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
29100 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29110 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29120 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29130 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75  RV, C_GetAttribu
29140 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
29150 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
29160 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
29170 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
29180 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
29190 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
291a0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
291b0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
291c0 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74  rr_attr;..struct
291d0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
291e0 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73   *identity;..uns
291f0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
29200 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64  ity_idx, attr_id
29210 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
29220 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20  , num_ids;..int 
29230 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43  mutex_retval;..C
29240 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
29250 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  R_OK;..CK_VOID_P
29260 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
29270 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
29280 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29290 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
292a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
292b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
292c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
292d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
292e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
292f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29300 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29310 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29320 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
29330 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
29340 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
29350 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
29360 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
29370 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
29380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29390 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
293a0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
293b0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
293c0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
293d0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
293e0 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d  ..if (hObject ==
293f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
29400 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29410 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
29420 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
29430 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
29440 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
29450 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29460 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20  .if (ulCount == 
29470 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
29480 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
29490 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
294a0 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
294b0 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
294c0 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45  ately */...CACKE
294d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
294e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
294f0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
29500 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
29510 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
29520 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  K);..}...if (pTe
29530 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  mplate == NULL) 
29540 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29550 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29560 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55   pTemplate is NU
29570 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
29580 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
29590 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  AD);..}...identi
295a0 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74  ty_idx = hObject
295b0 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   - 1;...mutex_re
295c0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
295d0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
295e0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
295f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
29600 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29610 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29620 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
29630 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29640 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
29650 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
29660 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29670 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
29680 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
29690 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
296a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
296b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
296c0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
296d0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
296e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
296f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
29700 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75  NVALID);..}...nu
29710 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73  m_ids = cackey_s
29720 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29730 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
29740 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  nt;...if (identi
29750 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64  ty_idx >= num_id
29760 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  s) {...cackey_mu
29770 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29780 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
29790 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
297a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
297b0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
297c0 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74   range.  identit
297d0 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d  y_idx = %lu, num
297e0 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75  _ids = %lu.", (u
297f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
29800 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73  entity_idx, (uns
29810 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f  igned long) num_
29820 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ids);....return(
29830 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
29840 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29850 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  .identity = &cac
29860 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29870 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
29880 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b  s[identity_idx];
29890 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
298a0 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
298b0 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69   ulCount; attr_i
298c0 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61  dx++) {...curr_a
298d0 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65  ttr = &pTemplate
298e0 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70  [attr_idx];....p
298f0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
29900 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
29910 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41  _LONG) -1;....CA
29920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29930 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  F("Looking for a
29940 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78  ttribute 0x%08lx
29950 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20   (identity:%lu) 
29960 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
29970 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
29980 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  >type, (unsigned
29990 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
299a0 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65  idx);....for (se
299b0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
299c0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
299d0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
299e0 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
299f0 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
29a00 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
29a10 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
29a20 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
29a30 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
29a40 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  pe) {.....CACKEY
29a50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
29a60 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56  ... found it, pV
29a70 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c  alue = %p, ulVal
29a80 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64  ueLen = %lu", id
29a90 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
29aa0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
29ab0 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69  ].pValue, identi
29ac0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
29ad0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
29ae0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a  ValueLen);......
29af0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
29b00 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
29b10 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
29b20 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56  .pValue;.....ulV
29b30 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69  alueLen = identi
29b40 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
29b50 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
29b60 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09  ValueLen;....}..
29b70 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61  .}....if (curr_a
29b80 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70  ttr->pValue && p
29b90 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28  Value) {....if (
29ba0 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
29bb0 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65  ueLen >= ulValue
29bc0 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  Len) {.....memcp
29bd0 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  y(curr_attr->pVa
29be0 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56  lue, pValue, ulV
29bf0 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65  alueLen);....} e
29c00 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75  lse {.....ulValu
29c10 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
29c20 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c   -1;......retval
29c30 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
29c40 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09  O_SMALL;....}...
29c50 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e  }....curr_attr->
29c60 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
29c70 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75  alueLen;..}...mu
29c80 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
29c90 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
29ca0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
29cb0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
29cc0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
29cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29ce0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
29cf0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
29d00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
29d10 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
29d20 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
29d30 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
29d40 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
29d50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29d60 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29d70 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
29d80 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22  PE_INVALID (%i)"
29d90 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
29da0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
29db0 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  val == CKR_BUFFE
29dc0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
29dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29de0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29df0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
29e00 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74  MALL (%i)", (int
29e10 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
29e20 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
29e30 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
29e40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29e50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
29e60 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  OK (%i)", (int) 
29e70 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
29e80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29e90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29ea0 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
29eb0 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
29ec0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
29ed0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29ee0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41  ON(CK_RV, C_SetA
29ef0 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
29f00 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29f10 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
29f20 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
29f30 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
29f40 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
29f50 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
29f60 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
29f70 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
29f80 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
29f90 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
29fa0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29fb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29fc0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
29fd0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29fe0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
29ff0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2a000 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2a010 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2a020 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2a030 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2a040 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2a050 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2a060 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2a070 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a080 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2a090 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2a0a0 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
2a0b0 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  tsInit)(CK_SESSI
2a0c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2a0d0 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
2a0e0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
2a0f0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
2a100 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
2a110 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e  slotID;..CK_ULON
2a120 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
2a130 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
2a140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a150 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2a160 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2a170 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2a180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a190 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2a1a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2a1b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2a1c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2a1d0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
2a1e0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2a1f0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2a200 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2a210 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2a220 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2a230 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2a240 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a250 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2a260 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2a270 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2a280 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2a290 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
2a2a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2a2b0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2a2c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2a2d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2a2e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a2f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a300 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2a310 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2a320 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2a330 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2a340 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2a350 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2a360 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2a370 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2a380 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2a390 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a3a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a3b0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2a3c0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2a3d0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2a3e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2a3f0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2a400 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2a410 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
2a420 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2a430 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2a440 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2a450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a460 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c  rror.  Search al
2a470 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b  ready active.");
2a480 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2a490 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
2a4a0 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  E);..}...slotID 
2a4b0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2a4c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
2a4d0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
2a4e0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
2a4f0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2a500 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
2a510 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
2a520 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2a530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a540 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
2a550 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
2a560 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
2a570 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
2a580 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
2a590 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2a5a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
2a5b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2a5c0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
2a5d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a5e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
2a5f0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
2a600 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
2a610 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
2a620 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
2a630 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2a640 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2a650 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
2a660 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2a670 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
2a680 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2a690 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ID].slot_reset) 
2a6a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a6b0 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f  _PRINTF("The slo
2a6c0 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74  t has been reset
2a6d0 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c   since we last l
2a6e0 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69  ooked for identi
2a6f0 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69  ties -- rescanni
2a700 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63  ng");....if (cac
2a710 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a720 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2a730 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
2a740 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
2a750 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
2a760 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a770 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
2a780 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a790 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2a7a0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61  s_count);.....ca
2a7b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a7c0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2a7d0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
2a7e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a7f0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2a800 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  es_count = 0;...
2a810 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
2a820 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
2a830 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel != NULL) {..
2a840 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
2a850 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
2a860 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  l);....cackey_sl
2a870 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
2a880 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
2a890 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
2a8a0 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
2a8b0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a  slots[slotID]);.
2a8c0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
2a8d0 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
2a8e0 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  t = 0;..}...if (
2a8f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a900 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2a910 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
2a920 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2a930 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2a940 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
2a950 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
2a960 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
2a970 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73  otID], &cackey_s
2a980 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a990 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
2a9a0 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54  nt);..}...if (pT
2a9b0 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29  emplate != NULL)
2a9c0 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
2a9d0 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
2a9e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a9f0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2aa00 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75  ry_count = ulCou
2aa10 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  nt;....cackey_se
2aa20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2aa30 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
2aa40 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a  malloc(ulCount *
2aa50 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
2aa60 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79  te));.....memcpy
2aa70 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2aa80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2aa90 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61  h_query, pTempla
2aaa0 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69  te, ulCount * si
2aab0 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
2aac0 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d  );....for (idx =
2aad0 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e   0; idx < ulCoun
2aae0 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  t; idx++) {.....
2aaf0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  if (pTemplate[id
2ab00 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  x].ulValueLen ==
2ab10 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65   0) {......cacke
2ab20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ab30 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2ab40 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20  y[idx].pValue = 
2ab50 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74  NULL;.......cont
2ab60 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  inue;.....}.....
2ab70 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2ab80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2ab90 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
2aba0 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65  lue = malloc(pTe
2abb0 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
2abc0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  lueLen);......if
2abd0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2abe0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2abf0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
2ac00 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  alue) {......mem
2ac10 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
2ac20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2ac30 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
2ac40 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74  pValue, pTemplat
2ac50 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  e[idx].pValue, p
2ac60 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c  Template[idx].ul
2ac70 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d  ValueLen);.....}
2ac80 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
2ac90 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2aca0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2acb0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
2acc0 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
2acd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ace0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
2acf0 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65  = NULL;...}..} e
2ad00 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  lse {...if (ulCo
2ad10 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
2ad20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2ad30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2ad40 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  k);.....CACKEY_D
2ad50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ad60 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72  or.  Search quer
2ad70 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  y specified as N
2ad80 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20  ULL, but number 
2ad90 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e  of query terms n
2ada0 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
2adb0 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  0.");.....return
2adc0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2add0 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  AD);...}....cack
2ade0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2adf0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2ae00 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
2ae10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ae20 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2ae30 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
2ae40 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
2ae50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2ae60 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b  arch_active = 1;
2ae70 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2ae80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2ae90 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a  ch_curr_id = 0;.
2aea0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2aeb0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2aec0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2aed0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2aee0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2aef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2af00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2af10 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2af20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2af30 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2af40 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2af50 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2af60 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2af70 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2af80 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2af90 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ..static int cac
2afa0 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61  key_pkcs11_compa
2afb0 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  re_attributes(CK
2afc0 5f 41 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43  _ATTRIBUTE *a, C
2afd0 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 62 29 20  K_ATTRIBUTE *b) 
2afe0 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
2aff0 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72   *smallbuf, *lar
2b000 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73  gebuf;..size_t s
2b010 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72  mallbuf_len, lar
2b020 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20  gebuf_len;...if 
2b030 28 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74  (a->type != b->t
2b040 79 70 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ype) {...return(
2b050 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  0);..}...CACKEY_
2b060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
2b070 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63    ... found matc
2b080 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b  hing type ...");
2b090 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b0a0 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e  PRINTBUF("    ..
2b0b0 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61  . our value:", a
2b0c0 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56  ->pValue, a->ulV
2b0d0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28  alueLen);...if (
2b0e0 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  b->pValue == NUL
2b0f0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2b100 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
2b110 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c     ... found wil
2b120 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a  dcard match");..
2b130 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
2b140 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20  ..if (a->pValue 
2b150 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
2b160 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66  urn(0);..}.. .if
2b170 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (b->ulValueLen 
2b180 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  == a->ulValueLen
2b190 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56   && memcmp(a->pV
2b1a0 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c  alue, b->pValue,
2b1b0 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
2b1c0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2b1d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
2b1e0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
2b1f0 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a  exact match");..
2b200 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
2b210 0a 09 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70  ..switch (a->typ
2b220 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f  e) {...case CKA_
2b230 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28  MODULUS:....if (
2b240 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  a->ulValueLen ==
2b250 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
2b260 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
2b270 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56  }.....if (a->ulV
2b280 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56  alueLen > b->ulV
2b290 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73  alueLen) {.....s
2b2a0 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61  mallbuf = b->pVa
2b2b0 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  lue;.....smallbu
2b2c0 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c  f_len = b->ulVal
2b2d0 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67  ueLen;......larg
2b2e0 65 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65  ebuf = a->pValue
2b2f0 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c  ;.....largebuf_l
2b300 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  en = a->ulValueL
2b310 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  en;....} else {.
2b320 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61  ....smallbuf = a
2b330 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d  ->pValue;.....sm
2b340 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e  allbuf_len = a->
2b350 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
2b360 09 6c 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70  .largebuf = b->p
2b370 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65  Value;.....large
2b380 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56  buf_len = b->ulV
2b390 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09  alueLen;....}...
2b3a0 09 09 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75  ..for (; largebu
2b3b0 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75  f_len != smallbu
2b3c0 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b  f_len; largebuf+
2b3d0 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d  +,largebuf_len--
2b3e0 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67  ) {.....if (larg
2b3f0 65 62 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a  ebuf[0] != 0) {.
2b400 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
2b410 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c  }....}.....if (l
2b420 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73  argebuf_len != s
2b430 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  mallbuf_len) {..
2b440 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
2b450 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61  ...if (memcmp(la
2b460 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66  rgebuf, smallbuf
2b470 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  , smallbuf_len) 
2b480 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  == 0) {.....CACK
2b490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b4a0 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
2b4b0 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61  d approximate ma
2b4c0 74 63 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  tch");......retu
2b4d0 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  rn(1);....}.....
2b4e0 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75  break;..}...retu
2b4f0 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  rn(0);.}..CK_DEF
2b500 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2b510 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
2b520 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
2b530 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2b540 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
2b550 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b  PTR phObject, CK
2b560 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65  _ULONG ulMaxObje
2b570 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e  ctCount, CK_ULON
2b580 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43  G_PTR pulObjectC
2b590 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
2b5a0 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
2b5b0 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54  *curr_id;..CK_AT
2b5c0 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
2b5d0 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75  tr;..CK_ULONG cu
2b5e0 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  rr_id_idx, curr_
2b5f0 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72  out_id_idx, curr
2b600 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f  _attr_idx, sess_
2b610 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c  attr_idx;..CK_UL
2b620 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ONG matched_coun
2b630 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  t, prev_matched_
2b640 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65  count;..int mute
2b650 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66  x_retval;.#ifdef
2b660 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2b670 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2b680 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
2b690 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74  tart, end;..uint
2b6a0 36 34 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20  64_t start_int, 
2b6b0 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a  end_int;.#endif.
2b6c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b6d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2b6e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2b6f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2b700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b710 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2b720 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2b730 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b740 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2b750 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2b760 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75  if (pulObjectCou
2b770 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
2b780 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b790 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c  NTF("Error.  pul
2b7a0 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e  ObjectCount is N
2b7b0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2b7c0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2b7d0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
2b7e0 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20  hObject == NULL 
2b7f0 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  && ulMaxObjectCo
2b800 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
2b810 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
2b820 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
2b830 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
2b840 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
2b850 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
2b860 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
2b870 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59  t = 0;....CACKEY
2b880 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2b890 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2b8a0 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
2b8b0 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
2b8c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2b8d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62  );..}...if (phOb
2b8e0 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ject == NULL) {.
2b8f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b900 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
2b910 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e  hObject is NULL.
2b920 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2b930 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2b940 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78  ;..}...if (ulMax
2b950 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
2b960 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b970 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b980 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  .  Maximum numbe
2b990 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65  r of objects spe
2b9a0 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22  cified as zero."
2b9b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b9c0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2b9d0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2b9e0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2b9f0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2ba00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2ba10 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2ba20 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2ba30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ba40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ba50 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2ba60 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2ba70 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2ba80 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2ba90 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2baa0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2bab0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2bac0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2bad0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2bae0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2baf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bb00 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2bb10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2bb20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2bb30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2bb40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bb50 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2bb60 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2bb70 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2bb80 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2bb90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bba0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2bbb0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2bbc0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2bbd0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2bbe0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2bbf0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2bc00 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2bc10 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
2bc20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2bc30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2bc40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2bc50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2bc60 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61  r.  Search not a
2bc70 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2bc80 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2bc90 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2bca0 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66  ZED);..}..#ifdef
2bcb0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2bcc0 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2bcd0 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74  gettimeofday(&st
2bce0 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  art, NULL);.#end
2bcf0 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64  if...curr_out_id
2bd00 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28  _idx = 0;..for (
2bd10 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61  curr_id_idx = ca
2bd20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2bd30 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
2bd40 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f  urr_id; curr_id_
2bd50 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
2bd60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2bd70 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
2bd80 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43   && ulMaxObjectC
2bd90 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64  ount; curr_id_id
2bda0 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64  x++) {...curr_id
2bdb0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
2bdc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2bdd0 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64  entities[curr_id
2bde0 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59  _idx];....CACKEY
2bdf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
2be00 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69  rocessing identi
2be10 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  ty:%lu", (unsign
2be20 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64  ed long) curr_id
2be30 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65  _idx);....matche
2be40 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  d_count = 0;....
2be50 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69  for (curr_attr_i
2be60 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74  dx = 0; curr_att
2be70 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  r_idx < cackey_s
2be80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2be90 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
2bea0 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f  ount; curr_attr_
2beb0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76  idx++) {....prev
2bec0 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
2bed0 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a   matched_count;.
2bee0 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
2bef0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2bf00 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2bf10 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74  h_query[curr_att
2bf20 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b  r_idx];.....CACK
2bf30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bf40 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20  "  Checking for 
2bf50 61 74 74 72 69 62 75 74 65 20 25 73 20 28 30 78  attribute %s (0x
2bf60 25 30 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69  %08lx) in identi
2bf70 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45  ty:%i...", CACKE
2bf80 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54  Y_DEBUG_FUNC_ATT
2bf90 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75  RIBUTE_TO_STR(cu
2bfa0 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20  rr_attr->type), 
2bfb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2bfc0 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
2bfd0 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
2bfe0 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  dx);....CACKEY_D
2bff0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
2c000 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67     Value looking
2c010 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74   for:", curr_att
2c020 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  r->pValue, curr_
2c030 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
2c040 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73  );.....for (sess
2c050 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73  _attr_idx = 0; s
2c060 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  ess_attr_idx < c
2c070 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
2c080 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
2c090 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
2c0a0 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73  .if (cackey_pkcs
2c0b0 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69  11_compare_attri
2c0c0 62 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e  butes(&curr_id->
2c0d0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
2c0e0 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f  attr_idx], curr_
2c0f0 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61  attr)) {......ma
2c100 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a  tched_count++;..
2c110 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
2c120 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66  }....}...../* If
2c130 20 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63   the attribute c
2c140 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63  ould not be matc
2c150 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20  hed, do not try 
2c160 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f  to match additio
2c170 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a  nal attributes *
2c180 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61  /....if (prev_ma
2c190 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d  tched_count == m
2c1a0 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a  atched_count) {.
2c1b0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
2c1c0 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68  ..}....if (match
2c1d0 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b  ed_count == cack
2c1e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c1f0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2c200 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ry_count) {....C
2c210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c220 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69  TF("  ... All %i
2c230 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
2c240 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61  ked for found, a
2c250 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
2c260 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69  i to returned li
2c270 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  st", (int) cacke
2c280 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c290 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2c2a0 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  y_count, (int) c
2c2b0 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
2c2c0 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f  .phObject[curr_o
2c2d0 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72  ut_id_idx] = cur
2c2e0 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09  r_id_idx + 1;...
2c2f0 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  ..ulMaxObjectCou
2c300 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f  nt--;.....curr_o
2c310 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d  ut_id_idx++;...}
2c320 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
2c330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c340 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69    ... Not all %i
2c350 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29   (only found %i)
2c360 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
2c370 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e  ked for found, n
2c380 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  ot adding identi
2c390 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61  ty:%i", (int) ca
2c3a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c3b0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2c3c0 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
2c3d0 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  ) matched_count,
2c3e0 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
2c3f0 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63  dx);...}..}..cac
2c400 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c410 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
2c420 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f  rr_id = curr_id_
2c430 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74  idx;..*pulObject
2c440 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74  Count = curr_out
2c450 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66  _id_idx;..#ifdef
2c460 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2c470 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2c480 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e  gettimeofday(&en
2c490 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74  d, NULL);..start
2c4a0 5f 69 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76  _int = (start.tv
2c4b0 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20  _sec * 1000000) 
2c4c0 2b 20 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b  + start.tv_usec;
2c4d0 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64  ..end_int = (end
2c4e0 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30  .tv_sec * 100000
2c4f0 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63  0) + end.tv_usec
2c500 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
2c510 72 2c 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20  r, "Search took 
2c520 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  %lu microseconds
2c530 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  \n", (unsigned l
2c540 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20  ong) (end_int - 
2c550 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e  start_int));.#en
2c560 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  dif...mutex_retv
2c570 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2c580 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c590 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2c5a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2c5b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c5c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c5d0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2c5e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2c5f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2c600 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2c610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c620 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2c630 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63   (%i), num objec
2c640 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f  ts = %lu", CKR_O
2c650 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  K, *pulObjectCou
2c660 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  nt);...return(CK
2c670 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2c680 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2c690 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
2c6a0 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  sFinal)(CK_SESSI
2c6b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2c6c0 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  on) {..CK_ULONG 
2c6d0 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
2c6e0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
2c6f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2c700 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2c710 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2c720 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2c730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c740 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2c750 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2c760 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2c770 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c780 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2c790 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2c7a0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2c7b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c7c0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2c7d0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2c7e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c7f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c800 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2c810 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2c820 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2c830 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2c840 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2c850 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2c860 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2c870 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2c880 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2c890 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2c8a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c8b0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2c8c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2c8d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2c8e0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2c8f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c900 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2c910 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2c920 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c930 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2c940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c950 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2c960 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2c970 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c980 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2c990 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2c9a0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2c9b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2c9c0 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
2c9d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2c9e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2c9f0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2ca00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ca10 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
2ca20 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2ca30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2ca40 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2ca50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  LIZED);..}...cac
2ca60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ca70 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
2ca80 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20  tive = 0;...for 
2ca90 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
2caa0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cab0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2cac0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64  _query_count; id
2cad0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
2cae0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2caf0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2cb00 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29  ery[idx].pValue)
2cb10 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
2cb20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2cb30 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2cb40 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a  y[idx].pValue);.
2cb50 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  ..}..}...if (cac
2cb60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cb70 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2cb80 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61  ery) {...free(ca
2cb90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2cba0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2cbb0 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  uery);..}...mute
2cbc0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2cbd0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2cbe0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2cbf0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2cc00 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2cc10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cc20 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2cc30 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2cc40 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2cc50 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2cc60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cc70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2cc80 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2cc90 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2cca0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2ccb0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ccc0 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49  K_RV, C_EncryptI
2ccd0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2cce0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2ccf0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2cd00 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
2cd10 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2cd20 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
2cd30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2cd40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2cd50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2cd60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2cd70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cd80 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2cd90 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2cda0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2cdb0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2cdc0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2cdd0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2cde0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2cdf0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2ce00 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2ce10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ce20 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2ce30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ce40 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2ce50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2ce60 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
2ce70 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2ce80 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2ce90 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2cea0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2ceb0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2cec0 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
2ced0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2cee0 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
2cef0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2cf00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2cf10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2cf20 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2cf30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2cf40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2cf50 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2cf60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2cf70 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2cf80 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2cf90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2cfa0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2cfb0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2cfc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2cfd0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2cfe0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2cff0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2d000 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d010 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2d020 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d030 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70  _RV, C_EncryptUp
2d040 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2d050 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d060 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2d070 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2d080 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2d090 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2d0a0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2d0b0 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
2d0c0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2d0d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2d0e0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2d0f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2d100 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2d110 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d120 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2d130 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2d140 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2d150 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d160 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2d170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d180 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2d190 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d1a0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2d1b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d1c0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2d1d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d1e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2d1f0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d200 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2d210 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  ptFinal)(CK_SESS
2d220 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d230 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2d240 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50   pLastEncryptedP
2d250 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2d260 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74  R pulLastEncrypt
2d270 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
2d280 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d290 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2d2a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2d2b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2d2c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d2d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2d2e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2d2f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2d300 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2d310 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2d320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d330 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2d340 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d350 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2d360 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d370 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2d380 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2d390 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2d3a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2d3b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2d3c0 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ecryptInit)(CK_S
2d3d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2d3e0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2d3f0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2d400 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2d410 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69  ANDLE hKey) {..i
2d420 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2d430 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43  ...hKey--;...CAC
2d440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d450 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2d460 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2d470 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2d480 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d490 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2d4a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2d4b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2d4c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2d4d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2d4e0 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c  Mechanism == NUL
2d4f0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2d500 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d510 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73  r. pMechanism is
2d520 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2d530 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2d540 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2d550 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63  (pMechanism->mec
2d560 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53  hanism != CKM_RS
2d570 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
2d580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d590 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
2d5a0 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
2d5b0 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
2d5c0 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a  KM_RSA_PKCS");..
2d5d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43  ..return(CKR_MEC
2d5e0 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56  HANISM_PARAM_INV
2d5f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2d600 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2d610 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2d620 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2d630 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2d640 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2d650 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2d660 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d670 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2d680 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2d690 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2d6a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2d6b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2d6c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2d6d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2d6e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2d6f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2d700 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2d710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d720 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2d730 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2d740 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2d750 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2d760 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d770 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2d780 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2d790 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2d7a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2d7b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d7c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2d7d0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2d7e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2d7f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2d800 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2d810 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
2d820 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d830 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2d840 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2d850 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2d860 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2d870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d880 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
2d890 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f  t already in pro
2d8a0 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72  gress.");......r
2d8b0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2d8c0 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
2d8d0 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61  ..if (hKey >= ca
2d8e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d8f0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2d900 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61  es_count) {...ca
2d910 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d920 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d930 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2d940 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d950 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75  .  Key handle ou
2d960 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75  t of range (requ
2d970 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f  ested key %lu, o
2d980 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69  nly %lu identiti
2d990 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c  es available).",
2d9a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2d9b0 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64   hKey, (unsigned
2d9c0 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65   long) cackey_se
2d9d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d9e0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
2d9f0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
2da00 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56  R_KEY_HANDLE_INV
2da10 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
2da20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2da30 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2da40 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b  tive = 1;...cack
2da50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2da60 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
2da70 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
2da80 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
2da90 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2daa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2dab0 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20  ypt_mech_parm = 
2dac0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72  pMechanism->pPar
2dad0 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f  ameter;..cackey_
2dae0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2daf0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
2db00 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61  parmlen = pMecha
2db10 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65  nism->ulParamete
2db20 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65  rLen;..cackey_se
2db30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2db40 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
2db50 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
2db60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2db70 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b  dentities[hKey];
2db80 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2db90 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2dba0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2dbb0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2dbc0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2dbd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2dbe0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2dbf0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2dc00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2dc10 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2dc20 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2dc30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2dc40 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2dc50 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2dc60 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2dc70 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2dc80 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2dc90 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ecrypt)(CK_SESSI
2dca0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2dcb0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2dcc0 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
2dcd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
2dce0 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  ptedDataLen, CK_
2dcf0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2dd00 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2dd10 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55  DataLen) {..CK_U
2dd20 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64  LONG datalen_upd
2dd30 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e  ate, datalen_fin
2dd40 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79  al;..CK_RV decry
2dd50 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  pt_ret;..int mut
2dd60 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2dd70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2dd80 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2dd90 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2dda0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2ddb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ddc0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2ddd0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2dde0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2ddf0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2de00 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2de10 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c  ulDataLen == NUL
2de20 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2de30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2de40 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73  r. pulDataLen is
2de50 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2de60 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2de70 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74  S_BAD);..}...dat
2de80 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70  alen_update = *p
2de90 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63  ulDataLen;...dec
2dea0 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63  rypt_ret = C_Dec
2deb0 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73  ryptUpdate(hSess
2dec0 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44  ion, pEncryptedD
2ded0 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  ata, ulEncrypted
2dee0 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20  DataLen, pData, 
2def0 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29  &datalen_update)
2df00 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
2df10 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
2df20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2df30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2df40 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72  ecryptUpdate() r
2df50 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2df60 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2df70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
2df80 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69  crypt_ret);....i
2df90 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
2dfa0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2dfb0 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20  _SMALL) {..../* 
2dfc0 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70  Terminate decryp
2dfd0 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
2dfe0 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  /.....mutex_retv
2dff0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2e000 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2e010 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2e020 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2e030 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2e040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e050 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2e060 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
2e070 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2e080 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
2e090 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2e0a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e0b0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
2e0c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2e0d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2e0e0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
2e0f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e100 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2e110 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2e120 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2e130 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2e140 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ALID);....}.....
2e150 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2e160 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2e170 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
2e180 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2e190 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2e1a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2e1b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e1c0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2e1d0 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
2e1e0 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
2e1f0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
2e200 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2e210 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
2e220 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e230 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2e240 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65  ve = 0;.....mute
2e250 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2e260 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2e270 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2e280 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
2e290 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
2e2a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e2b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2e2c0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2e2d0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2e2e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2e2f0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
2e300 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
2e310 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74  );..}...if (pDat
2e320 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20  a) {...pData += 
2e330 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a  datalen_update;.
2e340 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61  .}..datalen_fina
2e350 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20  l = *pulDataLen 
2e360 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  - datalen_update
2e370 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
2e380 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
2e390 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61  (hSession, pData
2e3a0 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  , &datalen_final
2e3b0 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
2e3c0 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
2e3d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e3e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e3f0 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72  DecryptFinal() r
2e400 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2e410 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2e420 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
2e430 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72  crypt_ret);....r
2e440 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
2e450 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74  t);..}...*pulDat
2e460 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75  aLen = datalen_u
2e470 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f  pdate + datalen_
2e480 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  final;...CACKEY_
2e490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2e4a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2e4b0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2e4c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2e4d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2e4e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2e4f0 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43  DecryptUpdate)(C
2e500 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2e510 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2e520 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2e530 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2e540 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2e550 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2e560 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2e570 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2e580 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
2e590 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73  E buf[16384];..s
2e5a0 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09  size_t buflen;..
2e5b0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
2e5c0 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  D;..CK_RV retval
2e5d0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2e5e0 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78  RROR;..int mutex
2e5f0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
2e600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e610 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2e620 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2e630 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2e640 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e650 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2e660 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2e670 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2e680 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2e690 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2e6a0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2e6b0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2e6c0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2e6d0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2e6e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2e6f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e700 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e710 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2e720 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2e730 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2e740 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2e750 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45  ID);..}...if (pE
2e760 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20  ncryptedPart == 
2e770 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70  NULL && ulEncryp
2e780 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  tedPartLen == 0)
2e790 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
2e7a0 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
2e7b0 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74  asked to decrypt
2e7c0 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
2e7d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e7e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2e7f0 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
2e800 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
2e810 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
2e820 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
2e830 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
2e840 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
2e850 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e860 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72  TF("Error. pEncr
2e870 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c  yptedPart is NUL
2e880 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74  L, but ulEncrypt
2e890 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  edPartLen is not
2e8a0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
2e8b0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2e8c0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
2e8d0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2e8e0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2e8f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e900 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74  Error. ulEncrypt
2e910 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  edPartLen is 0, 
2e920 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
2e930 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2e940 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2e950 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2e960 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  (pulPartLen == N
2e970 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2e980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e990 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20  ror. pulPartLen 
2e9a0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2e9b0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2e9c0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
2e9d0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2e9e0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2e9f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2ea00 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2ea10 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2ea20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ea30 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2ea40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2ea50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2ea60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2ea70 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2ea80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2ea90 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2eaa0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2eab0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2eac0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ead0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2eae0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2eaf0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2eb00 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2eb10 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2eb20 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2eb30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2eb40 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2eb50 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2eb60 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2eb70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2eb80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2eb90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
2eba0 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
2ebb0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2ebc0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
2ebd0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2ebe0 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
2ebf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ec00 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
2ec10 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
2ec20 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
2ec30 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
2ec40 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
2ec50 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
2ec60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ec70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ec80 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2ec90 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
2eca0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
2ecb0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
2ecc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2ecd0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2ece0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
2ecf0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
2ed00 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
2ed10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ed20 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
2ed30 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
2ed40 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
2ed50 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
2ed60 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
2ed70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2ed80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2ed90 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
2eda0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2edb0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
2edc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2edd0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2ede0 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
2edf0 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
2ee00 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
2ee10 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a  d to decrypt */.
2ee20 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  ...buflen = cack
2ee30 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
2ee40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2ee50 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
2ee60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ee70 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
2ee80 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  , pEncryptedPart
2ee90 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  , ulEncryptedPar
2eea0 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f  tLen, buf, sizeo
2eeb0 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a  f(buf), 0, 1);..
2eec0 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  ...if (buflen ==
2eed0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e   CACKEY_PCSC_E_N
2eee0 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b  EEDLOGIN && cack
2eef0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
2ef00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66  = NULL) {.....if
2ef10 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72   (C_LoginMutexAr
2ef20 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f  g(hSession, CKU_
2ef30 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30  USER, NULL, 0, 0
2ef40 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  ) == CKR_OK) {..
2ef50 09 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63  ....buflen = cac
2ef60 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
2ef70 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
2ef80 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
2ef90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2efa0 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
2efb0 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  y, pEncryptedPar
2efc0 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  t, ulEncryptedPa
2efd0 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65  rtLen, buf, size
2efe0 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a  of(buf), 0, 1);.
2eff0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
2f000 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  f (buflen < 0) {
2f010 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69  ...../* Decrypti
2f020 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  on failed. */...
2f030 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  ..if (buflen == 
2f040 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
2f050 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
2f060 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
2f070 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
2f080 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
2f090 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
2f0a0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
2f0b0 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
2f0c0 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
2f0d0 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
2f0e0 6c 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  lse {......CACKE
2f0f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f100 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41  Failed to send A
2f110 50 44 55 2c 20 65 72 72 6f 72 20 3d 20 25 6c 69  PDU, error = %li
2f120 22 2c 20 28 6c 6f 6e 67 20 69 6e 74 29 20 62 75  ", (long int) bu
2f130 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 72 65 74  flen);.......ret
2f140 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2f150 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
2f160 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
2f170 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
2f180 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74  flen) > *pulPart
2f190 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a  Len && pPart) {.
2f1a0 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64  ..../* Decrypted
2f1b0 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
2f1c0 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  */.....retval = 
2f1d0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2f1e0 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20  MALL;....} else 
2f1f0 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29  {.....if (pPart)
2f200 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
2f210 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65  Part, buf, bufle
2f220 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a  n);.....}......*
2f230 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66  pulPartLen = buf
2f240 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
2f250 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
2f260 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2f270 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2f280 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2f290 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2f2a0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2f2b0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2f2c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f2d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2f2e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2f2f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2f300 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2f310 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2f320 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f330 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
2f340 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
2f350 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
2f360 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2f370 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
2f380 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
2f390 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2f3a0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2f3b0 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  LastPart, CK_ULO
2f3c0 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61  NG_PTR pulLastPa
2f3d0 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
2f3e0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
2f3f0 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79   terminate_decry
2f400 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59  pt = 1;...CACKEY
2f410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2f420 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2f430 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2f440 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2f450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2f460 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2f470 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2f480 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2f490 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2f4a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2f4b0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2f4c0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2f4d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2f4e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2f4f0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2f500 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f510 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f520 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2f530 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2f540 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2f550 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2f560 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
2f570 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  LastPartLen == N
2f580 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2f590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2f5a0 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74  ror. pulLastPart
2f5b0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2f5c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2f5d0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2f5e0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2f5f0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2f600 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2f610 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2f620 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2f630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f640 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2f650 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2f660 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2f670 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2f680 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2f690 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f6a0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2f6b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2f6c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2f6d0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2f6e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f6f0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2f700 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2f710 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2f720 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2f730 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2f740 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f750 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2f760 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2f770 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f780 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f790 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2f7a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f7b0 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2f7c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2f7d0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2f7e0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2f7f0 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73  D);..}...*pulLas
2f800 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09  tPartLen = 0;...
2f810 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d  if (pLastPart ==
2f820 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69   NULL) {...termi
2f830 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30  nate_decrypt = 0
2f840 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
2f850 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a  nate_decrypt) {.
2f860 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2f870 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2f880 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
2f890 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2f8a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2f8b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2f8c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2f8d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2f8e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f8f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f900 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2f910 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2f920 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2f930 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2f940 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2f950 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2f960 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2f970 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2f980 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2f990 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2f9a0 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f  _DigestInit)(CK_
2f9b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2f9c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2f9d0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2f9e0 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nism) {..CACKEY_
2f9f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2fa00 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2fa10 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2fa20 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2fa30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fa40 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2fa50 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2fa60 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2fa70 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2fa80 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2fa90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2faa0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2fab0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fac0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2fad0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fae0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2faf0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fb00 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2fb10 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2fb20 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
2fb30 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2fb40 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2fb50 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2fb60 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2fb70 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2fb80 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f   pDigest, CK_ULO
2fb90 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74  NG_PTR pulDigest
2fba0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2fbb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2fbc0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2fbd0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2fbe0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2fbf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fc00 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2fc10 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2fc20 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2fc30 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2fc40 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2fc50 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2fc60 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2fc70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2fc80 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2fc90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2fca0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2fcb0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2fcc0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2fcd0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2fce0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55  CK_RV, C_DigestU
2fcf0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2fd00 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2fd10 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2fd20 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2fd30 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
2fd40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fd50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2fd60 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2fd70 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2fd80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fd90 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2fda0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2fdb0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2fdc0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2fdd0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2fde0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fdf0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2fe00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2fe10 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2fe20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2fe30 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2fe40 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2fe50 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2fe60 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2fe70 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2fe80 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53  gestKey)(CK_SESS
2fe90 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2fea0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
2feb0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2fec0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fed0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2fee0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2fef0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ff00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ff10 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ff20 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ff30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2ff40 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ff50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2ff60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ff70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ff80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ff90 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2ffa0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ffb0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2ffc0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2ffd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ffe0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2fff0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
30000 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f  DigestFinal)(CK_
30010 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
30020 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
30030 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
30040 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
30050 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
30060 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30070 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
30080 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
30090 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
300a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
300b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
300c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
300d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
300e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
300f0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
30100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
30110 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
30120 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30130 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
30140 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30150 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
30160 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
30170 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
30180 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30190 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
301a0 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  nInit)(CK_SESSIO
301b0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
301c0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
301d0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
301e0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
301f0 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75   hKey) {..int mu
30200 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b  tex_retval;...hK
30210 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ey--;...CACKEY_D
30220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
30230 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
30240 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
30250 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
30260 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30270 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
30280 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
30290 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
302a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
302b0 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
302c0 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  nism == NULL) {.
302d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
302e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
302f0 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c  echanism is NULL
30300 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
30310 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
30320 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
30330 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
30340 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  m != CKM_RSA_PKC
30350 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
30360 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30370 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  r. pMechanism->m
30380 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65  echanism not spe
30390 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53  cified as CKM_RS
303a0 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74  A_PKCS");....ret
303b0 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53  urn(CKR_MECHANIS
303c0 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29  M_PARAM_INVALID)
303d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
303e0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
303f0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
30400 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
30410 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
30420 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
30430 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30440 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30450 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
30460 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
30470 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
30480 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
30490 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
304a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
304b0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
304c0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
304d0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
304e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
304f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30500 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
30510 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
30520 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
30530 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
30540 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30550 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
30560 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
30570 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
30580 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
30590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
305a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
305b0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
305c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
305d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
305e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
305f0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
30600 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
30610 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
30620 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
30630 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
30640 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
30650 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
30660 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69    Sign already i
30670 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
30680 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
30690 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
306a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
306b0 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
306c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
306d0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
306e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
306f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
30700 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
30710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30720 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
30730 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
30740 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
30750 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
30760 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
30770 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
30780 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
30790 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
307a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
307b0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
307c0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
307d0 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
307e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
307f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
30800 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
30810 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
30820 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30830 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
30840 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
30850 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
30860 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
30870 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
30880 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09  _buflen = 128;..
30890 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
308a0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
308b0 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63  ufused = 0;..cac
308c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
308d0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
308e0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
308f0 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
30900 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
30910 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
30920 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30930 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a  .sign_buflen);..
30940 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30950 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c  INTF("Session %l
30960 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  u sign_identity 
30970 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20  is %p (identity 
30980 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  #%lu)", (unsigne
30990 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
309a0 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b  , (void *) &cack
309b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
309c0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
309d0 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65  [hKey], (unsigne
309e0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09  d long) hKey);..
309f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30a00 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
30a10 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
30a20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30a30 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
30a40 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
30a50 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
30a60 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
30a70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
30a80 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
30a90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
30aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30ab0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
30ac0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
30ad0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
30ae0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
30af0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30b00 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30b10 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
30b20 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
30b30 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
30b40 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
30b50 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45  V, C_Sign)(CK_SE
30b60 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30b70 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
30b80 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
30b90 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
30ba0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
30bb0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
30bc0 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
30bd0 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
30be0 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f  long start_sign_
30bf0 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20  bufused;..CK_RV 
30c00 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  sign_ret;..int m
30c10 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
30c20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30c30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30c40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
30c50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
30c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30c70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
30c80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30c90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30ca0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30cb0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
30cc0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
30cd0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
30ce0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
30cf0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
30d00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30d10 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
30d20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30d30 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
30d40 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
30d50 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
30d60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
30d70 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74  NVALID);..}...st
30d80 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
30d90 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
30da0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
30db0 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67  n_bufused;...sig
30dc0 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70  n_ret = C_SignUp
30dd0 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
30de0 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29  Data, ulDataLen)
30df0 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ;..if (sign_ret 
30e00 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
30e10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30e20 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
30e30 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
30e40 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
30e50 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
30e60 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
30e70 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  );....if (sign_r
30e80 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
30e90 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
30ea0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
30eb0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
30ec0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
30ed0 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
30ee0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
30ef0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30f00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30f10 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
30f20 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
30f30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
30f40 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
30f50 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
30f60 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
30f70 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
30f80 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
30f90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
30fa0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30fb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30fc0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
30fd0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
30fe0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
30ff0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
31000 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
31010 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31020 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
31030 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
31040 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
31050 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
31060 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
31070 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31080 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
31090 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
310a0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
310b0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
310c0 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  ZED);....}.....c
310d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
310e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
310f0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75  tive = 0;.....mu
31100 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
31110 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
31120 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
31130 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
31140 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
31150 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31160 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
31170 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
31180 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
31190 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
311a0 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  R);....}...}....
311b0 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
311c0 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20  ;..}...sign_ret 
311d0 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53  = C_SignFinal(hS
311e0 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75  ession, pSignatu
311f0 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  re, pulSignature
31200 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
31210 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
31220 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ...if (sign_ret 
31230 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
31240 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41  O_SMALL) {....CA
31250 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31260 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72  F("SignFinal() r
31270 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46  eturned CKR_BUFF
31280 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76  ER_TOO_SMALL (rv
31290 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67   = %lu), undoing
312a0 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22   C_SignUpdate()"
312b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
312c0 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
312d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
312e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
312f0 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f  bufused = start_
31300 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
31310 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
31320 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  t);...}....CACKE
31330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31340 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61  Error.  SignFina
31350 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
31360 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
31370 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
31380 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
31390 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
313a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67  );..}...if (pSig
313b0 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20  nature == NULL) 
313c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
313d0 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74  _PRINTF("pSignat
313e0 75 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73  ure specified as
313f0 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43   NULL, undoing C
31400 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b  _SignUpdate()");
31410 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
31420 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31430 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
31440 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
31450 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
31460 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ret);..}...CACKE
31470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31480 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
31490 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
314a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
314b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
314c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
314d0 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b  C_SignUpdate)(CK
314e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
314f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
31500 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
31510 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
31520 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
31530 74 76 61 6c 3b 0a 09 69 6e 74 20 72 65 73 69 7a  tval;..int resiz
31540 65 52 65 74 72 79 3b 0a 09 69 6e 74 20 6e 65 65  eRetry;..int nee
31550 64 52 65 73 69 7a 65 3b 0a 0a 09 43 41 43 4b 45  dResize;...CACKE
31560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31570 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
31580 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
31590 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
315a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
315b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
315c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
315d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
315e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
315f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
31600 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
31610 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
31620 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
31630 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
31640 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
31650 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
31660 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31670 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
31680 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
31690 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
316a0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
316b0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
316c0 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
316d0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
316e0 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
316f0 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
31700 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
31710 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
31720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31730 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
31740 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
31750 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
31760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
31770 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
31780 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
31790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
317a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
317b0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
317c0 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
317d0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
317e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
317f0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
31800 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
31810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31820 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
31830 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
31840 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
31850 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
31860 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
31870 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
31880 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
31890 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
318a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
318b0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
318c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
318d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
318e0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
318f0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
31900 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
31910 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
31920 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
31930 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
31940 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
31950 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
31960 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
31970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31980 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
31990 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
319a0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
319b0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
319c0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
319d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
319e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
319f0 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
31a00 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
31a10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31a20 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
31a30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31a40 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
31a50 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
31a60 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
31a70 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
31a80 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
31a90 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
31aa0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31ab0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
31ac0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
31ad0 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
31ae0 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
31af0 0a 09 09 09 66 6f 72 20 28 72 65 73 69 7a 65 52  ....for (resizeR
31b00 65 74 72 79 20 3d 20 30 3b 20 72 65 73 69 7a 65  etry = 0; resize
31b10 52 65 74 72 79 20 3c 20 31 31 3b 20 72 65 73 69  Retry < 11; resi
31b20 7a 65 52 65 74 72 79 2b 2b 29 20 7b 0a 09 09 09  zeRetry++) {....
31b30 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 30 3b  .needResize = 0;
31b40 0a 09 09 09 09 69 66 20 28 28 63 61 63 6b 65 79  .....if ((cackey
31b50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
31b60 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
31b70 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20   + ulPartLen) > 
31b80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31b90 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
31ba0 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 09 6e 65  uflen) {......ne
31bb0 65 64 52 65 73 69 7a 65 20 3d 20 31 3b 0a 09 09  edResize = 1;...
31bc0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 21 6e 65  ..}......if (!ne
31bd0 65 64 52 65 73 69 7a 65 29 20 7b 0a 09 09 09 09  edResize) {.....
31be0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
31bf0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31c00 50 52 49 4e 54 46 28 22 52 65 73 69 7a 69 6e 67  PRINTF("Resizing
31c10 20 73 69 67 6e 69 6e 67 20 62 75 66 66 65 72 20   signing buffer 
31c20 28 74 72 79 20 23 25 69 20 6f 66 20 31 30 20 2d  (try #%i of 10 -
31c30 2d 20 31 31 74 68 20 69 73 20 66 61 74 61 6c 29  - 11th is fatal)
31c40 22 2c 20 72 65 73 69 7a 65 52 65 74 72 79 29 3b  ", resizeRetry);
31c50 0a 0a 09 09 09 09 69 66 20 28 72 65 73 69 7a 65  ......if (resize
31c60 52 65 74 72 79 20 3d 3d 20 31 30 29 20 7b 0a 09  Retry == 10) {..
31c70 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
31c80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31c90 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 0a 09  n].sign_buf);...
31ca0 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
31cb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31cc0 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 30 3b 0a 09  gn_buflen = 0;..
31cd0 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
31ce0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31cf0 67 6e 5f 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a  gn_buf = NULL;..
31d00 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
31d10 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  }......cackey_se
31d20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31d30 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20  .sign_buflen *= 
31d40 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  2;......cackey_s
31d50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
31d60 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61  ].sign_buf = rea
31d70 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73  lloc(cackey_sess
31d80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31d90 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  ign_buf, sizeof(
31da0 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
31db0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31dc0 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
31dd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31de0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09  .sign_buflen);..
31df0 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b  ..}.....if (cack
31e00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
31e10 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
31e20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 61  = NULL) {.....ca
31e30 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
31e40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
31e50 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
31e60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31e70 6f 72 2e 20 20 53 69 67 6e 69 6e 67 20 62 75 66  or.  Signing buf
31e80 66 65 72 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  fer is NULL.");.
31e90 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
31ea0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
31eb0 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28  ...}.....memcpy(
31ec0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31ed0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
31ee0 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73  uf + cackey_sess
31ef0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31f00 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61  ign_bufused, pPa
31f10 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a  rt, ulPartLen);.
31f20 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
31f30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31f40 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c  gn_bufused += ul
31f50 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65  PartLen;.....bre
31f60 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ak;..}...mutex_r
31f70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
31f80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
31f90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
31fa0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
31fb0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
31fc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31fd0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
31fe0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
31ff0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
32000 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
32010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32020 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
32030 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
32040 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
32050 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
32060 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
32070 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28  V, C_SignFinal)(
32080 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
32090 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
320a0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
320b0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
320c0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
320d0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
320e0 59 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d  YTE sigbuf[1024]
320f0 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75  ;..ssize_t sigbu
32100 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
32110 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
32120 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
32130 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
32140 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  t terminate_sign
32150 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78   = 1;..int mutex
32160 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
32170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32180 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
32190 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
321a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
321b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
321c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
321d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
321e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
321f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
32200 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
32210 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20  SignatureLen == 
32220 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
32230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
32240 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75  rror. pulSignatu
32250 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  reLen is NULL.")
32260 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
32270 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
32280 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
32290 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
322a0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
322b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
322c0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
322d0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
322e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
322f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
32300 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
32310 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
32320 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
32330 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
32340 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
32350 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
32360 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
32370 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
32380 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
32390 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
323a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
323b0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
323c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
323d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
323e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
323f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32400 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
32410 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
32420 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
32430 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
32440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
32450 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
32460 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
32470 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
32480 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
32490 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
324a0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
324b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
324c0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
324d0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
324e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
324f0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
32500 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
32510 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
32520 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
32530 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
32540 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
32550 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
32560 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32570 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
32580 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
32590 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
325a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
325b0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
325c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
325d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
325e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
325f0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
32600 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
32610 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
32620 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
32630 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
32640 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
32650 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
32660 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
32670 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
32680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32690 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
326a0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
326b0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
326c0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
326d0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
326e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
326f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
32700 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
32710 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
32720 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
32730 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32740 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
32750 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
32760 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
32770 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20  ..../* Ask card 
32780 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41  to sign */....CA
32790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
327a0 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67  F("Asking to sig
327b0 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20  n from identity 
327c0 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c  %p in session %l
327d0 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63  u", (void *) cac
327e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
327f0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
32800 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  tity, (unsigned 
32810 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b  long) hSession);
32820 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
32830 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
32840 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
32850 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
32860 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
32870 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
32880 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  y, cackey_sessio
32890 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
328a0 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65  n_buf, cackey_se
328b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
328c0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73  .sign_bufused, s
328d0 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  igbuf, sizeof(si
328e0 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09  gbuf), 1, 0);...
328f0 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
32900 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
32910 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61  _NEEDLOGIN && ca
32920 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
32930 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
32940 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78  if (C_LoginMutex
32950 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b  Arg(hSession, CK
32960 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c  U_USER, NULL, 0,
32970 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b   0) == CKR_OK) {
32980 0a 09 09 09 09 09 73 69 67 62 75 66 6c 65 6e 20  ......sigbuflen 
32990 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
329a0 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
329b0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
329c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
329d0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
329e0 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ity, cackey_sess
329f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
32a00 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f  ign_buf, cackey_
32a10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32a20 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
32a30 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28   sigbuf, sizeof(
32a40 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a  sigbuf), 1, 0);.
32a50 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
32a60 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30  f (sigbuflen < 0
32a70 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69  ) {...../* Signi
32a80 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  ng failed. */...
32a90 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
32aa0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
32ab0 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
32ac0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
32ad0 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
32ae0 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
32af0 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20  f (sigbuflen == 
32b00 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
32b10 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
32b20 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44  ..retval = CKR_D
32b30 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09  EVICE_REMOVED;..
32b40 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
32b50 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45  .retval = CKR_GE
32b60 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09  NERAL_ERROR;....
32b70 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  .}....} else if 
32b80 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
32b90 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a  ) sigbuflen) > *
32ba0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
32bb0 26 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b  && pSignature) {
32bc0 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64  ...../* Signed d
32bd0 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  ata too large */
32be0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
32bf0 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c  G_PRINTF("retval
32c00 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
32c10 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66  O_SMALL;  sigbuf
32c20 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69  len = %lu, pulSi
32c30 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75  gnatureLen = %lu
32c40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
32c50 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75  g) sigbuflen, (u
32c60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70  nsigned long) *p
32c70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b  ulSignatureLen);
32c80 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
32c90 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
32ca0 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e  ALL;......termin
32cb0 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09  ate_sign = 0;...
32cc0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65  .} else {.....te
32cd0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
32ce0 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e  ;......if (pSign
32cf0 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65  ature) {......me
32d00 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c  mcpy(pSignature,
32d10 20 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c   sigbuf, sigbufl
32d20 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69  en);.......termi
32d30 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
32d40 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69  ...}......*pulSi
32d50 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67  gnatureLen = sig
32d60 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
32d70 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
32d80 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
32d90 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65  ...if (terminate
32da0 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63  _sign) {...if (c
32db0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32dc0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
32dd0 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  f) {....free(cac
32de0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32df0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
32e00 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
32e10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32e20 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
32e30 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
32e40 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
32e50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
32e60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
32e70 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
32e80 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
32e90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32ea0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
32eb0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
32ec0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
32ed0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
32ee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32ef0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
32f00 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
32f10 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
32f20 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
32f30 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
32f40 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
32f50 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
32f60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
32f70 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
32f80 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
32f90 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
32fa0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
32fb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
32fc0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
32fd0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
32fe0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
32ff0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
33000 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
33010 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
33020 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
33030 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
33040 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
33050 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
33060 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
33070 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
33080 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
33090 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
330a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
330b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
330c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
330d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
330e0 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
330f0 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  er)(CK_SESSION_H
33100 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
33110 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
33120 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
33130 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
33140 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
33150 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
33160 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
33170 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33180 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33190 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
331a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
331b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
331c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
331d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
331e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
331f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33200 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33210 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33220 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33230 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33240 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
33250 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33260 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
33270 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
33280 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33290 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
332a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
332b0 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f  _VerifyInit)(CK_
332c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
332d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
332e0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
332f0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
33300 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
33310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33320 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33330 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33340 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33360 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33370 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33380 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33390 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
333a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
333b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
333c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
333d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
333e0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
333f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33400 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
33410 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
33420 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33430 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33440 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33450 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53  _Verify)(CK_SESS
33460 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
33470 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
33480 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
33490 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
334a0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
334b0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
334c0 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
334d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
334e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
334f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33500 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33520 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33530 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33540 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33550 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33560 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33580 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33590 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
335a0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
335b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
335c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
335d0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
335e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
335f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33600 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33610 5f 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  _VerifyUpdate)(C
33620 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
33630 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
33640 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
33650 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
33660 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
33670 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
33680 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
33690 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
336a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
336b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
336c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
336d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
336e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
336f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
33700 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33710 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
33720 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
33730 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
33740 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
33750 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33760 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
33770 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33780 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
33790 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
337a0 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61  RV, C_VerifyFina
337b0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
337c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
337d0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
337e0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
337f0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
33800 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
33810 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
33820 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
33830 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
33840 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33850 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
33860 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
33870 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33880 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33890 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
338a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
338b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
338c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
338d0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
338e0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
338f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
33900 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
33910 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33920 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
33930 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
33940 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
33950 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
33960 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33970 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
33980 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
33990 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
339a0 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
339b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
339c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
339d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
339e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
339f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33a00 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
33a10 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
33a20 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
33a30 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
33a40 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
33a50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33a60 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33a70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33a80 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
33a90 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33aa0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
33ab0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33ac0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
33ad0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
33ae0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
33af0 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  yRecover)(CK_SES
33b00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33b10 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
33b20 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
33b30 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
33b40 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  reLen, CK_BYTE_P
33b50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
33b60 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65  NG_PTR pulDataLe
33b70 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
33b80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
33b90 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
33ba0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
33bb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
33bc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
33bd0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
33be0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
33bf0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
33c00 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
33c10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
33c20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
33c30 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
33c40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
33c50 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
33c60 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33c70 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
33c80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33c90 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
33ca0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
33cb0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63  _RV, C_DigestEnc
33cc0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
33cd0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
33ce0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
33cf0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
33d00 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
33d10 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
33d20 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
33d30 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
33d40 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
33d50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33d60 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33d70 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33d80 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33d90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33da0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33db0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33dc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33dd0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33de0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33df0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33e00 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33e10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33e20 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
33e30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33e40 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
33e50 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
33e60 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33e70 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33e80 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33e90 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
33ea0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
33eb0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
33ec0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
33ed0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
33ee0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
33ef0 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
33f00 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
33f10 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
33f20 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
33f30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
33f40 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
33f50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
33f60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
33f70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33f80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
33f90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
33fa0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
33fb0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
33fc0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
33fd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33fe0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33ff0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34000 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
34010 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34020 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
34030 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34040 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
34050 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
34060 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45  N(CK_RV, C_SignE
34070 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
34080 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
34090 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
340a0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
340b0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
340c0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
340d0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
340e0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
340f0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
34100 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34110 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
34120 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
34130 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
34140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34150 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
34160 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
34170 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
34180 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
34190 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
341a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
341b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
341c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
341d0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
341e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
341f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
34200 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
34210 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34220 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
34230 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
34240 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79   C_DecryptVerify
34250 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
34260 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
34270 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
34280 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
34290 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
342a0 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
342b0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
342c0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
342d0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
342e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
342f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
34300 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
34310 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
34320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34330 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
34340 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
34350 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
34360 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
34370 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
34380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
34390 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
343a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
343b0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
343c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
343d0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
343e0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
343f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
34400 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
34410 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
34420 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53  erateKey)(CK_SES
34430 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
34440 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
34450 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
34460 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
34470 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
34480 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
34490 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
344a0 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
344b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
344c0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
344d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
344e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
344f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34500 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
34510 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
34520 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
34530 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
34540 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
34550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34560 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
34570 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34580 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
34590 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
345a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
345b0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
345c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
345d0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
345e0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
345f0 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
34600 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
34610 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
34620 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
34630 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
34640 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62  TRIBUTE_PTR pPub
34650 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  licKeyTemplate, 
34660 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69  CK_ULONG ulPubli
34670 63 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  cKeyAttributeCou
34680 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  nt, CK_ATTRIBUTE
34690 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79  _PTR pPrivateKey
346a0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
346b0 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41  NG ulPrivateKeyA
346c0 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
346d0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
346e0 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c  PTR phPublicKey,
346f0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
34700 45 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b  E_PTR phPrivateK
34710 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
34720 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
34730 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
34740 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
34750 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
34760 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
34770 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
34780 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
34790 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
347a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
347b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
347c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
347d0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
347e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
347f0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
34800 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
34810 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
34820 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34830 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
34840 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
34850 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29  K_RV, C_WrapKey)
34860 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
34870 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
34880 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
34890 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
348a0 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70  ECT_HANDLE hWrap
348b0 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  pingKey, CK_OBJE
348c0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20  CT_HANDLE hKey, 
348d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
348e0 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
348f0 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64  G_PTR pulWrapped
34900 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  KeyLen) {..CACKE
34910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34920 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
34930 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
34940 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
34950 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
34960 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
34970 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
34980 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
34990 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
349a0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
349b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
349c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
349d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
349e0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
349f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
34a00 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
34a10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34a20 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
34a30 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
34a40 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72  ON(CK_RV, C_Unwr
34a50 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
34a60 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
34a70 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
34a80 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
34a90 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
34aa0 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c   hUnwrappingKey,
34ab0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72   CK_BYTE_PTR pWr
34ac0 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f  appedKey, CK_ULO
34ad0 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c  NG ulWrappedKeyL
34ae0 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  en, CK_ATTRIBUTE
34af0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
34b00 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69  CK_ULONG ulAttri
34b10 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
34b20 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
34b30 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
34b40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
34b50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
34b60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
34b70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
34b80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
34b90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
34ba0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
34bb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
34bc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
34bd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
34be0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
34bf0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
34c00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34c10 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
34c20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34c30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
34c40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34c50 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
34c60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
34c70 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76  N(CK_RV, C_Deriv
34c80 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  eKey)(CK_SESSION
34c90 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
34ca0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
34cb0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
34cc0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
34cd0 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54  hBaseKey, CK_ATT
34ce0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
34cf0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
34d00 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
34d10 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
34d20 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
34d30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34d40 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
34d50 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
34d60 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
34d70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34d80 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
34d90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
34da0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
34db0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
34dc0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
34dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34de0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
34df0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34e00 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
34e10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34e20 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
34e30 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
34e40 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
34e50 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
34e60 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
34e70 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f  _SeedRandom)(CK_
34e80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
34e90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
34ea0 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55  _PTR pSeed, CK_U
34eb0 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20  LONG ulSeedLen) 
34ec0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
34ed0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
34ee0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
34ef0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
34f00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34f10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
34f20 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
34f30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
34f40 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
34f50 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
34f60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34f70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
34f80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34f90 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
34fa0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
34fb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
34fc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
34fd0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34fe0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
34ff0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
35000 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  , C_GenerateRand
35010 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
35020 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
35030 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e  CK_BYTE_PTR pRan
35040 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  domData, CK_ULON
35050 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b  G ulRandomLen) {
35060 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35070 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
35080 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
35090 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
350a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
350b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
350c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
350d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
350e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
350f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
35100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35110 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
35120 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
35130 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
35140 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
35150 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
35160 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
35170 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
35180 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63  D);.}../* Deprec
35190 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
351a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
351b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
351c0 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28  FunctionStatus)(
351d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
351e0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
351f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
35200 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
35210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35220 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
35230 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
35240 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
35250 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
35260 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
35270 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
35280 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
35290 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
352a0 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
352b0 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
352c0 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
352d0 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20  ../* Deprecated 
352e0 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44  Function */.CK_D
352f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
35300 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75  K_RV, C_CancelFu
35310 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  nction)(CK_SESSI
35320 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
35330 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
35340 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
35350 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
35360 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
35370 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
35380 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
35390 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
353a0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
353b0 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
353c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
353d0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
353e0 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
353f0 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
35400 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
35410 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
35420 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
35430 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
35440 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49  nList)(CK_FUNCTI
35450 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20  ON_LIST_PTR_PTR 
35460 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20  ppFunctionList) 
35470 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 46 55 4e  {..static CK_FUN
35480 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 73  CTION_LIST_PTR s
35490 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
354a0 4e 55 4c 4c 3b 0a 09 43 4b 5f 46 55 4e 43 54 49  NULL;..CK_FUNCTI
354b0 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e  ON_LIST_PTR pFun
354c0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43  ctionList;...CAC
354d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
354e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
354f0 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  f (ppFunctionLis
35500 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
35510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
35520 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e  TF("Error. ppFun
35530 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c  ctionList is NUL
35540 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
35550 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
35560 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 70 46  D);..}...if (spF
35570 75 6e 63 74 69 6f 6e 4c 69 73 74 20 21 3d 20 4e  unctionList != N
35580 55 4c 4c 29 20 7b 0a 09 09 2a 70 70 46 75 6e 63  ULL) {...*ppFunc
35590 74 69 6f 6e 4c 69 73 74 20 3d 20 73 70 46 75 6e  tionList = spFun
355a0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 09 43 41  ctionList;....CA
355b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
355c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
355d0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
355e0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
355f0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  R_OK);..}...pFun
35600 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
35610 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
35620 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
35630 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
35640 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
35650 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
35660 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
35670 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
35680 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
35690 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
356a0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
356b0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
356c0 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
356d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
356e0 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
356f0 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
35700 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
35710 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
35720 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35730 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
35740 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
35750 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
35760 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
35770 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
35780 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
35790 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
357a0 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
357b0 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
357c0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
357d0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
357e0 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
357f0 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
35800 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
35810 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35820 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
35830 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
35840 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
35850 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
35860 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
35870 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
35880 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35890 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
358a0 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
358b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
358c0 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
358d0 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
358e0 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
358f0 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
35900 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
35910 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
35920 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
35930 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
35940 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
35950 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
35960 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
35970 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
35980 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
35990 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
359a0 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
359b0 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
359c0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
359d0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
359e0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
359f0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
35a00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35a10 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
35a20 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
35a30 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
35a40 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
35a50 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
35a60 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35a70 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
35a80 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
35a90 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
35aa0 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
35ab0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
35ac0 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
35ad0 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
35ae0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
35af0 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
35b00 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
35b10 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
35b20 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
35b30 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
35b40 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
35b50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
35b60 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
35b70 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
35b80 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
35b90 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
35ba0 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
35bb0 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
35bc0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35bd0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
35be0 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
35bf0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
35c00 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
35c10 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
35c20 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
35c30 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
35c40 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
35c50 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
35c60 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35c70 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
35c80 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
35c90 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
35ca0 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
35cb0 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
35cc0 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
35cd0 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
35ce0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
35cf0 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
35d00 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
35d10 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
35d20 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
35d30 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
35d40 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
35d50 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
35d60 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
35d70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35d80 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
35d90 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
35da0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35db0 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
35dc0 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
35dd0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35de0 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
35df0 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
35e00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35e10 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
35e20 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
35e30 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
35e40 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
35e50 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
35e60 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
35e70 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
35e80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35e90 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
35ea0 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
35eb0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35ec0 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
35ed0 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
35ee0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
35ef0 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
35f00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
35f10 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
35f20 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
35f30 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
35f40 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
35f50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35f60 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
35f70 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
35f80 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
35f90 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
35fa0 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
35fb0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
35fc0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
35fd0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
35fe0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
35ff0 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
36000 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
36010 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
36020 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
36030 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
36040 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
36050 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
36060 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
36070 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
36080 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  yRecoverInit = C
36090 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
360a0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
360b0 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
360c0 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65  ver = C_VerifyRe
360d0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
360e0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45  nList->C_DigestE
360f0 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
36100 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
36110 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
36120 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44  List->C_DecryptD
36130 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
36140 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  Decry