Hex Artifact Content

Artifact a17e1982daae24fe5bd408c6071738784a6ea8c7:


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 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20  r_p = buf_user; 
1a50: 5c 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65  \..buf_user_size
1a60: 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73   = sizeof(buf_us
1a70: 65 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78  er); \..for (idx
1a80: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 79 29 3b   = 0; idx < (y);
1a90: 20 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66   idx++) { \...if
1aa0: 20 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20   (buf_user_size 
1ab0: 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65  <= 0) { \....bre
1ac0: 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73  ak; \...}; \...s
1ad0: 6e 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e  nprintf_ret = sn
1ae0: 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f  printf(buf_user_
1af0: 70 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65  p, buf_user_size
1b00: 2c 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42  , ", %02x", TMPB
1b10: 55 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66  UF[idx]); \...if
1b20: 20 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c   (snprintf_ret <
1b30: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1b40: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75  k; \...}; \...bu
1b50: 66 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72  f_user_p += snpr
1b60: 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75  intf_ret; \...bu
1b70: 66 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73  f_user_size -= s
1b80: 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09  nprintf_ret; \..
1b90: 7d 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  }; \..buf_user[s
1ba0: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1bb0: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
1bc0: 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74 20 3d  buf_user_print =
1bd0: 20 62 75 66 5f 75 73 65 72 20 2b 20 32 3b 20 5c   buf_user + 2; \
1be0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
1bf0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25  _debug_fd(), "[%
1c00: 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73  lu]: %s():%i: %s
1c10: 20 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25 73 7d    (%s/%lu = {%s}
1c20: 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  )\n", CACKEY_DEB
1c30: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f  UG_GETTIME(), __
1c40: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
1c50: 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e  , f, #x, (unsign
1c60: 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 62 75  ed long) (y), bu
1c70: 66 5f 75 73 65 72 5f 70 72 69 6e 74 29 3b 20 5c  f_user_print); \
1c80: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
1c90: 64 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d  debug_fd()); \.}
1ca0: 0a 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28  .#  define free(
1cb0: 78 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55  x) { CACKEY_DEBU
1cc0: 47 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25  G_PRINTF("FREE(%
1cd0: 70 29 20 28 25 73 29 22 2c 20 28 76 6f 69 64 20  p) (%s)", (void 
1ce0: 2a 29 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28  *) x, #x); free(
1cf0: 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 46 49  x); }..static FI
1d00: 4c 45 20 2a 63 61 63 6b 65 79 5f 64 65 62 75 67  LE *cackey_debug
1d10: 5f 66 64 28 76 6f 69 64 29 20 7b 0a 09 73 74 61  _fd(void) {..sta
1d20: 74 69 63 20 46 49 4c 45 20 2a 66 64 20 3d 20 4e  tic FILE *fd = N
1d30: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c 6f 67 66  ULL;..char *logf
1d40: 69 6c 65 3b 0a 0a 09 69 66 20 28 66 64 20 21 3d  ile;...if (fd !=
1d50: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
1d60: 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  n(fd);..}.../*..
1d70: 20 2a 20 4c 6f 67 20 74 6f 20 73 74 64 65 72 72   * Log to stderr
1d80: 20 69 6e 69 74 69 61 6c 6c 79 20 73 6f 20 77 65   initially so we
1d90: 20 63 61 6e 20 75 73 65 20 64 65 62 75 67 67 69   can use debuggi
1da0: 6e 67 20 77 69 74 68 69 6e 0a 09 20 2a 20 74 68  ng within.. * th
1db0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
1dc0: 6f 75 74 20 67 65 74 74 69 6e 67 20 69 6e 74 6f  out getting into
1dd0: 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f   an infinite loo
1de0: 70 0a 09 20 2a 2f 0a 09 66 64 20 3d 20 73 74 64  p.. */..fd = std
1df0: 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d  err;...logfile =
1e00: 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f   getenv("CACKEY_
1e10: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b  DEBUG_LOGFILE");
1e20: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1e30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e50: 46 6f 75 6e 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  Found environmen
1e60: 74 20 76 61 72 69 61 62 6c 65 3a 20 25 73 22 2c  t variable: %s",
1e70: 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f   logfile);....lo
1e80: 67 66 69 6c 65 20 3d 20 73 74 72 63 68 72 28 6c  gfile = strchr(l
1e90: 6f 67 66 69 6c 65 2c 20 27 3d 27 29 3b 0a 09 09  ogfile, '=');...
1ea0: 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e  if (logfile == N
1eb0: 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 66 69 6c  ULL) {....logfil
1ec0: 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b  e = getenv("CACK
1ed0: 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45  EY_DEBUG_LOGFILE
1ee0: 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ");...} else {..
1ef0: 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d  ..logfile++;...}
1f00: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
1f10: 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45  EY_DEBUG_LOGFILE
1f20: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d  ..if (logfile ==
1f30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c 6f 67 66 69   NULL) {...logfi
1f40: 6c 65 20 3d 20 43 41 43 4b 45 59 5f 44 45 42 55  le = CACKEY_DEBU
1f50: 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09 7d 0a 23 65  G_LOGFILE;..}.#e
1f60: 6e 64 69 66 0a 0a 09 69 66 20 28 6c 6f 67 66 69  ndif...if (logfi
1f70: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le != NULL) {...
1f80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f90: 4e 54 46 28 22 46 6f 75 6e 64 20 6c 6f 67 20 66  NTF("Found log f
1fa0: 69 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c  ile: %s", logfil
1fb0: 65 29 3b 0a 0a 09 09 66 64 20 3d 20 66 6f 70 65  e);....fd = fope
1fc0: 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 61 22 29 3b  n(logfile, "a");
1fd0: 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20  ..}...if (fd == 
1fe0: 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 20 3d 20 73  NULL) {...fd = s
1ff0: 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 69 66 20 28  tderr;..}...if (
2000: 66 64 20 3d 3d 20 73 74 64 65 72 72 29 20 7b 0a  fd == stderr) {.
2010: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2020: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2030: 20 73 74 64 65 72 72 22 29 3b 0a 09 7d 20 65 6c   stderr");..} el
2040: 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
2050: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2060: 72 6e 69 6e 67 20 25 70 22 2c 20 28 76 6f 69 64  rning %p", (void
2070: 20 2a 29 20 66 64 29 3b 0a 09 7d 0a 0a 09 72 65   *) fd);..}...re
2080: 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 73 74 61  turn(fd);.}..sta
2090: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
20a0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
20b0: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
20c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
20d0: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
20e0: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
20f0: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
2100: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
2110: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2120: 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a  ), "[%lu]: %s():
2130: 25 69 3a 20 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  %i: MALLOC() = %
2140: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2150: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2160: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
2170: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
2180: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
2190: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
21a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
21b0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
21c0: 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20  NC_REALLOC(void 
21d0: 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a  *ptr, size_t siz
21e0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  e, const char *f
21f0: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
2200: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
2210: 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
2220: 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a  oc(ptr, size);..
2230: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70  .if (retval != p
2240: 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  tr) {...fprintf(
2250: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2260: 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a  ), "[%lu]: %s():
2270: 25 69 3a 20 52 45 41 4c 4c 4f 43 28 25 70 29 20  %i: REALLOC(%p) 
2280: 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f  = %p\n", CACKEY_
2290: 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c  DEBUG_GETTIME(),
22a0: 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 70 74 72   func, line, ptr
22b0: 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 66 6c  , retval);...ffl
22c0: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
22d0: 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a 09 69 66 20  _fd());..}...if 
22e0: 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29  (retval == NULL)
22f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2300: 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45  G_PRINTF(" *** E
2310: 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63  RROR *** realloc
2320: 20 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28   returned NULL (
2330: 73 69 7a 65 20 3d 20 25 6c 75 29 22 2c 20 28 75  size = %lu)", (u
2340: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
2350: 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ze);..}...return
2360: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
2370: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59  tic char *CACKEY
2380: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
2390: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  UP(const char *p
23a0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
23b0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
23c0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b  {..char *retval;
23d0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
23e0: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e  up(ptr);...fprin
23f0: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
2400: 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73  fd(), "[%lu]: %s
2410: 28 29 3a 25 69 3a 20 53 54 52 44 55 50 5f 4d 41  ():%i: STRDUP_MA
2420: 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e 22 2c 20  LLOC() = %p\n", 
2430: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54  CACKEY_DEBUG_GET
2440: 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69  TIME(), func, li
2450: 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 66  ne, retval);..ff
2460: 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75  lush(cackey_debu
2470: 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74 75 72  g_fd());...retur
2480: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
2490: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
24a0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
24b0: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e  NC_TAG_TO_STR(un
24c0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 29  signed char tag)
24d0: 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67 29   {..switch (tag)
24e0: 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f   {...case GSCIS_
24f0: 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72  TAG_CARDID:....r
2500: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2510: 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73  _CARDID");...cas
2520: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
2530: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
2540: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45  GSCIS_TAG_CCC_VE
2550: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2560: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09  S_TAG_CCG_VER:..
2570: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2580: 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09  TAG_CCG_VER");..
2590: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
25a0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75  CARDURL:....retu
25b0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
25c0: 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20  RDURL");...case 
25d0: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
25e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
25f0: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b  IS_TAG_PKCS15");
2600: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2610: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
2620: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2630: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
2640: 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  MODEL");...case 
2650: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
2660: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
2670: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
2680: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  BLE");...case GS
2690: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
26a0: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
26b0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
26c0: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
26d0: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f  S_TAG_REDIRECTIO
26e0: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
26f0: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
2700: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ION");...case GS
2710: 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72  CIS_TAG_CT:....r
2720: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2730: 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _CT");...case GS
2740: 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72  CIS_TAG_ST:....r
2750: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2760: 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _ST");...case GS
2770: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a  CIS_TAG_NEXTCCC:
2780: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2790: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b  S_TAG_NEXTCCC");
27a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
27b0: 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_FNAME:....retu
27c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e  rn("GSCIS_TAG_FN
27d0: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
27e0: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09  CIS_TAG_MNAME:..
27f0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2800: 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_MNAME");...c
2810: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e  ase GSCIS_TAG_LN
2820: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
2830: 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22  GSCIS_TAG_LNAME"
2840: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2850: 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72  TAG_SUFFIX:....r
2860: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2870: 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73  _SUFFIX");...cas
2880: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54  e GSCIS_TAG_GOVT
2890: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
28a0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f  rn("GSCIS_TAG_GO
28b0: 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  VT_AGENCY");...c
28c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
28d0: 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28  REAU:....return(
28e0: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41  "GSCIS_TAG_BUREA
28f0: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
2900: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44  S_TAG_BUREAU_COD
2910: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2920: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
2930: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
2940: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
2950: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2960: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
2970: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2980: 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09  S_TAG_TITLE:....
2990: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
29a0: 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73  G_TITLE");...cas
29b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
29c0: 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28  DING:....return(
29d0: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44  "GSCIS_TAG_BUILD
29e0: 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ING");...case GS
29f0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
2a00: 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  DDR1:....return(
2a10: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2a20: 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73  E_ADDR1");...cas
2a30: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2a40: 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74  CE_ADDR2:....ret
2a50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2a60: 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09  FFICE_ADDR2");..
2a70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2a80: 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09  OFFICE_CITY:....
2a90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2aa0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b  G_OFFICE_CITY");
2ab0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2ac0: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a  G_OFFICE_STATE:.
2ad0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2ae0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
2af0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2b00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
2b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b20: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
2b30: 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  P");...case GSCI
2b40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
2b50: 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  NTRY:....return(
2b60: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b70: 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63  E_COUNTRY");...c
2b80: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2b90: 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72  FICE_PHONE:....r
2ba0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2bb0: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b  _OFFICE_PHONE");
2bc0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2bd0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
2be0: 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  XT:....return("G
2bf0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2c00: 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63  PHONE_EXT");...c
2c10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2c20: 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74  FICE_FAX:....ret
2c30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2c40: 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63  FFICE_FAX");...c
2c50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2c60: 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72  FICE_EMAIL:....r
2c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c80: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b  _OFFICE_EMAIL");
2c90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2ca0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09  G_OFFICE_ROOM:..
2cb0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2cc0: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22  TAG_OFFICE_ROOM"
2cd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ce0: 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43  TAG_NONGOV_AGENC
2cf0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2d00: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2d10: 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20  GENCY");...case 
2d20: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
2d30: 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74  SIGNATOR:....ret
2d40: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
2d50: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b  SN_DESIGNATOR");
2d60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2d70: 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e  G_SSN:....return
2d80: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22  ("GSCIS_TAG_SSN"
2d90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2da0: 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75  TAG_DOB:....retu
2db0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2dc0: 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  B");...case GSCI
2dd0: 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09  S_TAG_GENDER:...
2de0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2df0: 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63  AG_GENDER");...c
2e00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53  ase GSCIS_TAG_US
2e10: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2e20: 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49  "GSCIS_TAG_USERI
2e30: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2e40: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09  S_TAG_DOMAIN:...
2e50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2e60: 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63  AG_DOMAIN");...c
2e70: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41  ase GSCIS_TAG_PA
2e80: 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72  SSWORD:....retur
2e90: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53  n("GSCIS_TAG_PAS
2ea0: 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20  SWORD");...case 
2eb0: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52  GSCIS_TAG_ISSUER
2ec0: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2ed0: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49  SCIS_TAG_ISSUERI
2ee0: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2ef0: 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09  S_TAG_SERNO:....
2f00: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f10: 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73  G_SERNO");...cas
2f20: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2f30: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
2f40: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2f50: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  UE_DATE");...cas
2f60: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
2f70: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
2f80: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58  rn("GSCIS_TAG_EX
2f90: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  PIRE_DATE");...c
2fa0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2fb0: 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  RD_TYPE:....retu
2fc0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2fd0: 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  RD_TYPE");...cas
2fe0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55  e GSCIS_TAG_SECU
2ff0: 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65  RITY_CODE:....re
3000: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
3010: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b  SECURITY_CODE");
3020: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3030: 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09  G_CARDID_AID:...
3040: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
3050: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b  AG_CARDID_AID");
3060: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3070: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
3080: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
3090: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 22  TAG_CERTIFICATE"
30a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
30b0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
30c0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
30d0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
30e0: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
30f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
3100: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  RT_EXPIRE_DATE:.
3110: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
3120: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
3130: 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  _DATE");..}...re
3140: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3150: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3160: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
3170: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
3180: 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65  R_TO_STR(LONG re
3190: 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68  tcode) {..switch
31a0: 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63   (retcode) {...c
31b0: 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43  ase SCARD_S_SUCC
31c0: 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ESS:....return("
31d0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22  SCARD_S_SUCCESS"
31e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
31f0: 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09  E_CANCELLED:....
3200: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3210: 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63  CANCELLED");...c
3220: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54  ase SCARD_E_CANT
3230: 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74  _DISPOSE:....ret
3240: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
3250: 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63  T_DISPOSE");...c
3260: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55  ase SCARD_E_INSU
3270: 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a  FFICIENT_BUFFER:
3280: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3290: 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  D_E_INSUFFICIENT
32a0: 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73  _BUFFER");...cas
32b0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
32c0: 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e  D_ATR:....return
32d0: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
32e0: 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20  D_ATR");...case 
32f0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3300: 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72  HANDLE:....retur
3310: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
3320: 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63  ID_HANDLE");...c
3330: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3340: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09  LID_PARAMETER:..
3350: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3360: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
3370: 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TER");...case SC
3380: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
3390: 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  RGET:....return(
33a0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
33b0: 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73  _TARGET");...cas
33c0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
33d0: 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  D_VALUE:....retu
33e0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
33f0: 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63  LID_VALUE");...c
3400: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  ase SCARD_E_NO_M
3410: 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e  EMORY:....return
3420: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d  ("SCARD_E_NO_MEM
3430: 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ORY");...case SC
3440: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
3450: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
3460: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e  "SCARD_E_UNKNOWN
3470: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
3480: 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  e SCARD_E_TIMEOU
3490: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
34a0: 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b  ARD_E_TIMEOUT");
34b0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34c0: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
34d0: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  N:....return("SC
34e0: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
34f0: 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  OLATION");...cas
3500: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41  e SCARD_E_NO_SMA
3510: 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  RTCARD:....retur
3520: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d  n("SCARD_E_NO_SM
3530: 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ARTCARD");...cas
3540: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
3550: 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  N_CARD:....retur
3560: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
3570: 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  WN_CARD");...cas
3580: 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  e SCARD_E_PROTO_
3590: 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74  MISMATCH:....ret
35a0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f  urn("SCARD_E_PRO
35b0: 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09  TO_MISMATCH");..
35c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
35d0: 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75  T_READY:....retu
35e0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
35f0: 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20  READY");...case 
3600: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
3610: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
3620: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53  urn("SCARD_E_SYS
3630: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  TEM_CANCELLED");
3640: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3650: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a  NOT_TRANSACTED:.
3660: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3670: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
3680: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3690: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
36a0: 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  ILABLE:....retur
36b0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
36c0: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b  R_UNAVAILABLE");
36d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
36e0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
36f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3700: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
3710: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3720: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
3730: 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65  SIVE_CARD:....re
3740: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
3750: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22  RESPONSIVE_CARD"
3760: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3770: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
3780: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3790: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
37a0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
37b0: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
37c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
37d0: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22  RD_W_RESET_CARD"
37e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
37f0: 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a  W_REMOVED_CARD:.
3800: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3810: 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22  _W_REMOVED_CARD"
3820: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3830: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a  E_PCI_TOO_SMALL:
3840: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3850: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
3860: 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  L");...case SCAR
3870: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
3880: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72  PORTED:....retur
3890: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
38a0: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  R_UNSUPPORTED");
38b0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
38c0: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
38d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
38e0: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
38f0: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20  EADER");...case 
3900: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
3910: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
3920: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52  urn("SCARD_E_CAR
3930: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  D_UNSUPPORTED");
3940: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3950: 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72  NO_SERVICE:....r
3960: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
3970: 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63  O_SERVICE");...c
3980: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56  ase SCARD_E_SERV
3990: 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09  ICE_STOPPED:....
39a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
39b0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22  SERVICE_STOPPED"
39c0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
39d0: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
39e0: 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e  ATURE:....return
39f0: 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  ("SCARD_E_UNSUPP
3a00: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b  ORTED_FEATURE");
3a10: 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 57 5f  .#ifdef SCARD_W_
3a20: 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a 09 09  INSERTED_CARD...
3a30: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53  case SCARD_W_INS
3a40: 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ERTED_CARD:....r
3a50: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49  eturn("SCARD_W_I
3a60: 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a  NSERTED_CARD");.
3a70: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 43  #endif.#ifdef SC
3a80: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53  ARD_E_NO_READERS
3a90: 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73  _AVAILABLE...cas
3aa0: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  e SCARD_E_NO_REA
3ab0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a  DERS_AVAILABLE:.
3ac0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3ad0: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3ae0: 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69  AILABLE");.#endi
3af0: 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  f..}...return("U
3b00: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
3b10: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3b20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3b30: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75  C_OBJID_TO_STR(u
3b40: 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b  int16_t objid) {
3b50: 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29  ..switch (objid)
3b60: 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30 30   {...case 0x2000
3b70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3b80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45  KEY_TLV_OBJID_GE
3b90: 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  NERALINFO");...c
3ba0: 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72  ase 0x2100:....r
3bb0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3bc0: 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f  V_OBJID_PROPERSO
3bd0: 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  NALINFO");...cas
3be0: 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74  e 0x3000:....ret
3bf0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3c00: 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54  OBJID_ACCESSCONT
3c10: 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ROL");...case 0x
3c20: 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  4000:....return(
3c30: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3c40: 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73  D_LOGIN");...cas
3c50: 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74  e 0x5000:....ret
3c60: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3c70: 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29  OBJID_CARDINFO")
3c80: 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 30 3a  ;...case 0x6000:
3c90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3ca0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
3cb0: 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73  METRICS");...cas
3cc0: 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74  e 0x7000:....ret
3cd0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3ce0: 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47  OBJID_DIGITALSIG
3cf0: 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30  CERT");...case 0
3d00: 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x0200:....return
3d10: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3d20: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b  ID_CAC_PERSON");
3d30: 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a  ...case 0x0202:.
3d40: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d50: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3d60: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
3d70: 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65  se 0x0203:....re
3d80: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d90: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
3da0: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
3db0: 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65  se 0x0201:....re
3dc0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3dd0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3de0: 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30  NNEL");...case 0
3df0: 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e  x02FE:....return
3e00: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3e10: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29  ID_CAC_PKICERT")
3e20: 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22  ;..}....return("
3e30: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
3e40: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3e50: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
3e60: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
3e70: 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70  R(uint8_t apptyp
3e80: 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70  e) {..switch (ap
3e90: 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  ptype) {...case 
3ea0: 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x00:....return(
3eb0: 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20  "NONE");...case 
3ec0: 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x01:....return(
3ed0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3ee0: 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73  GENERIC");...cas
3ef0: 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72  e 0x02:....retur
3f00: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3f10: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_SKI");...case 
3f20: 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x03:....return(
3f30: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3f40: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
3f50: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3f60: 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09  ..case 0x04:....
3f70: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3f80: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3f90: 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65  case 0x05:....re
3fa0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3fb0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
3fc0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3fd0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36  I");...case 0x06
3fe0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3ff0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
4000: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
4010: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
4020: 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x07:....return("
4030: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
4040: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
4050: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41  TLV_APP_SKI | CA
4060: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
4070: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
4080: 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 73  "INVALID");.}..s
4090: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
40a0: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
40b0: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
40c0: 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42 55 54  _STR(CK_ATTRIBUT
40d0: 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b 0a 09  E_TYPE attr) {..
40e0: 73 77 69 74 63 68 20 28 61 74 74 72 29 20 7b 0a  switch (attr) {.
40f0: 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53  ..case CKA_CLASS
4100: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4110: 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61 73 65  _CLASS");...case
4120: 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 72   CKA_TOKEN:....r
4130: 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b 45 4e  eturn("CKA_TOKEN
4140: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4150: 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74 75 72  RIVATE:....retur
4160: 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45 22 29  n("CKA_PRIVATE")
4170: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42  ;...case CKA_LAB
4180: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  EL:....return("C
4190: 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09 63 61  KA_LABEL");...ca
41a0: 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41 54 49  se CKA_APPLICATI
41b0: 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ON:....return("C
41c0: 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 22 29  KA_APPLICATION")
41d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
41e0: 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  UE:....return("C
41f0: 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61  KA_VALUE");...ca
4200: 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  se CKA_OBJECT_ID
4210: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4220: 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a 09 09  _OBJECT_ID");...
4230: 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49  case CKA_CERTIFI
4240: 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 72 65  CATE_TYPE:....re
4250: 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54 49 46  turn("CKA_CERTIF
4260: 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a 09 09  ICATE_TYPE");...
4270: 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a  case CKA_ISSUER:
4280: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4290: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65  ISSUER");...case
42a0: 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
42b0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
42c0: 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
42d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
42e0: 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72 65 74  C_ISSUER:....ret
42f0: 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53 53 55  urn("CKA_AC_ISSU
4300: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4310: 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74 75 72  _OWNER:....retur
4320: 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29 3b 0a  n("CKA_OWNER");.
4330: 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54 52 5f  ..case CKA_ATTR_
4340: 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75 72 6e  TYPES:....return
4350: 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53  ("CKA_ATTR_TYPES
4360: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 54  ");...case CKA_T
4370: 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74 75 72  RUSTED:....retur
4380: 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44 22 29  n("CKA_TRUSTED")
4390: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59  ;...case CKA_KEY
43a0: 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e  _TYPE:....return
43b0: 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45 22 29  ("CKA_KEY_TYPE")
43c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ;...case CKA_SUB
43d0: 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  JECT:....return(
43e0: 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29 3b 0a  "CKA_SUBJECT");.
43f0: 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09  ..case CKA_ID:..
4400: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 44  ..return("CKA_ID
4410: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4420: 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74  ENSITIVE:....ret
4430: 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49 54 49  urn("CKA_SENSITI
4440: 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  VE");...case CKA
4450: 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72 65 74  _ENCRYPT:....ret
4460: 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59 50 54  urn("CKA_ENCRYPT
4470: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
4480: 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72  ECRYPT:....retur
4490: 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54 22 29  n("CKA_DECRYPT")
44a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57 52 41  ;...case CKA_WRA
44b0: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
44c0: 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65  A_WRAP");...case
44d0: 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09 09 09   CKA_UNWRAP:....
44e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e 57 52  return("CKA_UNWR
44f0: 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  AP");...case CKA
4500: 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75 72 6e  _SIGN:....return
4510: 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a 09 09  ("CKA_SIGN");...
4520: 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45  case CKA_SIGN_RE
4530: 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  COVER:....return
4540: 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  ("CKA_SIGN_RECOV
4550: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4560: 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65 74 75  _VERIFY:....retu
4570: 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 22 29  rn("CKA_VERIFY")
4580: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45 52  ;...case CKA_VER
4590: 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IFY_RECOVER:....
45a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49  return("CKA_VERI
45b0: 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09  FY_RECOVER");...
45c0: 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56 45 3a  case CKA_DERIVE:
45d0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
45e0: 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61 73 65  DERIVE");...case
45f0: 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 3a   CKA_START_DATE:
4600: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4610: 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a 09 09  START_DATE");...
4620: 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44 41 54  case CKA_END_DAT
4630: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4640: 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a 09 09  A_END_DATE");...
4650: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
4660: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4670: 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09 63 61  _MODULUS");...ca
4680: 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42  se CKA_MODULUS_B
4690: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
46a0: 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53  CKA_MODULUS_BITS
46b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
46c0: 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a  UBLIC_EXPONENT:.
46d0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
46e0: 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 22 29  UBLIC_EXPONENT")
46f0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4700: 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09  VATE_EXPONENT:..
4710: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
4720: 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 22 29  IVATE_EXPONENT")
4730: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4740: 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  ME_1:....return(
4750: 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29 3b 0a  "CKA_PRIME_1");.
4760: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
4770: 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  _2:....return("C
4780: 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a 09 09  KA_PRIME_2");...
4790: 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e  case CKA_EXPONEN
47a0: 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  T_1:....return("
47b0: 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 22 29  CKA_EXPONENT_1")
47c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50  ;...case CKA_EXP
47d0: 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65 74 75  ONENT_2:....retu
47e0: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  rn("CKA_EXPONENT
47f0: 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _2");...case CKA
4800: 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a 09 09  _COEFFICIENT:...
4810: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4f 45  .return("CKA_COE
4820: 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09 63 61  FFICIENT");...ca
4830: 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a 09 09  se CKA_PRIME:...
4840: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4850: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ME");...case CKA
4860: 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09 72 65  _SUBPRIME:....re
4870: 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50 52 49  turn("CKA_SUBPRI
4880: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ME");...case CKA
4890: 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75 72 6e  _BASE:....return
48a0: 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a 09 09  ("CKA_BASE");...
48b0: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 42  case CKA_PRIME_B
48c0: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
48d0: 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53 22 29  CKA_PRIME_BITS")
48e0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ;...case CKA_SUB
48f0: 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09  _PRIME_BITS:....
4900: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 5f  return("CKA_SUB_
4910: 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09  PRIME_BITS");...
4920: 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f 42  case CKA_VALUE_B
4930: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
4940: 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 22 29  CKA_VALUE_BITS")
4950: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
4960: 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74 75 72  UE_LEN:....retur
4970: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e  n("CKA_VALUE_LEN
4980: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4990: 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 72  XTRACTABLE:....r
49a0: 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54 52 41  eturn("CKA_EXTRA
49b0: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  CTABLE");...case
49c0: 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09 09 72   CKA_LOCAL:....r
49d0: 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43 41 4c  eturn("CKA_LOCAL
49e0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4e  ");...case CKA_N
49f0: 45 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45  EVER_EXTRACTABLE
4a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4a10: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42  _NEVER_EXTRACTAB
4a20: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  LE");...case CKA
4a30: 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56  _ALWAYS_SENSITIV
4a40: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4a50: 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49  A_ALWAYS_SENSITI
4a60: 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  VE");...case CKA
4a70: 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49  _KEY_GEN_MECHANI
4a80: 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SM:....return("C
4a90: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
4aa0: 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65 20 43  NISM");...case C
4ab0: 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09  KA_MODIFIABLE:..
4ac0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f  ..return("CKA_MO
4ad0: 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09 63 61  DIFIABLE");...ca
4ae0: 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50 41 52  se CKA_ECDSA_PAR
4af0: 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AMS:....return("
4b00: 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53  CKA_ECDSA_PARAMS
4b10: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4b20: 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65 74 75  C_POINT:....retu
4b30: 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49 4e 54  rn("CKA_EC_POINT
4b40: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4b50: 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a 0a 09  ECONDARY_AUTH:..
4b60: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45  ..return("CKA_SE
4b70: 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29 3b 0a  CONDARY_AUTH");.
4b80: 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54 48 5f  ..case CKA_AUTH_
4b90: 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09 72 65  PIN_FLAGS:....re
4ba0: 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48 5f 50  turn("CKA_AUTH_P
4bb0: 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09 63 61  IN_FLAGS");...ca
4bc0: 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54 55 52  se CKA_HW_FEATUR
4bd0: 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72  E_TYPE:....retur
4be0: 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54 55 52  n("CKA_HW_FEATUR
4bf0: 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65  E_TYPE");...case
4c00: 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e   CKA_RESET_ON_IN
4c10: 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  IT:....return("C
4c20: 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54  KA_RESET_ON_INIT
4c30: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48  ");...case CKA_H
4c40: 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72 65 74  AS_RESET:....ret
4c50: 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52 45 53  urn("CKA_HAS_RES
4c60: 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ET");...case CKA
4c70: 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 3a  _VENDOR_DEFINED:
4c80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4c90: 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 22 29  VENDOR_DEFINED")
4ca0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  ;..}...return("U
4cb0: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 20 20  NKNOWN");.}..#  
4cc0: 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29  define malloc(x)
4cd0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4ce0: 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66  NC_MALLOC(x, __f
4cf0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d00: 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61 6c 6c  .#  define reall
4d10: 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45 59 5f  oc(x, y) CACKEY_
4d20: 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c  DEBUG_FUNC_REALL
4d30: 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f  OC(x, y, __func_
4d40: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20  _, __LINE__).#  
4d50: 69 66 64 65 66 20 73 74 72 64 75 70 0a 23 20 20  ifdef strdup.#  
4d60: 20 20 75 6e 64 65 66 20 73 74 72 64 75 70 0a 23    undef strdup.#
4d70: 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66 69 6e    endif.#  defin
4d80: 65 20 73 74 72 64 75 70 28 78 29 20 43 41 43 4b  e strdup(x) CACK
4d90: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54  EY_DEBUG_FUNC_ST
4da0: 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f  RDUP(x, __func__
4db0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73  , __LINE__).#els
4dc0: 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  e.#  define CACK
4dd0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4de0: 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x...) /**/.#  de
4df0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4e00: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
4e10: 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69   y) /**/.#  defi
4e20: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e30: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
4e40: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4e50: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4e60: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4e70: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
4e80: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4e90: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4ea0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4eb0: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20  OBJID_TO_STR(x) 
4ec0: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4ed0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4ee0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50  Y_DEBUG_FUNC_APP
4ef0: 54 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22  TYPE_TO_STR(x) "
4f00: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
4f10: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4f20: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52  _DEBUG_FUNC_ATTR
4f30: 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 78 29 20  IBUTE_TO_STR(x) 
4f40: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4f50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49  .#endif../*. * I
4f60: 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f 75  nclude these sou
4f70: 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68 69  rce files in thi
4f80: 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75 6e  s translation un
4f90: 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  it so that we ca
4fa0: 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75 6e  n bind to. * fun
4fb0: 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20 69  ctions and not i
4fc0: 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62 6f  nclude any symbo
4fd0: 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ls in the output
4fe0: 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a   shared object..
4ff0: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61 73   */.#include "as
5000: 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63 6c  n1-x509.c".#incl
5010: 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69 6e  ude "sha1.c".#in
5020: 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a 74  clude "md5.c"..t
5030: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
5040: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
5050: 43 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59  C,..CACKEY_ID_TY
5060: 50 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f  PE_PIV,..CACKEY_
5070: 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
5080: 59 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  Y.} cackey_pcsc_
5090: 69 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74  id_type;..struct
50a0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
50b0: 6e 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f  ntity {..cackey_
50c0: 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f  pcsc_id_type id_
50d0: 74 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63  type;...size_t c
50e0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
50f0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
5100: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73  certificate;...s
5110: 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a  size_t keysize;.
5120: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75  ..union {...stru
5130: 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64  ct {....unsigned
5140: 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b   char applet[7];
5150: 0a 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c  ....uint16_t fil
5160: 65 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73  e;...} cac;....s
5170: 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67  truct {....unsig
5180: 6e 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b  ned char key_id;
5190: 0a 09 09 09 63 68 61 72 20 6c 61 62 65 6c 5b 33  ....char label[3
51a0: 32 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20  2];...} piv;..} 
51b0: 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  card;.};..struct
51c0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
51d0: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
51e0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
51f0: 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a  *pcsc_identity;.
5200: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
5210: 61 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f  attributes;..CK_
5220: 55 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73  ULONG attributes
5230: 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75  _count;.};..stru
5240: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
5250: 6e 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  n {..int active;
5260: 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ...CK_SLOT_ID sl
5270: 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45  otID;...CK_STATE
5280: 20 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47   state;..CK_FLAG
5290: 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f  S flags;..CK_ULO
52a0: 4e 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72  NG ulDeviceError
52b0: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
52c0: 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b  Application;..CK
52d0: 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a  _NOTIFY Notify;.
52e0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
52f0: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
5300: 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
5310: 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
5320: 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61  count;...int sea
5330: 72 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  rch_active;..CK_
5340: 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65  ATTRIBUTE_PTR se
5350: 61 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f  arch_query;..CK_
5360: 55 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65  ULONG search_que
5370: 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ry_count;..unsig
5380: 6e 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f  ned long search_
5390: 63 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73  curr_id;...int s
53a0: 69 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ign_active;..CK_
53b0: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73  MECHANISM_TYPE s
53c0: 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ign_mechanism;..
53d0: 43 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e  CK_BYTE_PTR sign
53e0: 5f 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  _buf;..unsigned 
53f0: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e  long sign_buflen
5400: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
5410: 20 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09   sign_bufused;..
5420: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
5430: 65 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65  entity *sign_ide
5440: 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63  ntity;...int dec
5450: 72 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b  rypt_active;..CK
5460: 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20  _MECHANISM_TYPE 
5470: 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
5480: 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  m;..CK_VOID_PTR 
5490: 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
54a0: 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63  m;..CK_ULONG dec
54b0: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65  rypt_mech_parmle
54c0: 6e 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  n;..struct cacke
54d0: 79 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72  y_identity *decr
54e0: 79 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b  ypt_identity;.};
54f0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5500: 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69  slot {..int acti
5510: 76 65 3b 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61  ve;..int interna
5520: 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  l;...char *pcsc_
5530: 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63  reader;...int pc
5540: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
5550: 64 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20  d;..SCARDHANDLE 
5560: 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74  pcsc_card;...int
5570: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70   transaction_dep
5580: 74 68 3b 0a 09 69 6e 74 20 74 72 61 6e 73 61 63  th;..int transac
5590: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
55a0: 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65  k;...int slot_re
55b0: 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20  set;...CK_FLAGS 
55c0: 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75  token_flags;...u
55d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
55e0: 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f  bel;...DWORD pro
55f0: 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65  tocol;...unsigne
5600: 64 20 69 6e 74 20 63 61 63 68 65 64 5f 63 65 72  d int cached_cer
5610: 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63  ts_count;..struc
5620: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
5630: 65 6e 74 69 74 79 20 2a 63 61 63 68 65 64 5f 63  entity *cached_c
5640: 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65  erts;.};..typede
5650: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
5660: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
5670: 20 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59   = 0x01,..CACKEY
5680: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20  _TLV_APP_SKI    
5690: 20 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59   = 0x02,..CACKEY
56a0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20  _TLV_APP_PKI    
56b0: 20 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79   = 0x04.} cackey
56c0: 5f 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74  _tlv_apptype;..t
56d0: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
56e0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
56f0: 47 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20  GENERALINFO     
5700: 20 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43    = 0x2000,..CAC
5710: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
5720: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20  OPERSONALINFO   
5730: 3d 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45  = 0x2100,..CACKE
5740: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
5750: 53 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20  SSCONTROL     = 
5760: 30 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x3000,..CACKEY_
5770: 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20  TLV_OBJID_LOGIN 
5780: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
5790: 34 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  4000,..CACKEY_TL
57a0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
57b0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30            = 0x50
57c0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
57d0: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53  OBJID_BIOMETRICS
57e0: 20 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30          = 0x6000
57f0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5800: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45  JID_DIGITALSIGCE
5810: 52 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a  RT    = 0x7000,.
5820: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5830: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20  D_CAC_PERSON    
5840: 20 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43      = 0x0200,..C
5850: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5860: 43 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20  CAC_BENEFITS    
5870: 20 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43    = 0x0202,..CAC
5880: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5890: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20  C_OTHERBENEFITS 
58a0: 3d 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45  = 0x0203,..CACKE
58b0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
58c0: 50 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20  PERSONNEL     = 
58d0: 30 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f  0x0201,..CACKEY_
58e0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
58f0: 49 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78  ICERT       = 0x
5900: 30 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  02FE.} cackey_tl
5910: 76 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70  v_objectid;..typ
5920: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
5930: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
5940: 50 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a  PRESENT    = 1,.
5950: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
5960: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
5970: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
5980: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
5990: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
59a0: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
59b0: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
59c0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
59d0: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
59e0: 33 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  3,..CACKEY_PCSC_
59f0: 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20  E_NEEDLOGIN     
5a00: 20 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f    = -4,..CACKEY_
5a10: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
5a20: 4e 54 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41  NT     = -6,..CA
5a30: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
5a40: 59 20 20 20 20 20 20 20 20 20 20 20 3d 20 2d 37  Y           = -7
5a50: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
5a60: 5f 4e 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  _NODATA         
5a70: 20 3d 20 2d 38 0a 7d 20 63 61 63 6b 65 79 5f 72   = -8.} cackey_r
5a80: 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  et;..struct cack
5a90: 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b  ey_tlv_cardurl {
5aa0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5ab0: 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09         rid[5];..
5ac0: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
5ad0: 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09 63  pe   apptype;..c
5ae0: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5af0: 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63  id  objectid;..c
5b00: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5b10: 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73 69  id  appid;..unsi
5b20: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
5b30: 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75   pinid;.};..stru
5b40: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
5b50: 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61 63  tity;.struct cac
5b60: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b  key_tlv_entity {
5b70: 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09  ..uint8_t tag;..
5b80: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a  size_t length;..
5b90: 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20  .union {...void 
5ba0: 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63 74  *value;...struct
5bb0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64   cackey_tlv_card
5bc0: 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64 75  url *value_cardu
5bd0: 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76 61  rl;...uint8_t va
5be0: 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09  lue_byte;..};...
5bf0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5c00: 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b  v_entity *_next;
5c10: 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47  .};../* CACKEY G
5c20: 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f  lobal Handles */
5c30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 61  .static void *ca
5c40: 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e  ckey_biglock = N
5c50: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72 75  ULL;.static stru
5c60: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
5c70: 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  n cackey_session
5c80: 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 73  s[128];.static s
5c90: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5ca0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31  t cackey_slots[1
5cb0: 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  28];.static int 
5cc0: 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
5cd0: 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ed = 0;.static i
5ce0: 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  nt cackey_bigloc
5cf0: 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43  k_init = 0;.CK_C
5d00: 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
5d10: 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f   cackey_args;../
5d20: 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66 69  ** Extra certifi
5d30: 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64 65  cates to include
5d40: 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73 74   in token **/.st
5d50: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
5d60: 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61 5f  _identity extra_
5d70: 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e 63  certs[] = {.#inc
5d80: 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75 69  lude "cackey_bui
5d90: 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d 3b  ltin_certs.h".};
5da0: 0a 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45 59  ..#define CACKEY
5db0: 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58  _MACRO_DEFAULT_X
5dc0: 53 54 52 28 73 74 72 29 20 43 41 43 4b 45 59 5f  STR(str) CACKEY_
5dd0: 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53 54  MACRO_DEFAULT_ST
5de0: 52 28 73 74 72 29 0a 23 64 65 66 69 6e 65 20 43  R(str).#define C
5df0: 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41  ACKEY_MACRO_DEFA
5e00: 55 4c 54 5f 53 54 52 28 73 74 72 29 20 23 73 74  ULT_STR(str) #st
5e10: 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64 20  r../* Protected 
5e20: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 50  Authentication P
5e30: 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 73  ath command */.s
5e40: 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63 6b  tatic char *cack
5e50: 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
5e60: 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 65 61 64 65   NULL;../* Reade
5e70: 72 20 45 78 63 6c 75 73 69 6f 6e 20 6f 72 20 49  r Exclusion or I
5e80: 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 2a 2f 0a 73  nclude-only */.s
5e90: 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63 6b  tatic char *cack
5ea0: 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
5eb0: 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a  de_only = NULL;.
5ec0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5ed0: 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
5ee0: 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20  ude = NULL;../* 
5ef0: 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64  PCSC Global Hand
5f00: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50  les */.static LP
5f10: 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63  SCARDCONTEXT cac
5f20: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
5f30: 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20  = NULL;..static 
5f40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61  unsigned long ca
5f50: 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
5f60: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
5f70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65  unsigned long re
5f80: 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73  tval = 255;..uns
5f90: 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72  igned long major
5fa0: 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20   = 0;..unsigned 
5fb0: 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a  long minor = 0;.
5fc0: 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72  .char *major_str
5fd0: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
5fe0: 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c  minor_str = NULL
5ff0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
6000: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
6010: 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ");...if (retval
6020: 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43   != 255) {...CAC
6030: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6040: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c  ("Returning 0x%l
6050: 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65  x (cached).", re
6060: 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e  tval);....return
6070: 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72  (retval);..}...r
6080: 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64  etval = 0;..#ifd
6090: 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ef PACKAGE_VERSI
60a0: 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  ON.        major
60b0: 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56  _str = PACKAGE_V
60c0: 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a  ERSION;..if (maj
60d0: 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20  or_str) {..     
60e0: 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f     major = strto
60f0: 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d  ul(major_str, &m
6100: 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a  inor_str, 10);..
6110: 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29  ..if (minor_str)
6120: 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74   {....minor = st
6130: 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20  rtoul(minor_str 
6140: 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a  + 1, NULL, 10);.
6150: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20  ..}..}...retval 
6160: 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20  = (major << 16) 
6170: 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a  | (minor << 8);.
6180: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
6190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
61a0: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20  turning 0x%lx", 
61b0: 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
61c0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a  n(retval);.}../*
61d0: 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46   PC/SC Related F
61e0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20  unctions */./*. 
61f0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6200: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c    void cackey_sl
6210: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6220: 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ll(void);. *. * 
6230: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
6240: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
6250: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
6260: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
6270: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
6280: 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74  ction disconnect
6290: 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73  s from all cards
62a0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
62b0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74  void cackey_slot
62c0: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
62d0: 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32  (void) {..uint32
62e0: 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  _t idx;...CACKEY
62f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6300: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20  alled.");...for 
6310: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
6320: 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
6330: 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
6340: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
6350: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
6360: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6370: 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  x].internal) {..
6380: 09 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e  ../* Skip intern
6390: 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63  al slots */....c
63a0: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
63b0: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
63c0: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f  [idx].pcsc_card_
63d0: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 09  connected) {....
63e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
63f0: 4e 54 46 28 22 53 43 61 72 64 44 69 73 63 6f 6e  NTF("SCardDiscon
6400: 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c 65 64  nect(%lu) called
6410: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
6420: 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53 43 61  g) idx);.....SCa
6430: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63 61 63  rdDisconnect(cac
6440: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
6450: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
6460: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d  LEAVE_CARD);...}
6470: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
6480: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
6490: 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
64a0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
64b0: 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  el);.....cackey_
64c0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
64d0: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
64e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
64f0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
6500: 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63  ected = 0;...cac
6510: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
6520: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
6530: 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
6540: 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
6550: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
6560: 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63  ck = 0;....if (c
6570: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6580: 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41  .active) {....CA
6590: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
65a0: 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76  F("Marking activ
65b0: 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65  e slot %lu as be
65c0: 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73  ing reset", (uns
65d0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
65e0: 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
65f0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f  slots[idx].slot_
6600: 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09  reset = 1;..}...
6610: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6620: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29  NTF("Returning")
6630: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
6640: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6650: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
6660: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
6670: 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  ect(void);. *. *
6680: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6690: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
66a0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
66b0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
66c0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
66d0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
66e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
66f0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
6700: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
6710: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
6720: 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50  onnects to the P
6730: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
6740: 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61  Manager and upda
6750: 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67  tes the. *     g
6760: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a  lobal handle.. *
6770: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
6780: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
6790: 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  sc_connect(void)
67a0: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65   {..LONG scard_e
67b0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a  st_context_ret;.
67c0: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
67d0: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
67e0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61  .LONG scard_isva
67f0: 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a  lid_ret;.#endif.
6800: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6810: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
6820: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6830: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
6840: 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
6850: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c  csc_handle = mal
6860: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b  loc(sizeof(*cack
6870: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29  ey_pcsc_handle))
6880: 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6890: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
68a0: 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
68b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
68c0: 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66  ll to malloc() f
68d0: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
68e0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
68f0: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
6900: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
6910: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
6920: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6930: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  IC);...}....CACK
6940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6950: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
6960: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6970: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
6980: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6990: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
69a0: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
69b0: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
69c0: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
69d0: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
69e0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
69f0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6a00: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
6a10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6a20: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
6a30: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
6a40: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
6a50: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
6a60: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
6a70: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6a80: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6a90: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
6aa0: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
6ab0: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
6ac0: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
6ad0: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
6ae0: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
6af0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6b00: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
6b10: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
6b20: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
6b30: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6b40: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6b50: 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  .}..#ifdef HAVE_
6b60: 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54  SCARDISVALIDCONT
6b70: 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  EXT..CACKEY_DEBU
6b80: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 49  G_PRINTF("SCardI
6b90: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20  sValidContext() 
6ba0: 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64  called");..scard
6bb0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53  _isvalid_ret = S
6bc0: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
6bd0: 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  xt(*cackey_pcsc_
6be0: 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63  handle);..if (sc
6bf0: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20  ard_isvalid_ret 
6c00: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6c10: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
6c20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e  EBUG_PRINTF("Han
6c30: 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69  dle has become i
6c40: 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49 73 56  nvalid (SCardIsV
6c50: 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73  alidContext = %s
6c60: 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f  /%li), trying to
6c70: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e   re-establish...
6c80: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
6c90: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
6ca0: 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c  _STR(scard_isval
6cb0: 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  id_ret), (long) 
6cc0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6cd0: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
6ce0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6cf0: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6d00: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09  t() called");...
6d10: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6d20: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74  t_ret = SCardEst
6d30: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43  ablishContext(SC
6d40: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d  ARD_SCOPE_SYSTEM
6d50: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61  , NULL, NULL, ca
6d60: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6d70: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65  );...if (scard_e
6d80: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  st_context_ret !
6d90: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
6da0: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
6db0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6dc0: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c  l to SCardEstabl
6dd0: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65  ishContext faile
6de0: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25  d (returned %s/%
6df0: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  li), returning i
6e00: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b  n failure", CACK
6e10: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
6e20: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
6e30: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6e40: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
6e50: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6e60: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61  et);.....free(ca
6e70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6e80: 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
6e90: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
6ea0: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6eb0: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
6ec0: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
6ed0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6ee0: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  ERIC);...}....CA
6ef0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6f00: 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65  F("Handle has be
6f10: 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65  en re-establishe
6f20: 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  d");..}.#endif..
6f30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6f40: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
6f50: 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50  y connected to P
6f60: 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20  C/SC, returning 
6f70: 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09  in success");...
6f80: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6f90: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
6fa0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
6fb0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
6fc0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
6fd0: 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  nect(void);. *. 
6fe0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6ff0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
7000: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7010: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
7020: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7030: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7040: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7050: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7060: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7070: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
7080: 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d  disconnects from
7090: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65   the PC/SC Conne
70a0: 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e  ction manager an
70b0: 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20  d updates. *    
70c0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64   the global hand
70d0: 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  le.. *. */.stati
70e0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
70f0: 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
7100: 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e  ect(void) {..LON
7110: 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74  G scard_rel_cont
7120: 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ext_ret;...CACKE
7130: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7140: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
7150: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
7160: 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  dle == NULL) {..
7170: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7180: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
7190: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
71a0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c  t_ret = SCardRel
71b0: 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63  easeContext(*cac
71c0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
71d0: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
71e0: 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09  csc_handle) {...
71f0: 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63  free(cackey_pcsc
7200: 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61  _handle);.....ca
7210: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7220: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66   = NULL;..}...if
7230: 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74   (scard_rel_cont
7240: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
7250: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7260: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7270: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7280: 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  }...return(CACKE
7290: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
72a0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
72b0: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
72c0: 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
72d0: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
72e0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a  _slot *slot);. *
72f0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
7300: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
7310: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
7320: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
7330: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
7340: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20   function marks 
7350: 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76 69 6e  a slot has havin
7360: 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20 74 6f  g been reset, to
7370: 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61 6e 65   later be cleane
7380: 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65  d up.. *     Cle
7390: 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e  anup only happen
73a0: 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23 31 31  s when a PKCS#11
73b0: 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f   client calls C_
73c0: 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e  FindObjectsInit.
73d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
73e0: 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  oid cackey_mark_
73f0: 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63  slot_reset(struc
7400: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
7410: 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74  lot) {..if (slot
7420: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
7430: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  turn;..}...CACKE
7440: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7450: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
7460: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7470: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
7480: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
7490: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
74a0: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
74b0: 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73  D);..}...slot->s
74c0: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
74d0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
74e0: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
74f0: 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63  if (cackey_pin_c
7500: 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20  ommand == NULL) 
7510: 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  {...slot->token_
7520: 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
7530: 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65  N_REQUIRED;..} e
7540: 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f  lse {...slot->to
7550: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
7560: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
7570: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
7580: 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ng.");...return;
7590: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
75a0: 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63  IS. *     LONG c
75b0: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
75c0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
75d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44  ey_slot *slot, D
75e0: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
75f0: 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52  tocol);. *. * AR
7600: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7610: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7620: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7630: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7640: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44  s to. *. *     D
7650: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
7660: 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20  tocol. *        
7670: 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74   Protocol to att
7680: 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a  empt first. *. *
7690: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
76a0: 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e 20       The return 
76b0: 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72 64  value from SCard
76c0: 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20  Reconnect(). *. 
76d0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
76e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
76f0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
7700: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
7710: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65 20  ). *. *     The 
7720: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7730: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
7740: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69  ill be called fi
7750: 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a 20  rst with the. * 
7760: 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64 50      dwPreferredP
7770: 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66  rotocols of "def
7780: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20  ault_protocol". 
7790: 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72 65   If that call re
77a0: 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43 41  turns. *     SCA
77b0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
77c0: 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77 69  TCH try again wi
77d0: 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66  th a protocol of
77e0: 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e   T=0, and failin
77f0: 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54 3d  g. *     that T=
7800: 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  1.. *. */.static
7810: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63   LONG cackey_rec
7820: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7830: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7840: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61  slot, DWORD defa
7850: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ult_protocol) {.
7860: 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f  .DWORD selected_
7870: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20  protocol;..LONG 
7880: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a  scard_conn_ret;.
7890: 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  ..selected_proto
78a0: 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64  col = 0;...scard
78b0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
78c0: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
78d0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
78e0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
78f0: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
7900: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
7910: 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70 72  RD, &selected_pr
7920: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73  otocol);...if (s
7930: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7940: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7950: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43  ISMATCH) {...CAC
7960: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7970: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
7980: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
7990: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
79a0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
79b0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61  just T=0")...sca
79c0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
79d0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
79e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
79f0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7a00: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7a10: 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T0, SCARD_RESET
7a20: 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64  _CARD, &selected
7a30: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69  _protocol);....i
7a40: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7a50: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7a60: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7a70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7a80: 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f  RINTF("SCardReco
7a90: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7aa0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7ab0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
7ac0: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a  with just T=1").
7ad0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7ae0: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
7af0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
7b00: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
7b10: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7b20: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44  OTOCOL_T1, SCARD
7b30: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65  _RESET_CARD, &se
7b40: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29  lected_protocol)
7b50: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 73  ;...}..}...if (s
7b60: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7b70: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
7b80: 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74  ) {...slot->prot
7b90: 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64 5f  ocol = selected_
7ba0: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72  protocol;..}...r
7bb0: 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e  eturn(scard_conn
7bc0: 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  _ret);.}../*. * 
7bd0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
7be0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
7bf0: 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
7c00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7c10: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
7c20: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7c30: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7c40: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
7c50: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
7c60: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54  nds to. *. * RET
7c70: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
7c80: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
7c90: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
7ca0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
7cb0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7cc0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
7cd0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
7ce0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
7cf0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
7d00: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
7d10: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
7d20: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
7d30: 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f  cackey_ret pcsc_
7d40: 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57  connect_ret;..DW
7d50: 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c  ORD protocol;..L
7d60: 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ONG scard_conn_r
7d70: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
7d80: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
7d90: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
7da0: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
7db0: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
7dc0: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69  lid slot specifi
7dd0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
7de0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
7df0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7e00: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
7e10: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
7e20: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73  ret = cackey_pcs
7e30: 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66  c_connect();..if
7e40: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
7e50: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
7e60: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
7e70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7e80: 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50  "Connection to P
7e90: 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74  C/SC failed, ret
7ea0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7eb0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
7ec0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7ed0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  ERIC);..}.../* C
7ee0: 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72  onnect to reader
7ef0: 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09  , if needed */..
7f00: 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f  if (!slot->pcsc_
7f10: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
7f20: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7f30: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
7f40: 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64  nnect(%s) called
7f50: 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20 73   for slot %p", s
7f60: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7f70: 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72 64  , slot);...scard
7f80: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7f90: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
7fa0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
7fb0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
7fc0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7fd0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
7fe0: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
7ff0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f  ROTOCOL_T1, &slo
8000: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
8010: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20  rotocol);....if 
8020: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
8030: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
8040: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
8050: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8060: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
8070: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
8080: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
8090: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
80a0: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73   just T=0")....s
80b0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
80c0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
80d0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
80e0: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
80f0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
8100: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
8110: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f  ROTOCOL_T0, &slo
8120: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
8130: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66  rotocol);.....if
8140: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8150: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
8160: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8170: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8180: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
8190: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
81a0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
81b0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
81c0: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09  th just T=1")...
81d0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
81e0: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
81f0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
8200: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
8210: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
8220: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
8230: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
8240: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
8250: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
8260: 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  }...}....if (sca
8270: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
8280: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
8290: 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b  _CARD) {....CACK
82a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
82b0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
82c0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57  returned SCARD_W
82d0: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c  _UNPOWERED_CARD,
82e0: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f   trying to re-co
82f0: 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  nnect...");.....
8300: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8310: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
8320: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
8330: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
8340: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
8350: 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f  E_DIRECT, SCARD_
8360: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
8370: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
8380: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
8390: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  d, &protocol);..
83a0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
83b0: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
83c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
83d0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
83e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
83f0: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
8400: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
8410: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
8420: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30  ng with just T=0
8430: 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e  ").....scard_con
8440: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
8450: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
8460: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
8470: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
8480: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
8490: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
84a0: 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T0, &slot->pcsc_
84b0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
84c0: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64  ;......if (scard
84d0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
84e0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
84f0: 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  TCH) {......CACK
8500: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8510: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
8520: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
8530: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
8540: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
8550: 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61  t T=1")......sca
8560: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
8570: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
8580: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
8590: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
85a0: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
85b0: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
85c0: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
85d0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
85e0: 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09  tocol);.....}...
85f0: 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  .}.....scard_con
8600: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  n_ret = cackey_r
8610: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  econnect_card(sl
8620: 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  ot, protocol);..
8630: 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  .}....if (scard_
8640: 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52  conn_ret != SCAR
8650: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
8660: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8670: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
8680: 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64  n to card failed
8690: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
86a0: 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e  ailure (SCardCon
86b0: 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29  nect() = %s/%li)
86c0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
86d0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
86e0: 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  _STR(scard_conn_
86f0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
8700: 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09  rd_conn_ret);...
8710: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8720: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8730: 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63  ...}....slot->pc
8740: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
8750: 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74  d = 1;...slot->t
8760: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8770: 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72   = 0;...slot->tr
8780: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
8790: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c  w_lock = 0;...sl
87a0: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70  ot->protocol = p
87b0: 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43 41  rotocol;..}...CA
87c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
87d0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
87e0: 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74  success");...ret
87f0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8800: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
8810: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8820: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8830: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
8840: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
8850: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
8860: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8870: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
8880: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
8890: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
88a0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
88b0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
88c0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
88d0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
88e0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
88f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
8900: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
8910: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
8920: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61  *     The transa
8930: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
8940: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67  terminated using
8950: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61   "cackey_end_tra
8960: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f  nsaction". *. */
8970: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
8980: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
8990: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
89a0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
89b0: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
89c0: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ret cackey_conn_
89d0: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  ret;..LONG scard
89e0: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41  _trans_ret;...CA
89f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8a00: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
8a10: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
8a20: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
8a30: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
8a40: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65   (cackey_conn_re
8a50: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
8a60: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
8a70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8a80: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
8a90: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
8aa0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8ab0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8ac0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8ad0: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8ae0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b  ansaction_depth+
8af0: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  +;...if (slot->t
8b00: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8b10: 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74   > 1 && !slot->t
8b20: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
8b30: 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43  hw_lock) {...CAC
8b40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8b50: 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74  ("Already in a t
8b60: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66  ransaction, perf
8b70: 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e  orming no action
8b80: 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69   (new depth = %i
8b90: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
8ba0: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
8bb0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8bc0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
8bd0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8be0: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
8bf0: 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e   0;...scard_tran
8c00: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67  s_ret = SCardBeg
8c10: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  inTransaction(sl
8c20: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a  ot->pcsc_card);.
8c30: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
8c40: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
8c50: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
8c60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8c70: 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69  ("Unable to begi
8c80: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
8c90: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8ca0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8cb0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8cc0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
8cd0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8ce0: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67  "Sucessfully beg
8cf0: 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  an transaction o
8d00: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
8d10: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
8d20: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
8d30: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
8d40: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
8d50: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
8d60: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
8d70: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
8d80: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8d90: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
8da0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8db0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8dc0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8dd0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8de0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8df0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8e00: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
8e10: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
8e20: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8e30: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
8e40: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
8e50: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
8e60: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
8e70: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  s "cackey_begin_
8e80: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20  transaction" to 
8e90: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a  be called first.
8ea0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
8eb0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8ec0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8ed0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8ee0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e  ot *slot) {..LON
8ef0: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
8f00: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
8f10: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
8f20: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
8f30: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8f40: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
8f50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8f60: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e  Card is not conn
8f70: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f  ected, unable to
8f80: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
8f90: 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69   on card");....i
8fa0: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
8fb0: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
8fc0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8fd0: 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61  G_PRINTF("Decrea
8fe0: 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  sing transaction
8ff0: 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e   depth and askin
9000: 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65  g for a hardware
9010: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78   lock on the nex
9020: 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  t begin transact
9030: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
9040: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
9050: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
9060: 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74  th);.....slot->t
9070: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9080: 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74  --;.....if (slot
9090: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
90a0: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73  pth > 0) {.....s
90b0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
90c0: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
90d0: 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  1;....}...}....r
90e0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
90f0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9100: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
9110: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
9120: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
9130: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
9140: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
9150: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
9160: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
9170: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9180: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
9190: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
91a0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
91b0: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
91c0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
91d0: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
91e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
91f0: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
9200: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
9210: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
9220: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
9230: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
9240: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
9250: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
9260: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9270: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
9280: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  }...scard_trans_
9290: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72  ret = SCardEndTr
92a0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
92b0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
92c0: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69  _LEAVE_CARD);..i
92d0: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
92e0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
92f0: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
9300: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9310: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  Unable to end tr
9320: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
9330: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
9340: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
9350: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
9360: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
9370: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
9380: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61  essfully termina
9390: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
93a0: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
93b0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
93c0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
93d0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
93e0: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65  ../* APDU Relate
93f0: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
9400: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
9410: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
9420: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
9430: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
9440: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
9450: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
9460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
9470: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
9480: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
9490: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
94a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
94b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
94c0: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
94d0: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
94e0: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
94f0: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
9500: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
9510: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  pdata_len);. *. 
9520: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
9530: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
9540: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
9550: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
9560: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
9570: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9580: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20   class. *       
9590: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53    APDU Class (GS
95a0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
95b0: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53  6 or GSCIS_CLASS
95c0: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
95d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61  . *         usua
95e0: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20  lly), (CLA). *. 
95f0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9600: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  har instruction.
9610: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
9620: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53  Instruction (INS
9630: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
9640: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20  gned char p1. * 
9650: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
9660: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a  ameter 1 (P1). *
9670: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9680: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20   char p2. *     
9690: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
96a0: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20  er 2 (P2). *. * 
96b0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
96c0: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20  r lc. *         
96d0: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43  APDU Length of C
96e0: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74  ontent (Lc) -- t
96f0: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9700: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20  h of "data". *  
9710: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
9720: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20  .  If "data" is 
9730: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
9740: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  L, this paramete
9750: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  r will. *       
9760: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a    be ignored.. *
9770: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9780: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20   char *data. *  
9790: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
97a0: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64  o buffer to send
97b0: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  .  It should be 
97c0: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e  "Lc" bytes long.
97d0: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
97e0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
97f0: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74  L, "Lc" will not
9800: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68   be sent, and th
9810: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  is buffer will b
9820: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e  e. *         ign
9830: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
9840: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
9850: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
9860: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63   Length of Expec
9870: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74  tation (Le) -- t
9880: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9890: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  h of the. *     
98a0: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70      expected rep
98b0: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ly.  If this is 
98c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74  specified as 0 t
98d0: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a  hen it will not.
98e0: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65   *         be se
98f0: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69  nt.. *. *     ui
9900: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
9910: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
9920: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
9930: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
9940: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20  ponse code.  If 
9950: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
9960: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9970: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9980: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  se code will be 
9990: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
99a0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
99b0: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20  ar *respdata. * 
99c0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
99d0: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
99e0: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
99f0: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73  e data.  If this
9a00: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
9a10: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
9a20: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64  , the response d
9a30: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ata will be disc
9a40: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20  arded.  If. *   
9a50: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64        the "respd
9a60: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74  ata_len" paramet
9a70: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20  er is specified 
9a80: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75  as NULL, this bu
9a90: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
9aa0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9ab0: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ted.. *. *     s
9ac0: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9ad0: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  len. *         [
9ae0: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72  IN, OUT] Pointer
9af0: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74   initialing cont
9b00: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20  aining the size 
9b10: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61  of the "respdata
9b20: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66  ". *         buf
9b30: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74  fer.  Before ret
9b40: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e  urning, the poin
9b50: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20  ted to value is 
9b60: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20  updated to the. 
9b70: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
9b80: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
9b90: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  n to the buffer.
9ba0: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
9bb0: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20  cified as. *    
9bc0: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69       NULL, it wi
9bd0: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
9be0: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61  d, and "respdata
9bf0: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  " will be ignore
9c00: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20  d causing. *    
9c10: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73       the respons
9c20: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73  e data to be dis
9c30: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45  carded.. *. * RE
9c40: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
9c50: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
9c60: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20  OK           On 
9c70: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
9c80: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9c90: 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72  ERIC      On err
9ca0: 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  or. *     CACKEY
9cb0: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
9cc0: 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64  ENT  If the send
9cd0: 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75  ing failed becau
9ce0: 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a  se the token is.
9cf0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 61 62 73 65 6e 74 0a 20 2a 20 20 20 20 20    absent. *     
9d20: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
9d30: 54 52 59 20 20 20 20 20 20 20 20 49 66 20 73 6f  TRY        If so
9d40: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 6c 6f 6f  mething that loo
9d50: 6b 73 20 72 65 74 72 79 27 61 62 6c 65 20 77 65  ks retry'able we
9d60: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20  nt. *           
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 77 72 6f 6e 67 20 2d 2d 20 74 72       wrong -- tr
9d90: 79 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  y the whole tran
9da0: 73 61 63 74 69 6f 6e 20 6f 76 65 72 0a 20 2a 20  saction over. * 
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
9dd0: 67 61 69 6e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  gain. *. * NOTES
9de0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
9df0: 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65  ction will conne
9e00: 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ct to the PC/SC 
9e10: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
9e20: 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61  er via. *     ca
9e30: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
9e40: 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20  t() if needed.. 
9e50: 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c  *. *     It will
9e60: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
9e70: 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64  card in the read
9e80: 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  er attached to t
9e90: 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73  he slot. *     s
9ea0: 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69  pecified.  It wi
9eb0: 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  ll reconnect to 
9ec0: 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20  the card if the 
9ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20  connection. *   
9ee0: 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a    goes away.. *.
9ef0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
9f00: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e  y_ret cackey_sen
9f10: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61  d_apdu(struct ca
9f20: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
9f30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
9f40: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63  lass, unsigned c
9f50: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  har instruction,
9f60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
9f70: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  1, unsigned char
9f80: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e   p2, unsigned in
9f90: 74 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  t lc, unsigned c
9fa0: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
9fb0: 6e 65 64 20 69 6e 74 20 6c 65 2c 20 75 69 6e 74  ned int le, uint
9fc0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
9fd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
9fe0: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
9ff0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b  *respdata_len) {
a000: 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f  ..uint8_t major_
a010: 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73  rc, minor_rc;..s
a020: 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63  ize_t bytes_to_c
a030: 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74  opy, tmp_respdat
a040: 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44  a_len;..LPCSCARD
a050: 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53  _IO_REQUEST pioS
a060: 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44 20 78  endPci;..DWORD x
a070: 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65  mit_len, recv_le
a080: 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78  n;..LONG scard_x
a090: 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72  mit_ret, scard_r
a0a0: 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45  econn_ret;..BYTE
a0b0: 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c   xmit_buf[1024],
a0c0: 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b   recv_buf[1024];
a0d0: 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65  ..int pcsc_conne
a0e0: 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74  ct_ret, pcsc_get
a0f0: 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69  resp_ret;..int i
a100: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
a110: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
a120: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
a130: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
a140: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
a150: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69  lid slot specifi
a160: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
a170: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
a180: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63  ENERIC);..}...pc
a190: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
a1a0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
a1b0: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
a1c0: 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
a1d0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
a1e0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
a1f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a200: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
a210: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
a220: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a230: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
a240: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a250: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
a260: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72 6f  ermine which pro
a270: 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73  tocol to send us
a280: 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20 28  ing */..switch (
a290: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20  slot->protocol) 
a2a0: 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  {...case SCARD_P
a2b0: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 43  ROTOCOL_T0:....C
a2c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a2d0: 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20  TF("Protocol to 
a2e0: 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69 73  send datagram is
a2f0: 20 54 3d 30 22 29 3b 0a 0a 09 09 09 70 69 6f 53   T=0");.....pioS
a300: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a310: 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61 6b  CI_T0;.....break
a320: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ;...case SCARD_P
a330: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 43  ROTOCOL_T1:....C
a340: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a350: 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20  TF("Protocol to 
a360: 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69 73  send datagram is
a370: 20 54 3d 31 22 29 3b 0a 0a 09 09 09 70 69 6f 53   T=1");.....pioS
a380: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a390: 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65 61 6b  CI_T1;.....break
a3a0: 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
a3b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a3c0: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
a3d0: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61 62 6f  tocol found, abo
a3e0: 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 72 65  rting.");.....re
a3f0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a400: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
a410: 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f  ../* Transmit */
a420: 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a  ..xmit_len = 0;.
a430: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a440: 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09  en++] = class;..
a450: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a460: 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74 69  n++] = instructi
a470: 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  on;..xmit_buf[xm
a480: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a  it_len++] = p1;.
a490: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a4a0: 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20  en++] = p2;..if 
a4b0: 28 64 61 74 61 29 20 7b 0a 09 09 69 66 20 28 6c  (data) {...if (l
a4c0: 63 20 3e 20 32 35 35 29 20 7b 0a 09 09 09 43 41  c > 255) {....CA
a4d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a4e0: 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73 69  F("CAUTION!  Usi
a4f0: 6e 67 20 61 6e 20 4c 63 20 67 72 65 61 74 65 72  ng an Lc greater
a500: 20 74 68 61 6e 20 32 35 35 20 69 73 20 75 6e 74   than 255 is unt
a510: 65 73 74 65 64 2e 20 20 4c 63 20 3d 20 25 75 22  ested.  Lc = %u"
a520: 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 6d 69 74 5f  , lc);.....xmit_
a530: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a540: 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20 55  = 0x82; /* XXX U
a550: 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d  NTESTED */....xm
a560: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a570: 2b 5d 20 3d 20 28 6c 63 20 26 20 30 78 66 66 30  +] = (lc & 0xff0
a580: 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74  0) >> 8;....xmit
a590: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a5a0: 20 3d 20 6c 63 20 26 20 30 78 66 66 3b 0a 09 09   = lc & 0xff;...
a5b0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74  } else {....xmit
a5c0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a5d0: 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f 72   = lc;...}...for
a5e0: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
a5f0: 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09   lc; idx++) {...
a600: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a610: 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78  en++] = data[idx
a620: 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  ];...}..}...if (
a630: 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  le != 0x00) {...
a640: 69 66 20 28 6c 65 20 3e 20 32 35 36 29 20 7b 0a  if (le > 256) {.
a650: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a660: 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21  PRINTF("CAUTION!
a670: 20 20 55 73 69 6e 67 20 61 6e 20 4c 65 20 67 72    Using an Le gr
a680: 65 61 74 65 72 20 74 68 61 6e 20 32 35 36 20 69  eater than 256 i
a690: 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 65 20  s untested.  Le 
a6a0: 3d 20 25 75 22 2c 20 6c 65 29 3b 0a 0a 09 09 09  = %u", le);.....
a6b0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a6c0: 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20  n++] = 0x82; /* 
a6d0: 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a  XXX UNTESTED */.
a6e0: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a6f0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26 20  _len++] = (le & 
a700: 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
a710: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a720: 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78 66  en++] = le & 0xf
a730: 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28  f;...} else if (
a740: 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09 09  le == 256) {....
a750: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a760: 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09 7d  n++] = 0x00;...}
a770: 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f   else {....xmit_
a780: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a790: 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  = le;...}..}.../
a7a0: 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72  * Begin Smartcar
a7b0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
a7c0: 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
a7d0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
a7e0: 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d 3d  ;...if (class ==
a7f0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
a800: 37 38 31 36 20 26 26 20 28 69 6e 73 74 72 75 63  7816 && (instruc
a810: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
a820: 53 54 52 5f 56 45 52 49 46 59 20 7c 7c 20 69 6e  STR_VERIFY || in
a830: 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43  struction == GSC
a840: 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f  IS_INSTR_CHANGE_
a850: 52 45 46 45 52 45 4e 43 45 29 20 26 26 20 70 31  REFERENCE) && p1
a860: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41   == 0x00) {...CA
a870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a880: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a  F("Sending APDU:
a890: 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b   <<censored>>");
a8a0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
a8b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
a8c0: 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  UF("Sending APDU
a8d0: 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  :", xmit_buf, xm
a8e0: 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65  it_len);..}...re
a8f0: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  cv_len = sizeof(
a900: 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72  recv_buf);..scar
a910: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61  d_xmit_ret = SCa
a920: 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d  rdTransmit(slot-
a930: 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53  >pcsc_card, pioS
a940: 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66  endPci, xmit_buf
a950: 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c  , xmit_len, NULL
a960: 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63  , recv_buf, &rec
a970: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63  v_len);...if (sc
a980: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20  ard_xmit_ret == 
a990: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e  SCARD_E_NOT_TRAN
a9a0: 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b  SACTED) {...CACK
a9b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a9c0: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20  "Failed to send 
a9d0: 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43  APDU to card (SC
a9e0: 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20  ardTransmit() = 
a9f0: 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73  %s/%lx), will as
aa00: 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  k calling functi
aa10: 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74  on to retry (not
aa20: 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64 29   resetting card)
aa30: 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ...", CACKEY_DEB
aa40: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
aa50: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d  _TO_STR(scard_xm
aa60: 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e  it_ret), (unsign
aa70: 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78  ed long) scard_x
aa80: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20  mit_ret);..../* 
aa90: 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20  Begin Smartcard 
aaa0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
aab0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
aac0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
aad0: 09 09 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  ..cackey_reconne
aae0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 73 6c  ct_card(slot, sl
aaf0: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  ot->protocol);..
ab00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ab10: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09  PCSC_E_RETRY);..
ab20: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  }...if (scard_xm
ab30: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
ab40: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
ab50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ab60: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
ab70: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
ab80: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
ab90: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43   = %s/%lx)", CAC
aba0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
abb0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
abc0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
abd0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
abe0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
abf0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ac00: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
ac10: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
ac20: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09  been reset");...
ac30: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
ac40: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
ac50: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
ac60: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
ac70: 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
ac80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ac90: 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
aca0: 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
acb0: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
acc0: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
acd0: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
ace0: 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
acf0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
ad00: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29  ARD_PROTOCOL_T1)
ad10: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
ad20: 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  reconn_ret == SC
ad30: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
ad40: 0a 09 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f  .....switch (slo
ad50: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  t->protocol) {..
ad60: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ....case SCARD_P
ad70: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09  ROTOCOL_T0:.....
ad80: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
ad90: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
ada0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
adb0: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f  case SCARD_PROTO
adc0: 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69  COL_T1:.......pi
add0: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
ade0: 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09  _PCI_T1;........
adf0: 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61  break;......defa
ae00: 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  ult:.......CACKE
ae10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ae20: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  Invalid protocol
ae30: 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20   found, but too 
ae40: 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68  late to do anyth
ae50: 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77  ing about it now
ae60: 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61   -- trying anywa
ae70: 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65  y.");........bre
ae80: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
ae90: 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
aea0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
aeb0: 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
aec0: 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
aed0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
aee0: 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
aef0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
af00: 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f  epth--;......slo
af10: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
af20: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
af30: 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
af40: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
af50: 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
af60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
af70: 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
af80: 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d  essful, retransm
af90: 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72  itting");......r
afa0: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
afb0: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09  (recv_buf);.....
afc0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
afd0: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73   SCardTransmit(s
afe0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
aff0: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74  pioSendPci, xmit
b000: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
b010: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20  NULL, recv_buf, 
b020: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
b030: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
b040: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
b050: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
b060: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b070: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
b080: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
b090: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
b0a0: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
b0b0: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
b0c0: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
b0d0: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
b0e0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
b0f0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
b100: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
b110: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
b120: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
b130: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
b140: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
b150: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  E_CARD);......sl
b160: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
b170: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
b180: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b190: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b1a0: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  */......slot->tr
b1b0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
b1c0: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
b1d0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b1e0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65  (slot);.......re
b1f0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b200: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
b210: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
b220: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
b230: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
b240: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
b250: 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63  ;......SCardDisc
b260: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
b270: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
b280: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73  AVE_CARD);.....s
b290: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
b2a0: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
b2b0: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b2c0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b2d0: 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  */.....slot->tra
b2e0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
b2f0: 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65   1;.....cackey_e
b300: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b310: 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lot);......CACKE
b320: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b330: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
b340: 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75  lure");.....retu
b350: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
b360: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
b370: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
b380: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b390: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
b3a0: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
b3b0: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
b3c0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
b3d0: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
b3e0: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63  RD);....slot->pc
b3f0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
b400: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e  d = 0;...../* En
b410: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
b420: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c  saction */....sl
b430: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
b440: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61  depth = 1;....ca
b450: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b460: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
b470: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b480: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b490: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
b4a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b4b0: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
b4c0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  );...}..}...CACK
b4d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
b4e0: 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75  F("Returned Valu
b4f0: 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72  e:", recv_buf, r
b500: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  ecv_len);...if (
b510: 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a  recv_len < 2) {.
b520: 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73  ../* Minimal res
b530: 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20  ponse length is 
b540: 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69  2 bytes, returni
b550: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ng in failure */
b560: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b570: 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
b580: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
b590: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b5a0: 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75   (recv_len = %lu
b5b0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
b5c0: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  ng) recv_len);..
b5d0: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
b5e0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
b5f0: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
b600: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
b610: 3b 0a 0a 09 09 2f 2a 20 53 75 70 70 6c 79 20 61  ;..../* Supply a
b620: 6e 20 69 6e 76 61 6c 69 64 20 72 65 73 70 6f 6e  n invalid respon
b630: 73 65 20 63 6f 64 65 20 2a 2f 0a 09 09 69 66 20  se code */...if 
b640: 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 09  (respcode) {....
b650: 2a 72 65 73 70 63 6f 64 65 20 3d 20 30 3b 0a 09  *respcode = 0;..
b660: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
b670: 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54  KEY_PCSC_E_NODAT
b680: 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  A);..}.../* Dete
b690: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64  rmine result cod
b6a0: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d  e */..major_rc =
b6b0: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
b6c0: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f  en - 2];..minor_
b6d0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
b6e0: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66  cv_len - 1];..if
b6f0: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09   (respcode) {...
b700: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a  *respcode = (maj
b710: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69  or_rc << 8) | mi
b720: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20  nor_rc;..}.../* 
b730: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62  Adjust message b
b740: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c  uffer */..recv_l
b750: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64  en -= 2;.../* Ad
b760: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72  d bytes to retur
b770: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f  n value */..tmp_
b780: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30  respdata_len = 0
b790: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20  ;..if (respdata 
b7a0: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  && respdata_len)
b7b0: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74   {...tmp_respdat
b7c0: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74  a_len = *respdat
b7d0: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f  a_len;....bytes_
b7e0: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64  to_copy = *respd
b7f0: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28  ata_len;....if (
b800: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73  recv_len < bytes
b810: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62  _to_copy) {....b
b820: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72  ytes_to_copy = r
b830: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ecv_len;...}....
b840: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b850: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75  NTF("Copying %lu
b860: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75   bytes to the bu
b870: 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75  ffer (recv'd %lu
b880: 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79   bytes, but only
b890: 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20   %lu bytes left 
b8a0: 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c  in our buffer)",
b8b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b8c0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20   bytes_to_copy, 
b8d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b8e0: 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67  recv_len, (unsig
b8f0: 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64  ned long) *respd
b900: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d  ata_len);....mem
b910: 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65  cpy(respdata, re
b920: 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f  cv_buf, bytes_to
b930: 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61  _copy);...respda
b940: 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63  ta += bytes_to_c
b950: 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74  opy;....*respdat
b960: 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f  a_len = bytes_to
b970: 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73  _copy;...tmp_res
b980: 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74  pdata_len -= byt
b990: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65  es_to_copy;..} e
b9a0: 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76  lse {...if (recv
b9b0: 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
b9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b9d0: 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77  NTF("Throwing aw
b9e0: 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f  ay %lu bytes, no
b9f0: 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65  where to put the
ba00: 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  m!", (unsigned l
ba10: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
ba20: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a  ..}..}...if (maj
ba30: 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b  or_rc == 0x61) {
ba40: 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f  .../* We need to
ba50: 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45   READ */...CACKE
ba60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ba70: 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75  Buffer read requ
ba80: 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d  ired");....if (m
ba90: 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29  inor_rc == 0x00)
baa0: 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d   {....minor_rc =
bab0: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
bac0: 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65  ;...}....pcsc_ge
bad0: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b  tresp_ret = cack
bae0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
baf0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
bb00: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
bb10: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45  STR_GET_RESPONSE
bb20: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c  , 0x00, 0x00, 0,
bb30: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c   NULL, minor_rc,
bb40: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64   respcode, respd
bb50: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61  ata, &tmp_respda
bb60: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28  ta_len);....if (
bb70: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
bb80: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
bb90: 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
bba0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bbb0: 42 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c  Buffer read fail
bbc0: 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69  ed!  Returning i
bbd0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
bbe0: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
bbf0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
bc00: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
bc10: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
bc20: 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67  ;.....if (pcsc_g
bc30: 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41  etresp_ret == CA
bc40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
bc50: 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28  Y) {.....return(
bc60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
bc70: 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  TRY);....}.....r
bc80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
bc90: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
bca0: 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74  }....if (respdat
bcb0: 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73  a_len) {....*res
bcc0: 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70  pdata_len += tmp
bcd0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09  _respdata_len;..
bce0: 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  .}..../* End Sma
bcf0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
bd00: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
bd10: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
bd20: 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  lot);....CACKEY_
bd30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
bd40: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
bd50: 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20  ss (buffer read 
bd60: 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72  complete)");...r
bd70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
bd80: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a  C_S_OK);..}.../*
bd90: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
bda0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
bdb0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
bdc0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69  ction(slot);...i
bdd0: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30  f (major_rc == 0
bde0: 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63  x90) {.../* Succ
bdf0: 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ess */...CACKEY_
be00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
be10: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
be20: 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30  ss (major_rc = 0
be30: 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72  x90)");....retur
be40: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
be50: 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  OK);..}....CACKE
be60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
be70: 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e  APDU Returned an
be80: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e   error, returnin
be90: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
bea0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
beb0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
bec0: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .}..static unsig
bed0: 6e 65 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79  ned char *cackey
bee0: 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
bef0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
bf00: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a  buffer, size_t *
bf10: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e  buffer_len_p, un
bf20: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c  signed char tag,
bf30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bf40: 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  outbuffer, size_
bf50: 74 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  t *outbuffer_len
bf60: 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  _p) {..unsigned 
bf70: 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a  char *buffer_p;.
bf80: 09 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65  .size_t outbuffe
bf90: 72 5f 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65  r_len, buffer_le
bfa0: 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b  n;..size_t size;
bfb0: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
bfc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bfd0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
bfe0: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  f (buffer_len_p 
bff0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c010: 28 22 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69  ("buffer_len_p i
c020: 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69  s NULL.  Returni
c030: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29  ng in failure.")
c040: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c050: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
c060: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e  uffer_len_p == N
c070: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
c080: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75  DEBUG_PRINTF("ou
c090: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73  tbuffer_len_p is
c0a0: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e   NULL.  Returnin
c0b0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b  g in failure.");
c0c0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
c0d0: 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65  ;..}...buffer_le
c0e0: 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c  n = *outbuffer_l
c0f0: 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72  en_p;..outbuffer
c100: 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65  _len = *outbuffe
c110: 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 66 20 28 62  r_len_p;...if (b
c120: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
c130: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c140: 50 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c  PRINTF("buffer_l
c150: 65 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  en is less than 
c160: 32 2c 20 73 6f 20 77 65 20 63 61 6e 27 74 20 72  2, so we can't r
c170: 65 61 64 20 61 6e 79 20 74 61 67 2e 20 20 52 65  ead any tag.  Re
c180: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
c190: 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  re.");....return
c1a0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66  (NULL);..}...buf
c1b0: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
c1c0: 09 69 66 20 28 62 75 66 66 65 72 5f 70 5b 30 5d  .if (buffer_p[0]
c1d0: 20 21 3d 20 74 61 67 29 20 7b 0a 09 09 43 41 43   != tag) {...CAC
c1e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c1f0: 28 22 54 61 67 20 66 6f 75 6e 64 20 77 61 73 20  ("Tag found was 
c200: 6e 6f 74 20 74 61 67 20 65 78 70 65 63 74 65 64  not tag expected
c210: 2e 20 20 54 61 67 20 3d 20 25 30 32 78 2c 20 45  .  Tag = %02x, E
c220: 78 70 65 63 74 65 64 20 3d 20 25 30 32 78 2e 20  xpected = %02x. 
c230: 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   Returning in fa
c240: 69 6c 75 72 65 2e 22 2c 20 28 75 6e 73 69 67 6e  ilure.", (unsign
c250: 65 64 20 69 6e 74 29 20 62 75 66 66 65 72 5f 70  ed int) buffer_p
c260: 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a 09 09 72 65  [0], tag);....re
c270: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
c280: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75  .buffer_p++;..bu
c290: 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66  ffer_len--;...if
c2a0: 20 28 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26   ((buffer_p[0] &
c2b0: 20 30 78 38 30 29 20 3d 3d 20 30 78 38 30 29 20   0x80) == 0x80) 
c2c0: 7b 0a 09 09 73 69 7a 65 20 3d 20 30 3b 0a 09 09  {...size = 0;...
c2d0: 69 64 78 20 3d 20 28 62 75 66 66 65 72 5f 70 5b  idx = (buffer_p[
c2e0: 30 5d 20 26 20 30 78 37 66 29 3b 0a 0a 09 09 69  0] & 0x7f);....i
c2f0: 66 20 28 69 64 78 20 3e 20 62 75 66 66 65 72 5f  f (idx > buffer_
c300: 6c 65 6e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  len) {....CACKEY
c310: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
c320: 61 6c 66 6f 72 6d 65 64 20 42 45 52 20 76 61 6c  alformed BER val
c330: 75 65 20 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68  ue -- not enough
c340: 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65   bytes available
c350: 20 74 6f 20 72 65 61 64 20 6c 65 6e 67 74 68 20   to read length 
c360: 28 69 64 78 20 3d 20 25 69 2c 20 62 75 66 66 65  (idx = %i, buffe
c370: 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 69  r_len = %lu)", i
c380: 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
c390: 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b  ng) buffer_len);
c3a0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .....return(NULL
c3b0: 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b  );...}....for (;
c3c0: 20 69 64 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29   idx > 0; idx--)
c3d0: 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 70 2b 2b   {....buffer_p++
c3e0: 3b 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e 2d  ;....buffer_len-
c3f0: 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 3c 3c 3d 20  -;.....size <<= 
c400: 38 3b 0a 09 09 09 73 69 7a 65 20 7c 3d 20 62 75  8;....size |= bu
c410: 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09  ffer_p[0];...}..
c420: 7d 20 65 6c 73 65 20 7b 0a 09 09 73 69 7a 65 20  } else {...size 
c430: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09  = buffer_p[0];..
c440: 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a  }...buffer_p++;.
c450: 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a  .buffer_len--;..
c460: 09 69 66 20 28 73 69 7a 65 20 3e 20 6f 75 74 62  .if (size > outb
c470: 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 43  uffer_len) {...C
c480: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c490: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
c4a0: 70 79 20 76 61 6c 75 65 20 62 75 66 66 65 72 20  py value buffer 
c4b0: 74 6f 20 6f 75 74 62 75 66 66 65 72 2c 20 6e 6f  to outbuffer, no
c4c0: 74 20 65 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20 20  t enough room.  
c4d0: 56 61 6c 75 65 20 62 75 66 66 65 72 20 6c 65 6e  Value buffer len
c4e0: 67 74 68 20 3d 20 25 6c 75 2c 20 6f 75 74 20 62  gth = %lu, out b
c4f0: 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d 20 25  uffer length = %
c500: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
c510: 6f 6e 67 29 20 73 69 7a 65 2c 20 28 75 6e 73 69  ong) size, (unsi
c520: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
c530: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  ffer_len);....re
c540: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
c550: 09 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f  .*outbuffer_len_
c560: 70 20 3d 20 73 69 7a 65 3b 0a 09 69 66 20 28 6f  p = size;..if (o
c570: 75 74 62 75 66 66 65 72 29 20 7b 0a 09 09 6d 65  utbuffer) {...me
c580: 6d 63 70 79 28 6f 75 74 62 75 66 66 65 72 2c 20  mcpy(outbuffer, 
c590: 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b  buffer_p, size);
c5a0: 0a 09 09 62 75 66 66 65 72 5f 70 20 2b 3d 20 73  ...buffer_p += s
c5b0: 69 7a 65 3b 0a 09 09 62 75 66 66 65 72 5f 6c 65  ize;...buffer_le
c5c0: 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a 62  n -= size;....*b
c5d0: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 62 75  uffer_len_p = bu
c5e0: 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43  ffer_len;....CAC
c5f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
c600: 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75  UF("BER-TLV resu
c610: 6c 74 73 3a 22 2c 20 6f 75 74 62 75 66 66 65 72  lts:", outbuffer
c620: 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65  , size);..} else
c630: 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 28 62 75 66   {...memmove(buf
c640: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
c650: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
c660: 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 09 43 41   = buffer;....CA
c670: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c680: 42 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73  BUF("BER-TLV res
c690: 75 6c 74 73 3a 22 2c 20 62 75 66 66 65 72 2c 20  ults:", buffer, 
c6a0: 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  size);..}...CACK
c6b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c6c0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
c6d0: 63 63 65 73 73 2e 20 20 53 69 7a 65 20 6f 66 20  ccess.  Size of 
c6e0: 63 6f 6e 74 65 6e 74 73 20 66 6f 72 20 74 61 67  contents for tag
c6f0: 20 25 30 32 78 20 69 73 20 25 6c 75 22 2c 20 28   %02x is %lu", (
c700: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61  unsigned int) ta
c710: 67 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  g, (unsigned lon
c720: 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75  g) size);...retu
c730: 72 6e 28 62 75 66 66 65 72 5f 70 29 3b 0a 7d 0a  rn(buffer_p);.}.
c740: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c750: 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63   *     ssize_t c
c760: 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73  ackey_get_data(s
c770: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
c780: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
c790: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
c7a0: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
c7b0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
c7c0: 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20   oid[3]);. *. * 
c7d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
c7e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
c7f0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
c800: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
c810: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
c820: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
c830: 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a   char *buffer. *
c840: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42           [OUT] B
c850: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20  uffer. *. *     
c860: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
c870: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  n. *         Num
c880: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
c890: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a  attempt to read.
c8a0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
c8b0: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20  ed char oid[3]. 
c8c0: 2a 20 20 20 20 20 20 20 20 20 33 2d 62 79 74 65  *         3-byte
c8d0: 20 4f 49 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a   OID to read. *.
c8e0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
c8f0: 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  UE. *     This f
c900: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
c910: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
c920: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
c930: 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f  d, or -1 on erro
c940: 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  r.. *. * NOTES. 
c950: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
c960: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
c970: 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
c980: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
c990: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
c9a0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
c9b0: 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  , size_t buffer_
c9c0: 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  len, unsigned ch
c9d0: 61 72 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e  ar oid[3]) {..un
c9e0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
c9f0: 5d 20 3d 20 7b 30 78 35 43 2c 20 30 78 30 33 2c  ] = {0x5C, 0x03,
ca00: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
ca10: 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  0};..unsigned ch
ca20: 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73  ar *buffer_p;..s
ca30: 69 7a 65 5f 74 20 69 6e 69 74 5f 62 75 66 66 65  ize_t init_buffe
ca40: 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b 0a 09 75 69  r_len, size;..ui
ca50: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
ca60: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
ca70: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ca80: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
ca90: 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 5f  ;...init_buffer_
caa0: 6c 65 6e 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e  len = buffer_len
cab0: 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64  ;...cmd[2] = oid
cac0: 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f  [0];..cmd[3] = o
cad0: 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d  id[1];..cmd[4] =
cae0: 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35   oid[2];.../* 25
caf0: 36 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  6 to indicate th
cb00: 65 20 6c 61 72 67 65 73 74 20 6d 65 73 73 61 67  e largest messag
cb10: 65 20 73 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c  e size -- not cl
cb20: 65 61 72 20 69 66 20 74 68 69 73 20 77 69 6c 6c  ear if this will
cb30: 20 77 6f 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d   work with all m
cb40: 65 73 73 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64  essages */..send
cb50: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
cb60: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
cb70: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
cb80: 36 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  6, NISTSP800_73_
cb90: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
cba0: 2c 20 30 78 33 46 2c 20 30 78 46 46 2c 20 73 69  , 0x3F, 0xFF, si
cbb0: 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20  zeof(cmd), cmd, 
cbc0: 32 35 36 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  256, &respcode, 
cbd0: 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f  buffer, &buffer_
cbe0: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  len);...if (send
cbf0: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
cc00: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
cc10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cc20: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
cc30: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79  ng failed, retry
cc40: 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72 22  ing read buffer"
cc50: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63  );....return(cac
cc60: 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f  key_get_data(slo
cc70: 74 2c 20 62 75 66 66 65 72 2c 20 69 6e 69 74 5f  t, buffer, init_
cc80: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 6f 69 64 29  buffer_len, oid)
cc90: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64  );..}...if (send
cca0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
ccb0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
ccc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ccd0: 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61  F("cackey_send_a
cce0: 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65  pdu() failed, re
ccf0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
cd00: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
cd10: 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  -1);..}..#ifdef 
cd20: 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a  CACKEY_PARANOID.
cd30: 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f  #  ifdef _POSIX_
cd40: 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 62  SSIZE_MAX..if (b
cd50: 75 66 66 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53  uffer_len > _POS
cd60: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
cd70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cd80: 52 49 4e 54 46 28 22 52 65 61 64 20 62 79 74 65  RINTF("Read byte
cd90: 73 20 28 62 75 66 66 65 72 5f 6c 65 6e 29 20 65  s (buffer_len) e
cda0: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
cdb0: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
cdc0: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
cdd0: 20 3d 20 25 6c 69 2c 20 62 75 66 66 65 72 5f 6c   = %li, buffer_l
cde0: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  en = %lu)", (lon
cdf0: 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
ce00: 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
ce10: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29  ong) buffer_len)
ce20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
ce30: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
ce40: 64 69 66 0a 0a 09 69 66 20 28 62 75 66 66 65 72  dif...if (buffer
ce50: 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41  _len < 2) {...CA
ce60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ce70: 46 28 22 41 50 44 55 20 47 45 54 20 44 41 54 41  F("APDU GET DATA
ce80: 20 72 65 74 75 72 6e 65 64 20 25 6c 75 20 62 79   returned %lu by
ce90: 74 65 73 2c 20 77 68 69 63 68 20 69 73 20 74 6f  tes, which is to
cea0: 6f 20 73 68 6f 72 74 20 66 6f 72 20 61 20 42 45  o short for a BE
ceb0: 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73 65 22 2c  R-TLV response",
cec0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ced0: 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09   buffer_len);...
cee0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
cef0: 0a 09 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f  ..size = buffer_
cf00: 6c 65 6e 3b 0a 09 62 75 66 66 65 72 5f 70 20 3d  len;..buffer_p =
cf10: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72   cackey_read_ber
cf20: 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72 2c 20  tlv_tag(buffer, 
cf30: 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78 35  &buffer_len, 0x5
cf40: 33 2c 20 4e 55 4c 4c 2c 20 26 73 69 7a 65 29 3b  3, NULL, &size);
cf50: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 70 20  ...if (buffer_p 
cf60: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
cf70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cf80: 28 22 54 61 67 20 64 65 63 6f 64 69 6e 67 20 66  ("Tag decoding f
cf90: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
cfa0: 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09   in error.");...
cfb0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
cfc0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cfd0: 52 49 4e 54 42 55 46 28 22 47 45 54 20 44 41 54  RINTBUF("GET DAT
cfe0: 41 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66 65  A result", buffe
cff0: 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b  r, size);...CACK
d000: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d010: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
d020: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
d030: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
d040: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a  d long) size);..
d050: 09 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d  .return(size);.}
d060: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
d070: 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20  . *     ssize_t 
d080: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
d090: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  er(struct cackey
d0a0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
d0b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
d0c0: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  er, size_t count
d0d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d0e0: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69  t_or_v, size_t i
d0f0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a  nitial_offset);.
d100: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
d110: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
d120: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
d130: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
d140: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
d150: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
d160: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
d170: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  fer. *         [
d180: 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20  OUT] Buffer. *. 
d190: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75  *     size_t cou
d1a0: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  nt. *         Nu
d1b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
d1c0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
d1d0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
d1e0: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a  ned char t_or_v.
d1f0: 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63   *         Selec
d200: 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28  t the T-buffer (
d210: 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20  01) or V-buffer 
d220: 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f  (02) to read fro
d230: 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73  m.  . *. *     s
d240: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
d250: 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20  fset. *         
d260: 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73  Specify the offs
d270: 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  et to begin the 
d280: 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a  read from. *. *.
d290: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
d2a0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
d2b0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
d2c0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
d2d0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
d2e0: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
d2f0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
d300: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
d310: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
d320: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
d330: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
d340: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
d350: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
d360: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
d370: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
d380: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
d390: 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09  tial_offset) {..
d3a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
d3b0: 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a  nit_buffer;..siz
d3c0: 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a  e_t init_count;.
d3d0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69  .size_t init_ini
d3e0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73  tial_offset;...s
d3f0: 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30  ize_t offset = 0
d400: 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61  , max_offset, ma
d410: 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  x_count;..unsign
d420: 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a  ed char cmd[2];.
d430: 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
d440: 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  de;..int send_re
d450: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
d460: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
d470: 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66  .");...init_buff
d480: 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e  er = buffer;..in
d490: 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74  it_count = count
d4a0: 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f  ;..init_initial_
d4b0: 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c  offset = initial
d4c0: 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f  _offset;...max_o
d4d0: 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09  ffset = count;..
d4e0: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b  max_count = CACK
d4f0: 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69  EY_APDU_MTU;...i
d500: 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26  f (t_or_v != 1 &
d510: 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b  & t_or_v != 2) {
d520: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d530: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
d540: 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72  T or V parameter
d550: 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75   specified, retu
d560: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d570: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
d580: 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d  );..}...cmd[0] =
d590: 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65   t_or_v;...while
d5a0: 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66   (1) {...if (off
d5b0: 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65  set >= max_offse
d5c0: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
d5d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66  EBUG_PRINTF("Buf
d5e0: 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72  fer too small, r
d5f0: 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65  eturning what we
d600: 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62   got...");.....b
d610: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75  reak;...}....cou
d620: 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20  nt = max_offset 
d630: 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28  - offset;...if (
d640: 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e  count > max_coun
d650: 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20  t) {....count = 
d660: 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a  max_count;...}..
d670: 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74  ..cmd[1] = count
d680: 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  ;....send_ret = 
d690: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
d6a0: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
d6b0: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
d6c0: 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  RM, GSCIS_INSTR_
d6d0: 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69  READ_BUFFER, ((i
d6e0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20  nitial_offset + 
d6f0: 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20  offset) >> 8) & 
d700: 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f  0xff, (initial_o
d710: 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20  ffset + offset) 
d720: 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63  & 0xff, sizeof(c
d730: 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20  md), cmd, 0x00, 
d740: 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65  &respcode, buffe
d750: 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75  r + offset, &cou
d760: 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64  nt);....if (send
d770: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
d780: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
d790: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d7a0: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
d7b0: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72  ing failed, retr
d7c0: 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72  ying read buffer
d7d0: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
d7e0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
d7f0: 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66  r(slot, init_buf
d800: 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c  fer, init_count,
d810: 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e   t_or_v, init_in
d820: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a  itial_offset));.
d830: 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  ..}....if (send_
d840: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
d850: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66  SC_S_OK) {....if
d860: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
d870: 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28  6A86) {.....if (
d880: 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20  max_count == 1) 
d890: 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
d8a0: 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75  ..}......max_cou
d8b0: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f  nt = max_count /
d8c0: 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75   2;......continu
d8d0: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  e;....}.....CACK
d8e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d8f0: 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64  "cackey_send_apd
d900: 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  u() failed, retu
d910: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d920: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
d930: 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65  1);...}....offse
d940: 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69  t += count;....i
d950: 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63  f (count < max_c
d960: 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
d970: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d980: 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f  Short read -- co
d990: 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d  unt = %i, cmd[1]
d9a0: 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f   = %i", (int) co
d9b0: 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31  unt, (int) cmd[1
d9c0: 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ]);.....break;..
d9d0: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  .}..}..#ifdef CA
d9e0: 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
d9f0: 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
da00: 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66  IZE_MAX..if (off
da10: 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  set > _POSIX_SSI
da20: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
da30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
da40: 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20  "Offset exceeds 
da50: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
da60: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
da70: 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
da80: 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c   offset = %lu)",
da90: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
daa0: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
dab0: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
dac0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
dad0: 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
dae0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
daf0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
db00: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
db10: 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73  , read %lu bytes
db20: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
db30: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65  g) offset);...re
db40: 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a  turn(offset);.}.
db50: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
db60: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
db70: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
db80: 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61  applet(struct ca
db90: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
dba0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dbb0: 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f  aid, size_t aid_
dbc0: 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  len);. *. * ARGU
dbd0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
dbe0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
dbf0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
dc00: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
dc10: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
dc20: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
dc30: 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20  r *aid. *       
dc40: 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e    Buffer contain
dc50: 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f  ing Applet ID to
dc60: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20   select. *. *   
dc70: 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e    size_t aid_len
dc80: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62  . *         Numb
dc90: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
dca0: 68 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74  he "aid" (Applet
dcb0: 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20   ID) parameter. 
dcc0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
dcd0: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
dce0: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
dcf0: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
dd00: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
dd10: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
dd20: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
dd30: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
dd40: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
dd50: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
dd60: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
dd70: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
dd80: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
dd90: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
dda0: 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74   aid_len) {..int
ddb0: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43   send_ret;...CAC
ddc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ddd0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
dde0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ddf0: 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20  TBUF("Selecting 
de00: 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61  applet:", aid, a
de10: 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f  id_len);...send_
de20: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
de30: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
de40: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
de50: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45  , GSCIS_INSTR_SE
de60: 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41  LECT, GSCIS_PARA
de70: 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c  M_SELECT_APPLET,
de80: 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20   0x00, aid_len, 
de90: 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  aid, 0x00, NULL,
dea0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09   NULL, NULL);...
deb0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
dec0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
ded0: 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TRY) {...CACKEY_
dee0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
def0: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
df00: 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65  d, retrying sele
df10: 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09  ct applet");....
df20: 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65  return(cackey_se
df30: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
df40: 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29  , aid, aid_len))
df50: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f  ;..}...if (send_
df60: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
df70: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
df80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
df90: 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  ("Failed to open
dfa0: 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69   applet, returni
dfb0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
dfc0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
dfd0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
dfe0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
dff0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
e000: 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74  cessfully select
e010: 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74  ed file");...ret
e020: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
e030: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
e040: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
e050: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
e060: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
e070: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e080: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
e090: 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55   ef);. *. * ARGU
e0a0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
e0b0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e0c0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
e0d0: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
e0e0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
e0f0: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a      uint16_t ef.
e100: 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65   *         Eleme
e110: 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c  ntal File to sel
e120: 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ect. *. * RETURN
e130: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
e140: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
e150: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
e160: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
e170: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
e180: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
e190: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
e1a0: 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c  is selects an El
e1b0: 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45  ementary File (E
e1c0: 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  F) under the cur
e1d0: 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a  rently selected.
e1e0: 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64   *     Dedicated
e1f0: 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a   File (DF). *. *
e200: 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74       Typically t
e210: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
e220: 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68  ter selecting th
e230: 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74  e correct Applet
e240: 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63   (using. *     c
e250: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
e260: 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64  let) for VM card
e270: 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  s. *. */.static 
e280: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
e290: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
e2a0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e2b0: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
e2c0: 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64   ef) {..unsigned
e2d0: 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d   char fid_buf[2]
e2e0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
e2f0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e300: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
e310: 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65  );.../* Open the
e320: 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65   elementary file
e330: 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20   */..fid_buf[0] 
e340: 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78  = (ef >> 8) & 0x
e350: 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20  ff;..fid_buf[1] 
e360: 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43  = ef & 0xff;...C
e370: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e380: 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69  TF("Selecting fi
e390: 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73  le: %04lx", (uns
e3a0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b  igned long) ef);
e3b0: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
e3c0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
e3d0: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
e3e0: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
e3f0: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78  INSTR_SELECT, 0x
e400: 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66  02, 0x0C, sizeof
e410: 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62  (fid_buf), fid_b
e420: 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  uf, 0x00, NULL, 
e430: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
e440: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
e450: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
e460: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
e470: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
e480: 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65  to open file, re
e490: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e4a0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e4b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
e4c0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
e4d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e4e0: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
e4f0: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
e500: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
e510: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
e520: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
e530: 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79       void cackey
e540: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74  _free_tlv(struct
e550: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e560: 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a  ty *root);. *. *
e570: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
e580: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
e590: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
e5a0: 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74  . *         Root
e5b0: 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74   of the TLV list
e5c0: 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e   to start freein
e5d0: 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  g. *. * RETURN V
e5e0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
e5f0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
e600: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
e610: 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20  n frees the TLV 
e620: 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65  linked listed re
e630: 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20  turned from. *  
e640: 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f     "cackey_read_
e650: 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  tlv". *. */.stat
e660: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
e670: 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ree_tlv(struct c
e680: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
e690: 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63   *root) {..struc
e6a0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e6b0: 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74  ity *curr, *next
e6c0: 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ;...if (root == 
e6d0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
e6e0: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72  ;..}...for (curr
e6f0: 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63   = root; curr; c
e700: 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09  urr = next) {...
e710: 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65  next = curr->_ne
e720: 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  xt;....switch (c
e730: 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63  urr->tag) {....c
e740: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
e750: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65  R_TABLE:....case
e760: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
e770: 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28  FICATE:.....if (
e780: 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09  curr->value) {..
e790: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
e7a0: 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09  alue);.....}....
e7b0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
e7c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
e7d0: 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d  L:.....if (curr-
e7e0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20  >value_cardurl) 
e7f0: 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
e800: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
e810: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  ;.....}.....brea
e820: 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63  k;...}....free(c
e830: 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  urr);..}...retur
e840: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
e850: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
e860: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e870: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
e880: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
e890: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
e8a0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
e8b0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74   *. */.static st
e8c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
e8d0: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
e8e0: 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ead_tlv(struct c
e8f0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
e900: 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
e910: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
e920: 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f  urr_entity, *roo
e930: 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20  t = NULL, *last 
e940: 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65  = NULL;..unsigne
e950: 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b  d char tlen_buf[
e960: 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32  2], tval_buf[102
e970: 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69  4], *tval;..unsi
e980: 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62  gned char vlen_b
e990: 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b  uf[2], vval_buf[
e9a0: 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75  8192], *vval;..u
e9b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
e9c0: 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  pbuf;..unsigned 
e9d0: 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  long tmpbuflen;.
e9e0: 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76  .ssize_t tlen, v
e9f0: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65  len;..ssize_t re
ea00: 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ad_ret;..size_t 
ea10: 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66  offset_t = 0, of
ea20: 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73  fset_v = 0;..uns
ea30: 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a  igned char tag;.
ea40: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
ea50: 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a  #ifdef HAVE_LIBZ
ea60: 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73  ..int uncompress
ea70: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
ea80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ea90: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
eaa0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
eab0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
eac0: 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73  lot, tlen_buf, s
ead0: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c  izeof(tlen_buf),
eae0: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
eaf0: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
eb00: 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29  sizeof(tlen_buf)
eb10: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
eb20: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
eb30: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
eb40: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
eb50: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
eb60: 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c  ..}...tlen = (tl
eb70: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
eb80: 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | tlen_buf[0];..
eb90: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
eba0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
ebb0: 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73  lot, vlen_buf, s
ebc0: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c  izeof(vlen_buf),
ebd0: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
ebe0: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
ebf0: 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29  sizeof(vlen_buf)
ec00: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ec10: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
ec20: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
ec30: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ec40: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
ec50: 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c  ..}...vlen = (vl
ec60: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
ec70: 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | vlen_buf[0];..
ec80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ec90: 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68  INTF("Tag Length
eca0: 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65   = %lu, Value Le
ecb0: 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e  ngth = %lu", (un
ecc0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65  signed long) tle
ecd0: 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
ece0: 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73  g) vlen);...offs
ecf0: 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73  et_t += 2;..offs
ed00: 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20  et_v += 2;...if 
ed10: 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74  (tlen > sizeof(t
ed20: 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  val_buf)) {...CA
ed30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ed40: 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73  F("Tag length is
ed50: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
ed60: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ed70: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ed80: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c  LL);..}...if (vl
ed90: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c  en > sizeof(vval
eda0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
edb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
edc0: 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20  Value length is 
edd0: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
ede0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
edf0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
ee00: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
ee10: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
ee20: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61  buffer(slot, tva
ee30: 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20  l_buf, tlen, 1, 
ee40: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
ee50: 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e  read_ret != tlen
ee60: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ee70: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
ee80: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
ee90: 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   T-buffer, retur
eea0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
eeb0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
eec0: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
eed0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
eee0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61  buffer(slot, vva
eef0: 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20  l_buf, vlen, 2, 
ef00: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
ef10: 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e  read_ret != vlen
ef20: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ef30: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
ef40: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
ef50: 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   V-buffer, retur
ef60: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
ef70: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
ef80: 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20  L);..}...tval = 
ef90: 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20  tval_buf;..vval 
efa0: 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69  = vval_buf;..whi
efb0: 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20  le (tlen > 0 && 
efc0: 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61  vlen > 0) {...ta
efd0: 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61  g = *tval;...tva
efe0: 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a  l++;...tlen--;..
eff0: 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30  ..if (*tval == 0
f000: 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68  xff) {....length
f010: 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38   = (tval[2] << 8
f020: 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09  ) | tval[1];....
f030: 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c  tval += 3;....tl
f040: 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73  en -= 3;...} els
f050: 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  e {....length = 
f060: 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b  *tval;....tval++
f070: 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d  ;....tlen--;...}
f080: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f090: 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73  _PRINTF("Tag: %s
f0a0: 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59   (%02x)", CACKEY
f0b0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
f0c0: 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e  TO_STR(tag), (un
f0d0: 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29  signed int) tag)
f0e0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
f0f0: 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65  _PRINTBUF("Value
f100: 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  :", vval, length
f110: 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74  );....curr_entit
f120: 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74  y = NULL;...swit
f130: 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61  ch (tag) {....ca
f140: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
f150: 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65  DURL:.....curr_e
f160: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
f170: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
f180: 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65  ty));.....curr_e
f190: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
f1a0: 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  durl = malloc(si
f1b0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
f1c0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
f1d0: 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  ));......memcpy(
f1e0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
f1f0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
f200: 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63   vval, 5);.....c
f210: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
f220: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
f230: 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09  pe = vval[5];...
f240: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
f250: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
f260: 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36  jectid = (vval[6
f270: 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37  ] << 8) | vval[7
f280: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
f290: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
f2a0: 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c  l->appid = (vval
f2b0: 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [8] << 8) | vval
f2c0: 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  [9];......curr_e
f2d0: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
f2e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
f2f0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
f300: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
f310: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
f320: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75  CR_TABLE:.....cu
f330: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
f340: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
f350: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d  entity));.....tm
f360: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65  pbuf = malloc(le
f370: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  ngth);......memc
f380: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
f390: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63   length);......c
f3a0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
f3b0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
f3c0: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
f3d0: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72   length;.....cur
f3e0: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
f3f0: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
f400: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
f410: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
f420: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
f430: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
f440: 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  TE:.....curr_ent
f450: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
f460: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
f470: 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ));..#ifdef HAVE
f480: 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66  _LIBZ.....tmpbuf
f490: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32  len = length * 2
f4a0: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
f4b0: 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29  alloc(tmpbuflen)
f4c0: 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  ;......uncompres
f4d0: 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65  s_ret = uncompre
f4e0: 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62  ss(tmpbuf, &tmpb
f4f0: 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e  uflen, vval, len
f500: 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e  gth);.....if (un
f510: 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20  compress_ret != 
f520: 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43  Z_OK) {......CAC
f530: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f540: 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f  ("Failed to deco
f550: 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65  mpress, uncompre
f560: 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69  ss() returned %i
f570: 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f   -- resorting to
f580: 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75   direct copy", u
f590: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a  ncompress_ret);.
f5a0: 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
f5b0: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d  = length;......m
f5c0: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
f5d0: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09  al, length);....
f5e0: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
f5f0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44  EBUG_PRINTBUF("D
f600: 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22  ecompressed to:"
f610: 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66  , tmpbuf, tmpbuf
f620: 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09  len);.#else.....
f630: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f640: 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49  NTF("Missing ZLI
f650: 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20  B Support, this 
f660: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c  certificate is l
f670: 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e  ikely useless...
f680: 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ");......tmpbufl
f690: 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  en = length;....
f6a0: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
f6b0: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23  vval, length);.#
f6c0: 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f  endif......curr_
f6d0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
f6e0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
f6f0: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70  ty->length = tmp
f700: 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72  buflen;.....curr
f710: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
f720: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
f730: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
f740: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
f750: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
f760: 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09  S_TAG_PKCS15:...
f770: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
f780: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
f790: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09  urr_entity));...
f7a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f7b0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
f7c0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
f7d0: 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d  e_byte = vval[0]
f7e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
f7f0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
f800: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
f810: 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67  ....vval += leng
f820: 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65  th;...vlen -= le
f830: 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72  ngth;....if (cur
f840: 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c  r_entity != NULL
f850: 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20  ) {....if (root 
f860: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72  == NULL) {.....r
f870: 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  oot = curr_entit
f880: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  y;....}.....if (
f890: 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  last != NULL) {.
f8a0: 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20  ....last->_next 
f8b0: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
f8c0: 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63  ..}.....last = c
f8d0: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a  urr_entity;...}.
f8e0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74  .}...return(root
f8f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
f900: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
f910: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
f920: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
f930: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
f940: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
f950: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
f960: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
f970: 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  id cackey_free_c
f980: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
f990: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
f9a0: 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20   *start, size_t 
f9b0: 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f  count, int free_
f9c0: 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74  start) {..size_t
f9d0: 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72   idx;...if (star
f9e0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
f9f0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
fa00: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
fa10: 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  count; idx++) {.
fa20: 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d  ..if (start[idx]
fa30: 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a  .certificate) {.
fa40: 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64  ...free(start[id
fa50: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b  x].certificate);
fa60: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72  ...}..}...if (fr
fa70: 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72  ee_start) {...fr
fa80: 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09  ee(start);..}...
fa90: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
faa0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
fab0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
fac0: 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73  ackey_copy_certs
fad0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
fae0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64 65  csc_identity *de
faf0: 73 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  st, struct cacke
fb00: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
fb10: 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63  *start, size_t c
fb20: 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20  ount) {..size_t 
fb30: 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74  idx;...if (start
fb40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
fb50: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
fb60: 09 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c  .if (dest == NUL
fb70: 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61  L) {...dest = ma
fb80: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65 73  lloc(sizeof(*des
fb90: 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a  t) * count);..}.
fba0: 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
fbb0: 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78  idx < count; idx
fbc0: 2b 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69 64 78  ++) {...dest[idx
fbd0: 5d 2e 69 64 5f 74 79 70 65 20 3d 20 73 74 61 72  ].id_type = star
fbe0: 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 3b 0a  t[idx].id_type;.
fbf0: 0a 09 09 73 77 69 74 63 68 20 28 64 65 73 74 5b  ...switch (dest[
fc00: 69 64 78 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a  idx].id_type) {.
fc10: 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
fc20: 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09  D_TYPE_CAC:.....
fc30: 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d  memcpy(dest[idx]
fc40: 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  .card.cac.applet
fc50: 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  , start[idx].car
fc60: 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
fc70: 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63  zeof(dest[idx].c
fc80: 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
fc90: 3b 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e  ;.....dest[idx].
fca0: 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20  card.cac.file = 
fcb0: 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e  start[idx].card.
fcc0: 63 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09 62 72  cac.file;.....br
fcd0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43  eak;....case CAC
fce0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a  KEY_ID_TYPE_PIV:
fcf0: 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  .....dest[idx].c
fd00: 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d  ard.piv.key_id =
fd10: 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64   start[idx].card
fd20: 2e 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09 09 09  .piv.key_id;....
fd30: 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78  .memcpy(dest[idx
fd40: 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ].card.piv.label
fd50: 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  , start[idx].car
fd60: 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73 69 7a  d.piv.label, siz
fd70: 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  eof(dest[idx].ca
fd80: 72 64 2e 70 69 76 2e 6c 61 62 65 6c 29 29 3b 0a  rd.piv.label));.
fd90: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
fda0: 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
fdb0: 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09  E_CERT_ONLY:....
fdc0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 64 65  .break;...}...de
fdd0: 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
fde0: 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72 74 5b  ate_len = start[
fdf0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fe00: 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69 64 78  _len;...dest[idx
fe10: 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74 61 72  ].keysize = star
fe20: 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a  t[idx].keysize;.
fe30: 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  ...dest[idx].cer
fe40: 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
fe50: 63 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  c(dest[idx].cert
fe60: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
fe70: 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d  memcpy(dest[idx]
fe80: 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 73 74  .certificate, st
fe90: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
fea0: 63 61 74 65 2c 20 64 65 73 74 5b 69 64 78 5d 2e  cate, dest[idx].
feb0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
fec0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 64 65  ;..}...return(de
fed0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  st);.}../*. * SY
fee0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
fef0: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
ff00: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ff10: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
ff20: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ff30: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
ff40: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
ff50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
ff60: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  sc_identity *cac
ff70: 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
ff80: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
ff90: 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20  t *slot, struct 
ffa0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
ffb0: 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e 73  tity *certs, uns
ffc0: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e  igned long *coun
ffd0: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
ffe0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
fff0: 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74 72  y *curr_id;..str
10000 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
10010 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20  ntity *ccc_tlv, 
10020 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f  *ccc_curr, *app_
10030 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a  tlv, *app_curr;.
10040 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
10050 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49  cc_aid[] = {GSCI
10060 53 5f 41 49 44 5f 43 43 43 7d 2c 20 70 69 76 5f  S_AID_CCC}, piv_
10070 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  aid[] = {NISTSP8
10080 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41 49 44 7d  00_73_3_PIV_AID}
10090 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
100a0 20 2a 70 69 76 5f 6f 69 64 2c 20 70 69 76 5f 6f   *piv_oid, piv_o
100b0 69 64 5f 70 69 76 61 75 74 68 5b 5d 20 3d 20 7b  id_pivauth[] = {
100c0 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
100d0 49 44 5f 50 49 56 41 55 54 48 7d 2c 20 70 69 76  ID_PIVAUTH}, piv
100e0 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 5b 5d  _oid_signature[]
100f0 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33   = {NISTSP800_73
10100 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52 45  _3_OID_SIGNATURE
10110 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67  }, piv_oid_keymg
10120 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30  t[] = {NISTSP800
10130 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47 54  _73_3_OID_KEYMGT
10140 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
10150 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
10160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75  unsigned char bu
10170 66 66 65 72 5b 38 31 39 32 5d 2c 20 2a 62 75 66  ffer[8192], *buf
10180 66 65 72 5f 70 2c 20 2a 74 6d 70 62 75 66 3b 0a  fer_p, *tmpbuf;.
10190 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f  .unsigned long o
101a0 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 68 61 72  utidx = 0;..char
101b0 20 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63 61   *piv_label;..ca
101c0 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63  ckey_ret transac
101d0 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65  tion_ret;..ssize
101e0 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69  _t read_ret;..si
101f0 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c  ze_t buffer_len,
10200 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74   tmpbuflen;..int
10210 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65   certs_resizable
10220 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c  ;..int send_ret,
10230 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69 6e   select_ret;..in
10240 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20 3d  t piv_key, piv =
10250 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 23 69   0;..int idx;.#i
10260 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09  fdef HAVE_LIBZ..
10270 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  int uncompress_r
10280 65 74 3b 0a 09 7a 5f 73 74 72 65 61 6d 20 67 7a  et;..z_stream gz
10290 69 70 5f 73 74 72 65 61 6d 3b 0a 23 65 6e 64 69  ip_stream;.#endi
102a0 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
102b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
102c0 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20  ");...if (count 
102d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
102e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
102f0 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c  ("count is NULL,
10300 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
10310 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
10320 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
10330 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c  f (certs != NULL
10340 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74  ) {...if (*count
10350 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   == 0) {....CACK
10360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10370 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65  "Requested we re
10380 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20  turn 0 objects, 
10390 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b  short-circuit");
103a0 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
103b0 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  s);...}..}...if 
103c0 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73  (!slot->slot_res
103d0 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74  et) {...if (slot
103e0 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ->cached_certs) 
103f0 7b 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d  {....if (certs =
10400 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65  = NULL) {.....ce
10410 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rts = malloc(siz
10420 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c  eof(*certs) * sl
10430 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
10440 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f  _count);.....*co
10450 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68  unt = slot->cach
10460 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
10470 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
10480 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f  if (*count > slo
10490 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
104a0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63  count) {......*c
104b0 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63  ount = slot->cac
104c0 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b  hed_certs_count;
104d0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
104e0 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74  cackey_copy_cert
104f0 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  s(certs, slot->c
10500 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f  ached_certs, *co
10510 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  unt);.....return
10520 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
10530 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
10540 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61  ed_certs) {...ca
10550 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
10560 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
10570 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  ts, slot->cached
10580 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29  _certs_count, 1)
10590 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65  ;....slot->cache
105a0 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a  d_certs = NULL;.
105b0 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20  .}.../* Begin a 
105c0 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73 61  SmartCard transa
105d0 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61  ction */..transa
105e0 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b  ction_ret = cack
105f0 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
10600 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20  tion(slot);..if 
10610 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74  (transaction_ret
10620 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
10630 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
10640 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
10650 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e  nable begin tran
10660 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69  saction, returni
10670 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
10680 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
10690 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74  ;..}.../* Select
106a0 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74 20   the CCC Applet 
106b0 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
106c0 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
106d0 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69  let(slot, ccc_ai
106e0 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69  d, sizeof(ccc_ai
106f0 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  d));..if (send_r
10700 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
10710 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 2f 2a 20 54  C_S_OK) {.../* T
10720 72 79 20 50 49 56 20 61 70 70 6c 69 63 61 74 69  ry PIV applicati
10730 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64 5f 72 65 74  on */...send_ret
10740 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
10750 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 70 69  _applet(slot, pi
10760 76 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 70 69  v_aid, sizeof(pi
10770 76 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73  v_aid));...if (s
10780 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  end_ret == CACKE
10790 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
107a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
107b0 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 61  RINTF("We have a
107c0 20 50 49 56 20 63 61 72 64 20 2d 2d 20 6e 6f 74   PIV card -- not
107d0 20 75 73 69 6e 67 20 74 68 65 20 43 43 43 2c 20   using the CCC, 
107e0 70 75 6c 6c 69 6e 67 20 70 72 65 2d 73 65 6c 65  pulling pre-sele
107f0 63 74 65 64 20 6b 65 79 73 22 29 3b 0a 0a 09 09  cted keys");....
10800 09 70 69 76 20 3d 20 31 3b 0a 09 09 7d 20 65 6c  .piv = 1;...} el
10810 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
10820 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
10830 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20 43 43  ble to select CC
10840 43 20 41 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  C Applet, return
10850 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
10860 3b 0a 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61  ;...../* Termina
10870 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61  te SmartCard Tra
10880 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  nsaction */....c
10890 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
108a0 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
108b0 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55  .if (certs == NU
108c0 4c 4c 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e 74  LL) {.....*count
108d0 20 3d 20 30 3b 0a 09 09 09 7d 0a 0a 09 09 09 72   = 0;....}.....r
108e0 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d  eturn(NULL);...}
108f0 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20  ..}...if (certs 
10900 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72  == NULL) {...cer
10910 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ts = malloc(size
10920 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b  of(*certs) * 5);
10930 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09  ...*count = 5;..
10940 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
10950 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 1;..} else {.
10960 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  ..certs_resizabl
10970 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  e = 0;..}...if (
10980 70 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69 64  piv) {...for (id
10990 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b 20  x = 0; idx < 3; 
109a0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69 74  idx++) {....swit
109b0 63 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09 63  ch (idx) {.....c
109c0 61 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76 5f  ase 0:......piv_
109d0 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70 69  oid = piv_oid_pi
109e0 76 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76 5f  vauth;......piv_
109f0 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f  key = NISTSP800_
10a00 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54 48  78_3_KEY_PIVAUTH
10a10 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
10a20 20 3d 20 22 41 75 74 68 65 6e 74 69 63 61 74 69   = "Authenticati
10a30 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  on";......break;
10a40 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09 09  .....case 1:....
10a50 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f  ..piv_oid = piv_
10a60 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a 09  oid_signature;..
10a70 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49  ....piv_key = NI
10a80 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
10a90 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 09  _SIGNATURE;.....
10aa0 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 53 69  .piv_label = "Si
10ab0 67 6e 61 74 75 72 65 22 3b 0a 09 09 09 09 09 62  gnature";......b
10ac0 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 32  reak;.....case 2
10ad0 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d  :......piv_oid =
10ae0 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b   piv_oid_keymgt;
10af0 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20  ......piv_key = 
10b00 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
10b10 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09  EY_KEYMGT;......
10b20 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 4b 65 79  piv_label = "Key
10b30 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b 0a 09 09   Management";...
10b40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
10b50 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
10b60 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c  ckey_get_data(sl
10b70 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65  ot, buffer, size
10b80 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69 76 5f  of(buffer), piv_
10b90 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72 65  oid);.....if (re
10ba0 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
10bb0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
10bc0 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20  }.....curr_id = 
10bd0 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a  &certs[outidx];.
10be0 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
10bf0 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a  .curr_id->keysiz
10c00 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f  e = -1;....curr_
10c10 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41  id->id_type = CA
10c20 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
10c30 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61  ;....curr_id->ca
10c40 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20  rd.piv.key_id = 
10c50 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d 65 6d 63  piv_key;....memc
10c60 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  py(curr_id->card
10c70 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70 69 76 5f  .piv.label, piv_
10c80 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e 28 70 69  label, strlen(pi
10c90 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29 3b 0a 0a  v_label) + 1);..
10ca0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
10cb0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 72 65  ificate_len = re
10cc0 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72 72 5f  ad_ret;....curr_
10cd0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
10ce0 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
10cf0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10d00 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65 72 5f 6c  n);.....buffer_l
10d10 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66  en = sizeof(buff
10d20 65 72 29 3b 0a 09 09 09 62 75 66 66 65 72 5f 70  er);....buffer_p
10d30 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
10d40 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72  ertlv_tag(buffer
10d50 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30  , &buffer_len, 0
10d60 78 37 30 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  x70, curr_id->ce
10d70 72 74 69 66 69 63 61 74 65 2c 20 26 63 75 72 72  rtificate, &curr
10d80 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10d90 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 62  _len);.....if (b
10da0 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29  uffer_p == NULL)
10db0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10dc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
10dd0 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20  ing certificate 
10de0 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20 72 65 73  from BER-TLV res
10df0 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c 20 73 6b  ponse failed, sk
10e00 69 70 70 69 6e 67 20 6b 65 79 20 25 69 22 2c 20  ipping key %i", 
10e10 69 64 78 29 3b 0a 0a 09 09 09 09 66 72 65 65 28  idx);......free(
10e20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10e30 63 61 74 65 29 3b 0a 0a 09 09 09 09 63 75 72 72  cate);......curr
10e40 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10e50 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 6f 75   = NULL;......ou
10e60 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e  tidx--;......con
10e70 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 23 69 66  tinue;....}..#if
10e80 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
10e90 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 63 65  .if (curr_id->ce
10ea0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 20  rtificate_len > 
10eb0 34 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 65 6d  4) {.....if (mem
10ec0 63 6d 70 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  cmp(curr_id->cer
10ed0 74 69 66 69 63 61 74 65 2c 20 22 5c 78 31 66 5c  tificate, "\x1f\
10ee0 78 38 62 5c 78 30 38 5c 78 30 30 22 2c 20 34 29  x8b\x08\x00", 4)
10ef0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 74 6d   == 0) {......tm
10f00 70 62 75 66 6c 65 6e 20 3d 20 63 75 72 72 5f 69  pbuflen = curr_i
10f10 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
10f20 65 6e 20 2a 20 32 3b 0a 09 09 09 09 09 74 6d 70  en * 2;......tmp
10f30 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
10f40 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 43  buflen);.......C
10f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10f60 54 42 55 46 28 22 41 74 74 65 6d 70 74 69 6e 67  TBUF("Attempting
10f70 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 3a 22   to decompress:"
10f80 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
10f90 66 69 63 61 74 65 2c 20 63 75 72 72 5f 69 64 2d  ficate, curr_id-
10fa0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
10fb0 29 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73 74  );.......gzip_st
10fc0 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 4e 55  ream.zalloc = NU
10fd0 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74  LL;......gzip_st
10fe0 72 65 61 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c  ream.zfree = NUL
10ff0 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  L;......gzip_str
11000 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c  eam.opaque = NUL
11010 4c 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73 74  L;.......gzip_st
11020 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d 20  ream.next_in  = 
11030 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11040 63 61 74 65 3b 0a 09 09 09 09 09 67 7a 69 70 5f  cate;......gzip_
11050 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20  stream.avail_in 
11060 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  = curr_id->certi
11070 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09 09  ficate_len;.....
11080 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78  .gzip_stream.nex
11090 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 3b 0a  t_out = tmpbuf;.
110a0 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
110b0 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74 6d 70  .avail_out = tmp
110c0 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 09 75 6e  buflen;.......un
110d0 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69  compress_ret = i
110e0 6e 66 6c 61 74 65 49 6e 69 74 28 26 67 7a 69 70  nflateInit(&gzip
110f0 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 69  _stream);......i
11100 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
11110 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t == Z_OK) {....
11120 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
11130 74 20 3d 20 69 6e 66 6c 61 74 65 52 65 73 65 74  t = inflateReset
11140 32 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20  2(&gzip_stream, 
11150 33 31 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  31);......}.....
11160 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
11170 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09  ret == Z_OK) {..
11180 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f  .....uncompress_
11190 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 28 26 67  ret = inflate(&g
111a0 7a 69 70 5f 73 74 72 65 61 6d 2c 20 30 29 3b 0a  zip_stream, 0);.
111b0 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28  .....}......if (
111c0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
111d0 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 29 20  = Z_STREAM_END) 
111e0 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65  {.......uncompre
111f0 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65  ss_ret = inflate
11200 45 6e 64 28 26 67 7a 69 70 5f 73 74 72 65 61 6d  End(&gzip_stream
11210 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  );......} else {
11220 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  .......uncompres
11230 73 5f 72 65 74 20 3d 20 5a 5f 44 41 54 41 5f 45  s_ret = Z_DATA_E
11240 52 52 4f 52 3b 0a 09 09 09 09 09 7d 0a 09 09 09  RROR;......}....
11250 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
11260 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret == Z_OK) {.
11270 09 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
11280 3d 20 67 7a 69 70 5f 73 74 72 65 61 6d 2e 74 6f  = gzip_stream.to
11290 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09 09 09 09 09  tal_out;........
112a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
112b0 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
112c0 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
112d0 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  , tmpbuflen);...
112e0 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 69  .....free(curr_i
112f0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 29 3b  d->certificate);
11300 0a 0a 09 09 09 09 09 09 63 75 72 72 5f 69 64 2d  ........curr_id-
11310 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 74  >certificate = t
11320 6d 70 62 75 66 3b 0a 09 09 09 09 09 09 63 75 72  mpbuf;.......cur
11330 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
11340 65 5f 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65  e_len = tmpbufle
11350 6e 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  n;......} else {
11360 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
11370 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 6f  BUG_PRINTF("Deco
11380 6d 70 72 65 73 73 69 6e 67 20 66 61 69 6c 65 64  mpressing failed
11390 21 20 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72  ! uncompress() r
113a0 65 74 75 72 6e 65 64 20 25 69 22 2c 20 75 6e 63  eturned %i", unc
113b0 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09  ompress_ret);...
113c0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
113d0 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  );......}.....}.
113e0 09 09 09 7d 0a 23 65 6e 64 69 66 0a 09 09 7d 0a  ...}.#endif...}.
113f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52  .} else {.../* R
11400 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c  ead all the appl
11410 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43  ets from the CCC
11420 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f  's TLV */...ccc_
11430 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
11440 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
11450 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44  /* Look for CARD
11460 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73  URLs that coores
11470 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c  pond to PKI appl
11480 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63  ets */...for (cc
11490 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
114a0 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
114b0 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
114c0 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43  >_next) {....CAC
114d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
114e0 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20  ("Found tag: %s 
114f0 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45  ... ", CACKEY_DE
11500 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
11510 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  STR(ccc_curr->ta
11520 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63  g));.....if (ccc
11530 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53  _curr->tag != GS
11540 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29  CIS_TAG_CARDURL)
11550 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
11560 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
11570 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
11580 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
11590 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a  t CARDURLs)");..
115a0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
115b0 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f  .}.....if ((ccc_
115c0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
115d0 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43  url->apptype & C
115e0 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
115f0 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56  I) != CACKEY_TLV
11600 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09  _APP_PKI) {.....
11610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11620 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
11630 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
11640 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
11650 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
11660 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
11670 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
11680 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
11690 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
116a0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
116b0 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
116c0 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
116d0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
116e0 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
116f0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
11700 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
11710 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
11720 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
11730 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
11740 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
11750 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
11760 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43  l->rid));....CAC
11770 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11780 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34  ("AppID = %s/%04
11790 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
117a0 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
117b0 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
117c0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
117d0 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
117e0 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
117f0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
11800 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  pid);....CACKEY_
11810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62  DEBUG_PRINTF("Ob
11820 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c  jectID = %s/%04l
11830 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
11840 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
11850 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
11860 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
11870 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ctid), (unsigned
11880 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
11890 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
118a0 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d  objectid);.....m
118b0 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20  emcpy(curr_aid, 
118c0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
118d0 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69  cardurl->rid, si
118e0 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76  zeof(ccc_curr->v
118f0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
11900 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64  d));....curr_aid
11910 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
11920 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
11930 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
11940 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
11950 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61   0xff;....curr_a
11960 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
11970 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63  id) - 1] = ccc_c
11980 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
11990 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66  rl->appid & 0xff
119a0 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
119b0 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
119c0 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65   */....select_re
119d0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
119e0 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
119f0 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  urr_aid, sizeof(
11a00 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69  curr_aid));....i
11a10 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
11a20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
11a30 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
11a40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
11a50 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61  iled to select a
11a60 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  pplet, skipping 
11a70 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
11a80 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
11a90 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11aa0 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20  ...../* ... and 
11ab0 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f  object (file) */
11ac0 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
11ad0 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
11ae0 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
11af0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
11b00 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
11b10 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
11b20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
11b30 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
11b40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11b50 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74  Failed to select
11b60 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20   file, skipping 
11b70 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
11b80 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
11b90 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11ba0 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20  ...../* Process 
11bb0 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20  this file's TLV 
11bc0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74  looking for cert
11bd0 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61  ificates */....a
11be0 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  pp_tlv = cackey_
11bf0 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
11c00 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75  .....for (app_cu
11c10 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70  rr = app_tlv; ap
11c20 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72  p_curr; app_curr
11c30 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65   = app_curr->_ne
11c40 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  xt) {.....CACKEY
11c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
11c60 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
11c70 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11c80 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
11c90 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
11ca0 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74  .if (app_curr->t
11cb0 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
11cc0 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
11cd0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11ce0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
11cf0 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
11d00 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
11d10 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a  ERTIFICATEs)");.
11d20 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
11d30 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f  ....}......curr_
11d40 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69  id = &certs[outi
11d50 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b  dx];.....outidx+
11d60 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  +;......curr_id-
11d70 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45  >id_type = CACKE
11d80 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09  Y_ID_TYPE_CAC;..
11d90 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
11da0 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
11db0 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  et, curr_aid, si
11dc0 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61  zeof(curr_id->ca
11dd0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
11de0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61  .....curr_id->ca
11df0 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63 63  rd.cac.file = cc
11e00 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11e10 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b  rdurl->objectid;
11e20 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65  .....curr_id->ke
11e30 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09  ysize = -1;.....
11e40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11e50 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75  INTF("Filling cu
11e60 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11e70 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68  applet (%p) with
11e80 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75   %lu bytes:", cu
11e90 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11ea0 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65  applet, (unsigne
11eb0 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63  d long) sizeof(c
11ec0 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
11ed0 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43  .applet));.....C
11ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ef0 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72  TBUF("VAL:", cur
11f00 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
11f10 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75  pplet, sizeof(cu
11f20 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11f30 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63  applet));......c
11f40 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11f50 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75  ate_len = app_cu
11f60 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09  rr->length;.....
11f70 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
11f80 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  icate = malloc(c
11f90 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11fa0 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
11fb0 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcpy(curr_id->ce
11fc0 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63  rtificate, app_c
11fd0 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72  urr->value, curr
11fe0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11ff0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
12000 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74  outidx >= *count
12010 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65 72  ) {......if (cer
12020 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
12030 09 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20  ......*count *= 
12040 32 3b 0a 09 09 09 09 09 09 69 66 20 28 2a 63 6f  2;.......if (*co
12050 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  unt != 0) {.....
12060 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
12070 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
12080 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
12090 6e 74 29 29 3b 0a 09 09 09 09 09 09 7d 20 65 6c  nt));.......} el
120a0 73 65 20 7b 0a 09 09 09 09 09 09 09 63 65 72 74  se {........cert
120b0 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  s = NULL;.......
120c0 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
120d0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
120e0 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ..}.....}....}..
120f0 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  ...cackey_free_t
12100 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09  lv(app_tlv);....
12110 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
12120 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65  count) {.....bre
12130 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ak;....}...}....
12140 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
12150 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a  ccc_tlv);..}...*
12160 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a  count = outidx;.
12170 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69  ..if (certs_resi
12180 7a 61 62 6c 65 29 20 7b 0a 09 09 69 66 20 28 2a  zable) {...if (*
12190 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  count != 0) {...
121a0 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63  .certs = realloc
121b0 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a  (certs, sizeof(*
121c0 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74  certs) * (*count
121d0 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ));...} else {..
121e0 09 09 66 72 65 65 28 63 65 72 74 73 29 3b 0a 0a  ..free(certs);..
121f0 09 09 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ...certs = NULL;
12200 0a 09 09 7d 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  ...}..}...slot->
12210 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 63  cached_certs = c
12220 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73  ackey_copy_certs
12230 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63  (NULL, certs, *c
12240 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61  ount);..slot->ca
12250 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
12260 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20   = *count;.../* 
12270 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
12280 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
12290 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
122a0 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
122b0 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73  ;...return(certs
122c0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
122d0 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
122e0 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
122f0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
12300 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
12310 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
12320 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
12330 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
12340 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67  ize_t cackey_sig
12350 6e 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20  ndecrypt(struct 
12360 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
12370 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
12380 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
12390 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
123a0 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  ar *buf, size_t 
123b0 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  buflen, unsigned
123c0 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73   char *outbuf, s
123d0 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c  ize_t outbuflen,
123e0 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69   int padInput, i
123f0 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20  nt unpadOutput) 
12400 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  {..cackey_pcsc_i
12410 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b 0a  d_type id_type;.
12420 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  .unsigned char d
12430 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
12440 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61 75 74 68 5f  [10], *dyn_auth_
12450 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65  tmpbuf;..unsigne
12460 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20  d char *tmpbuf, 
12470 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62  *tmpbuf_s, *outb
12480 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70 3b  uf_s, *outbuf_p;
12490 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
124a0 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70  bytes_to_send, p
124b0 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67  1, class;..unsig
124c0 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79  ned char blockty
124d0 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  pe;..cackey_ret 
124e0 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31  send_ret;..uint1
124f0 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73  6_t respcode;..s
12500 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20  size_t retval = 
12510 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a  0, unpadoffset;.
12520 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65  .size_t tmpbufle
12530 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75  n, padlen, tmpou
12540 74 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 5f  tbuflen, outbuf_
12550 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74  len;..int free_t
12560 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20  mpbuf = 0;..int 
12570 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  le;...CACKEY_DEB
12580 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
12590 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
125a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
125b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
125c0 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
125d0 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
125e0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
125f0 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
12600 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
12610 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
12620 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
12630 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12640 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
12650 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
12660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12670 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
12680 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
12690 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
126a0 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
126b0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
126c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
126d0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69  ror.  identity i
126e0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
126f0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
12700 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
12710 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  _identity == NUL
12720 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
12730 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12740 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
12750 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e  sc_identity is N
12760 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
12770 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79  (-1);..}...id_ty
12780 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  pe = identity->p
12790 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69 64  csc_identity->id
127a0 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64 5f 74  _type;..if (id_t
127b0 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44  ype == CACKEY_ID
127c0 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 29  _TYPE_CERT_ONLY)
127d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
127e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
127f0 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
12800 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43 41 43  _identity is CAC
12810 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
12820 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63 61 6e  _ONLY, which can
12830 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  not be used for 
12840 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a  sign/decrypt");.
12850 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12860 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74  }...switch (id_t
12870 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41  ype) {...case CA
12880 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
12890 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  :...case CACKEY_
128a0 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09  ID_TYPE_CAC:....
128b0 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
128c0 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
128d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
128e0 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
128f0 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74  _identity is not
12900 20 61 20 73 75 70 70 6f 72 74 65 64 20 76 61 6c   a supported val
12910 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30 78 25  ue. Type is: 0x%
12920 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c 78 2c  lx (PIV = 0x%lx,
12930 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22 2c 20   CAC = 0x%lx)", 
12940 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12950 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69 67 6e  id_type, (unsign
12960 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f  ed long) CACKEY_
12970 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28 75 6e  ID_TYPE_PIV, (un
12980 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43  signed long) CAC
12990 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 29  KEY_ID_TYPE_CAC)
129a0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
129b0 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
129c0 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79  ine identity Key
129d0 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64   size */..if (id
129e0 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
129f0 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c  ntity->keysize <
12a00 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79   0) {...identity
12a10 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
12a20 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f  >keysize = x509_
12a30 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74  to_keysize(ident
12a40 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12a50 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
12a60 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
12a70 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
12a80 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  icate_len);..}..
12a90 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20  ./* Pad message 
12aa0 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09  to key size */..
12ab0 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a  if (padInput) {.
12ac0 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
12ad0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
12ae0 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09  eysize > 0) {...
12af0 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69  .if (buflen != i
12b00 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12b10 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29  entity->keysize)
12b20 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65   {.....if (bufle
12b30 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  n > (identity->p
12b40 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
12b50 79 73 69 7a 65 20 2d 20 33 29 29 20 7b 0a 09 09  ysize - 3)) {...
12b60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12b70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
12b80 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  Message is too l
12b90 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63  arge to sign/dec
12ba0 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65  rypt");.......re
12bb0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a  turn(-1);.....}.
12bc0 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
12bd0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
12be0 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
12bf0 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  e;.....tmpbuf = 
12c00 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
12c10 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  );.....free_tmpb
12c20 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64  uf = 1;......pad
12c30 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20  len = tmpbuflen 
12c40 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09  - buflen - 3;...
12c50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12c60 50 52 49 4e 54 46 28 22 4e 65 65 64 20 74 6f 20  PRINTF("Need to 
12c70 70 61 64 20 74 68 65 20 62 75 66 66 65 72 20 77  pad the buffer w
12c80 69 74 68 20 25 6c 6c 75 20 62 79 74 65 73 20 28  ith %llu bytes (
12c90 74 6d 70 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75  tmpbuflen = %llu
12ca0 2c 20 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75 29  , buflen = %llu)
12cb0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
12cc0 67 20 6c 6f 6e 67 29 20 70 61 64 6c 65 6e 2c 20  g long) padlen, 
12cd0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
12ce0 6f 6e 67 29 20 74 6d 70 62 75 66 6c 65 6e 2c 20  ong) tmpbuflen, 
12cf0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
12d00 6f 6e 67 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  ong) buflen);...
12d10 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31  .../* RSA PKCS#1
12d20 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35   EMSA-PKCS1-v1_5
12d30 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09   Padding */.....
12d40 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30  tmpbuf[0] = 0x00
12d50 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20  ;.....tmpbuf[1] 
12d60 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73  = 0x01;.....mems
12d70 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30  et(&tmpbuf[2], 0
12d80 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09  xFF, padlen);...
12d90 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  ..tmpbuf[padlen 
12da0 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09  + 2]= 0x00;.....
12db0 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70  memcpy(&tmpbuf[p
12dc0 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c  adlen + 3], buf,
12dd0 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43   buflen);......C
12de0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12df0 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22  TBUF("Unpadded:"
12e00 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a  , buf, buflen);.
12e10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12e20 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65  _PRINTBUF("Padde
12e30 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  d:", tmpbuf, tmp
12e40 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c  buflen);....} el
12e50 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20  se {.....tmpbuf 
12e60 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75  = buf;.....tmpbu
12e70 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
12e80 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
12e90 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d   0;.....padlen =
12ea0 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73   0;....}...} els
12eb0 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
12ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
12ed0 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
12ee0 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67  key size, hoping
12ef0 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73 20   the message is 
12f00 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21  properly padded!
12f10 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d  ");.....tmpbuf =
12f20 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c   buf;....tmpbufl
12f30 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09  en = buflen;....
12f40 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
12f50 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ....padlen = 0;.
12f60 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
12f70 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
12f80 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
12f90 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75  en;...free_tmpbu
12fa0 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20  f = 0;...padlen 
12fb0 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  = 0;..}.../* Beg
12fc0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  in transaction *
12fd0 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
12fe0 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
12ff0 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63  );.../* Select c
13000 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f  orrect applet */
13010 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
13020 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  e) {...case CACK
13030 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
13040 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13050 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
13060 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61  g applet found a
13070 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74  t %p ...", ident
13080 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
13090 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  ty->card.cac.app
130a0 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  let);....cackey_
130b0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
130c0 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
130d0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
130e0 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
130f0 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70  zeof(identity->p
13100 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
13110 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
13120 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63  ...../* Select c
13130 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09  orrect file */..
13140 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  ..cackey_select_
13150 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74  file(slot, ident
13160 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
13170 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c  ty->card.cac.fil
13180 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  e);....break;...
13190 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
131a0 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f  YPE_PIV:....dyn_
131b0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d  auth_template[0]
131c0 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f   = 0x7C;....dyn_
131d0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d  auth_template[1]
131e0 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
131f0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d  auth_template[2]
13200 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b   = ((tmpbuflen +
13210 20 36 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e   6) & 0xff00) >>
13220 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f   8;....dyn_auth_
13230 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74  template[3] = (t
13240 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20  mpbuflen + 6) & 
13250 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61  0x00ff;....dyn_a
13260 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20  uth_template[4] 
13270 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61  = 0x82;....dyn_a
13280 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20  uth_template[5] 
13290 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61  = 0x00;....dyn_a
132a0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20  uth_template[6] 
132b0 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61  = 0x81;....dyn_a
132c0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20  uth_template[7] 
132d0 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61  = 0x82;....dyn_a
132e0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20  uth_template[8] 
132f0 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30  = (tmpbuflen & 0
13300 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09  xff00) >> 8;....
13310 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
13320 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e  e[9] = tmpbuflen
13330 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 64   & 0x00ff;.....d
13340 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 3d  yn_auth_tmpbuf =
13350 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
13360 6e 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61  n + sizeof(dyn_a
13370 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a  uth_template));.
13380 09 09 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75  ...memcpy(dyn_au
13390 74 68 5f 74 6d 70 62 75 66 2c 20 64 79 6e 5f 61  th_tmpbuf, dyn_a
133a0 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69  uth_template, si
133b0 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65  zeof(dyn_auth_te
133c0 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65 6d  mplate));....mem
133d0 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d 70  cpy(dyn_auth_tmp
133e0 62 75 66 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e  buf + sizeof(dyn
133f0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c  _auth_template),
13400 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
13410 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65  en);.....if (fre
13420 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
13430 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09  free(tmpbuf);...
13440 09 7d 0a 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e  .}.....tmpbuflen
13450 20 2b 3d 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61   += sizeof(dyn_a
13460 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 3b 0a 09  uth_template);..
13470 09 09 74 6d 70 62 75 66 20 3d 20 64 79 6e 5f 61  ..tmpbuf = dyn_a
13480 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 09 09 66  uth_tmpbuf;....f
13490 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a  ree_tmpbuf = 1;.
134a0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
134b0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
134c0 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62  _CERT_ONLY:....b
134d0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75  reak;..}...tmpbu
134e0 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f  f_s = tmpbuf;..o
134f0 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66  utbuf_s = outbuf
13500 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66  ;..while (tmpbuf
13510 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74 62  len) {...tmpoutb
13520 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65  uflen = outbufle
13530 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62 75 66  n;....if (tmpbuf
13540 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
13550 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79 74 65  U_MTU) {....byte
13560 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43 4b  s_to_send = CACK
13570 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d  EY_APDU_MTU;...}
13580 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73   else {....bytes
13590 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75  _to_send = tmpbu
135a0 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e  flen;...}....sen
135b0 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59 5f 50  d_ret = CACKEY_P
135c0 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a 09  CSC_E_GENERIC;..
135d0 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65  .switch (id_type
135e0 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ) {....case CACK
135f0 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
13600 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  ....if (tmpbufle
13610 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  n > CACKEY_APDU_
13620 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31 20 3d  MTU) {......p1 =
13630 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x80;......le =
13640 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73   0x00;.....} els
13650 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78  e {......p1 = 0x
13660 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78  00;......le = 0x
13670 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73  00;.....}......s
13680 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
13690 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
136a0 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f   GSCIS_CLASS_GLO
136b0 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53  BAL_PLATFORM, GS
136c0 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45  CIS_INSTR_SIGNDE
136d0 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c  CRYPT, p1, 0x00,
136e0 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
136f0 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73  tmpbuf, le, &res
13700 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26  pcode, outbuf, &
13710 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09  tmpoutbuflen);..
13720 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13730 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
13740 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28 74 6d  _PIV:.....if (tm
13750 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59  pbuflen > CACKEY
13760 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09  _APDU_MTU) {....
13770 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a  ..class = 0x10;.
13780 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  .....le = 0x00;.
13790 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
137a0 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49 53 5f  ..class = GSCIS_
137b0 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a 09  CLASS_ISO7816;..
137c0 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09 09  ....le = 256;...
137d0 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65  ..}......send_re
137e0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
137f0 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73 73  apdu(slot, class
13800 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  , NISTSP800_73_3
13810 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20  _INSTR_GENAUTH, 
13820 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41  NISTSP800_78_3_A
13830 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65  LGO_RSA2048, ide
13840 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
13850 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b  tity->card.piv.k
13860 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f 5f  ey_id, bytes_to_
13870 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65  send, tmpbuf, le
13880 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74  , &respcode, out
13890 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c  buf, &tmpoutbufl
138a0 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  en);.....break;.
138b0 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
138c0 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
138d0 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
138e0 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
138f0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
13900 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 66  S_OK) {....if (f
13910 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
13920 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20  ..if (tmpbuf_s) 
13930 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70 62  {......free(tmpb
13940 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09  uf_s);.....}....
13950 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61  }...../* End tra
13960 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  nsaction */....c
13970 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
13980 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
13990 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
139a0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
139b0 45 54 52 59 29 20 7b 0a 09 09 09 09 43 41 43 4b  ETRY) {.....CACK
139c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
139d0 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61  "ADPU Sending Fa
139e0 69 6c 65 64 20 2d 2d 20 72 65 74 72 79 69 6e 67  iled -- retrying
139f0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
13a00 28 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72  (cackey_signdecr
13a10 79 70 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  ypt(slot, identi
13a20 74 79 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 2c  ty, buf, buflen,
13a30 20 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 6c   outbuf, outbufl
13a40 65 6e 2c 20 70 61 64 49 6e 70 75 74 2c 20 75 6e  en, padInput, un
13a50 70 61 64 4f 75 74 70 75 74 29 29 3b 0a 09 09 09  padOutput));....
13a60 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  }.....CACKEY_DEB
13a70 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
13a80 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d  Sending Failed -
13a90 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  - returning in e
13aa0 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20  rror.");.....if 
13ab0 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
13ac0 39 38 32 20 7c 7c 20 72 65 73 70 63 6f 64 65 20  982 || respcode 
13ad0 3d 3d 20 30 78 36 65 30 30 29 20 7b 0a 09 09 09  == 0x6e00) {....
13ae0 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d  .if (respcode ==
13af0 20 30 78 36 45 30 30 29 20 7b 0a 09 09 09 09 09   0x6E00) {......
13b00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13b10 4e 54 46 28 22 47 6f 74 20 5c 22 57 52 4f 4e 47  NTF("Got \"WRONG
13b20 20 43 4c 41 53 53 5c 22 2c 20 74 68 69 73 20 6d   CLASS\", this m
13b30 65 61 6e 73 20 77 65 20 61 72 65 20 74 61 6c 6b  eans we are talk
13b40 69 6e 67 20 74 6f 20 74 68 65 20 77 72 6f 6e 67  ing to the wrong
13b50 20 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c 79 20   object (likely 
13b60 62 65 63 61 75 73 65 20 74 68 65 20 63 61 72 64  because the card
13b70 20 77 65 6e 74 20 61 77 61 79 29 20 2d 2d 20 72   went away) -- r
13b80 65 73 65 74 74 69 6e 67 22 29 3b 0a 09 09 09 09  esetting");.....
13b90 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41  } else {......CA
13ba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13bb0 46 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74  F("Security stat
13bc0 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65  us not satisifie
13bd0 64 20 28 72 65 73 70 63 6f 64 65 20 3d 20 30 78  d (respcode = 0x
13be0 25 30 34 78 29 2e 20 20 52 65 74 75 72 6e 69 6e  %04x).  Returnin
13bf0 67 20 4e 45 45 44 4c 4f 47 49 4e 22 2c 20 28 69  g NEEDLOGIN", (i
13c00 6e 74 29 20 72 65 73 70 63 6f 64 65 29 3b 0a 09  nt) respcode);..
13c10 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
13c20 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
13c30 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 73 6c 6f  (slot);......slo
13c40 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
13c50 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
13c60 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  RED;......return
13c70 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  (CACKEY_PCSC_E_N
13c80 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a  EEDLOGIN);....}.
13c90 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
13ca0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
13cb0 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
13cc0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13cd0 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20  G_PRINTF("Token 
13ce0 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  absent.  Returni
13cf0 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29  ng TOKENABSENT")
13d00 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  ;......cackey_ma
13d10 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
13d20 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  ot);......return
13d30 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
13d40 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
13d50 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  }.....CACKEY_DEB
13d60 55 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65 74  UG_PRINTF("Somet
13d70 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67 20  hing went wrong 
13d80 64 75 72 69 6e 67 20 73 69 67 6e 69 6e 67 2c 20  during signing, 
13d90 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 73 6c  resetting the sl
13da0 6f 74 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f  ot and hoping fo
13db0 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b 0a 0a  r the best.");..
13dc0 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
13dd0 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
13de0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
13df0 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
13e00 43 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75  C);...}....tmpbu
13e10 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  f += bytes_to_se
13e20 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20  nd;...tmpbuflen 
13e30 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  -= bytes_to_send
13e40 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74  ;....outbuf += t
13e50 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f  mpoutbuflen;...o
13e60 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f  utbuflen -= tmpo
13e70 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76  utbuflen;...retv
13e80 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c  al += tmpoutbufl
13e90 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65  en;..}...if (fre
13ea0 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66  e_tmpbuf) {...if
13eb0 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
13ec0 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b  .free(tmpbuf_s);
13ed0 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66  ...}..}...outbuf
13ee0 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f   = outbuf_s;.../
13ef0 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
13f00 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
13f10 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
13f20 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  t);..#ifdef CACK
13f30 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
13f40 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
13f50 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75  E_MAX..if (outbu
13f60 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53  flen > _POSIX_SS
13f70 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
13f80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13f90 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65  ("Outbuflen exce
13fa0 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
13fb0 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
13fc0 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
13fd0 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d  %li, outbuflen =
13fe0 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
13ff0 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
14000 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14010 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09   outbuflen);....
14020 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
14030 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
14040 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f  ./* We must remo
14050 76 65 20 74 68 65 20 22 37 43 22 20 74 61 67 20  ve the "7C" tag 
14060 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73 69  to get to the si
14070 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77 69 74  gnature */..swit
14080 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
14090 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
140a0 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75 74  TYPE_PIV:....out
140b0 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c  buf_len = retval
140c0 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20  ;....outbuf_p = 
140d0 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74  cackey_read_bert
140e0 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26  lv_tag(outbuf, &
140f0 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37 43  outbuf_len, 0x7C
14100 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66  , NULL,  &outbuf
14110 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75  _len);....if (ou
14120 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  tbuf_p == NULL) 
14130 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
14140 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
14150 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72  nse from PIV for
14160 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e   GENERATE AUTHEN
14170 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74  TICATION was not
14180 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74   a 0x7C tag, ret
14190 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
141a0 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  e");......return
141b0 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  (-1);....}.....r
141c0 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c  etval = outbuf_l
141d0 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f 6c  en;.....outbuf_l
141e0 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09  en = retval;....
141f0 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65  outbuf_p = cacke
14200 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61  y_read_bertlv_ta
14210 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75  g(outbuf, &outbu
14220 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55 4c  f_len, 0x82, NUL
14230 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29  L,  &outbuf_len)
14240 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f  ;....if (outbuf_
14250 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  p == NULL) {....
14260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14270 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66  INTF("Response f
14280 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45  rom PIV for GENE
14290 52 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54  RATE AUTHENTICAT
142a0 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78  ION was not a 0x
142b0 38 32 20 77 69 74 68 69 6e 20 61 20 30 78 37 43  82 within a 0x7C
142c0 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 20   tag, returning 
142d0 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
142e0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
142f0 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d  ..}.....retval =
14300 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09   outbuf_len;....
14310 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
14320 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
14330 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  C:...case CACKEY
14340 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
14350 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  LY:....break;..}
14360 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c  .../* Unpad repl
14370 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f  y */..if (unpadO
14380 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72  utput) {...if (r
14390 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09  etval < 3) {....
143a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
143b0 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f  NTF("Reply is to
143c0 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20  o small, we are 
143d0 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61  not able to unpa
143e0 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  d -- passing bac
143f0 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
14400 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
14410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14420 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14430 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
14440 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
14450 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
14460 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
14470 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  tval);...}....if
14480 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30   (outbuf[0] != 0
14490 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  x00) {....CACKEY
144a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
144b0 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64  nrecognized padd
144c0 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61  ing scheme -- pa
144d0 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68  ssing back and h
144e0 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oping for the be
144f0 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45  st!");.....CACKE
14500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14510 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
14520 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
14530 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
14540 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09  ng) retval);....
14550 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
14560 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65  ..}....blocktype
14570 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09   = outbuf[1];...
14580 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b  unpadoffset = 0;
14590 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63  ....switch (bloc
145a0 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  ktype) {....case
145b0 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61   0x00:...../* Pa
145c0 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20  dding Scheme 1, 
145d0 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65  the first non-ze
145e0 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73  ro byte is the s
145f0 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a  tart of data */.
14600 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
14610 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
14620 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
14630 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
14640 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
14650 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
14660 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62   0x00) {.......b
14670 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
14680 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
14690 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09  .case 0x01:.....
146a0 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
146b0 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61  e 2, pad bytes a
146c0 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64  re 0xFF followed
146d0 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09   by 0x00 */.....
146e0 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
146f0 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 2; unpadoffse
14700 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
14710 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
14720 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
14730 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46  adoffset] != 0xF
14740 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f  F) {.......if (o
14750 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
14760 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
14770 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
14780 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61  ++;.........brea
14790 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  k;.......} else 
147a0 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  {........CACKEY_
147b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
147c0 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
147d0 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
147e0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
147f0 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
14800 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30   0x00 found 0x%0
14810 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
14820 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
14830 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
14840 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
14850 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73  ....}......} els
14860 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  e {.......CACKEY
14870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
14880 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64  nvalid padding d
14890 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  ata found, retur
148a0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c  ning in failure,
148b0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
148c0 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25  n 0xFF found 0x%
148d0 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  02x", (unsigned 
148e0 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61  int) outbuf[unpa
148f0 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09  doffset]);......
14900 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
14910 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
14920 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
14930 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  02:...../* Paddi
14940 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64  ng Scheme 3, pad
14950 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a   bytes are non-z
14960 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62  ero first zero b
14970 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65  yte found is the
14980 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20   seperator byte 
14990 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
149a0 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
149b0 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
149c0 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
149d0 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
149e0 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
149f0 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   == 0x00) {.....
14a00 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
14a10 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
14a20 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09  ....}.....}.....
14a30 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
14a40 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20   (unpadoffset > 
14a50 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43  retval) {....CAC
14a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14a70 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72  ("Offset greater
14a80 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65   than reply size
14a90 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e  , aborting.  (un
14aa0 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c  padoffset = %lu,
14ab0 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c   retval = %lu)",
14ac0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14ad0 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75   unpadoffset, (u
14ae0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
14af0 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
14b00 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  n(-1);...}....CA
14b10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14b20 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f  BUF("Padded:", o
14b30 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a  utbuf, retval);.
14b40 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70  ...retval -= unp
14b50 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d  adoffset;...memm
14b60 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62  ove(outbuf, outb
14b70 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74  uf + unpadoffset
14b80 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41  , retval);....CA
14b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14ba0 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c  BUF("Unpadded:",
14bb0 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
14bc0 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44  ;..}....CACKEY_D
14bd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
14be0 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
14bf0 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
14c00 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
14c10 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
14c20 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
14c30 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
14c40 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
14c50 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
14c60 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
14c70 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
14c80 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
14c90 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
14ca0 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
14cb0 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  t cackey_token_p
14cc0 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61  resent(struct ca
14cd0 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
14ce0 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70   {..cackey_ret p
14cf0 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
14d00 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c  ..DWORD reader_l
14d10 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20 3d 20  en = 0, state = 
14d20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c  0, protocol = 0,
14d30 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20   atr_len;..BYTE 
14d40 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45  atr[MAX_ATR_SIZE
14d50 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f  ];..LONG status_
14d60 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
14d70 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  n_ret;...CACKEY_
14d80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
14d90 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
14da0 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot->internal) {
14db0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14dc0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
14dd0 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 20  g token present 
14de0 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e 29  (internal token)
14df0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
14e00 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
14e10 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  NPRESENT);..}...
14e20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
14e30 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
14e40 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
14e50 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
14e60 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
14e70 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
14e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14e90 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
14ea0 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
14eb0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
14ec0 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ent");....return
14ed0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
14ee0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a  OKENABSENT);..}.
14ef0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14f00 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53  RINTF("Calling S
14f10 43 61 72 64 53 74 61 74 75 73 28 29 20 74 6f 20  CardStatus() to 
14f20 64 65 74 65 72 6d 69 6e 65 20 63 61 72 64 20 73  determine card s
14f30 74 61 74 75 73 22 29 3b 0a 0a 09 61 74 72 5f 6c  tatus");...atr_l
14f40 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29  en = sizeof(atr)
14f50 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ;..status_ret = 
14f60 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
14f70 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
14f80 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
14f90 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
14fa0 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
14fb0 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f  );...if (status_
14fc0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49  ret == SCARD_E_I
14fd0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b  NVALID_HANDLE) {
14fe0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14ff0 50 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61  PRINTF("SCardSta
15000 74 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  tus() returned S
15010 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
15020 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69  ANDLE, marking i
15030 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f  s not already co
15040 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69  nnected and tryi
15050 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61  ng again");...ca
15060 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
15070 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70  eset(slot);....p
15080 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
15090 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
150a0 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69  _card(slot);...i
150b0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
150c0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
150d0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
150e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
150f0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
15100 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
15110 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
15120 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75  sent");.....retu
15130 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
15140 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
15150 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
15160 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69  UG_PRINTF("Calli
15170 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29  ng SCardStatus()
15180 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 61 74 72   again");....atr
15190 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
151a0 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72 65 74  r);...status_ret
151b0 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73   = SCardStatus(s
151c0 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
151d0 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65  NULL, &reader_le
151e0 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74  n, &state, &prot
151f0 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f  ocol, atr, &atr_
15200 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  len);..}...if (s
15210 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
15220 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
15230 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
15240 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
15250 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
15260 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
15270 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
15280 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15290 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
152a0 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
152b0 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
152c0 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
152d0 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
152e0 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
152f0 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
15300 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a  D_PROTOCOL_T1);.
15310 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
15320 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
15330 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
15340 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73  ../* Re-establis
15350 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  h transaction, i
15360 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74  f it was present
15370 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74   */.....if (slot
15380 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
15390 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  pth > 0) {......
153a0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
153b0 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09  n_depth--;......
153c0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
153d0 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
153e0 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
153f0 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
15400 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
15410 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15420 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
15430 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65  uccessful, reque
15440 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61  rying");.....sta
15450 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
15460 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
15470 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
15480 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
15490 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
154a0 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09  , &atr_len);....
154b0 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
154c0 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
154d0 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  SS) {......CACKE
154e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
154f0 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20  Still unable to 
15500 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
15510 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
15520 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
15530 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
15540 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
15550 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
15560 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
15570 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
15580 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
15590 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
155a0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
155b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
155c0 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72  NTF("Unable to r
155d0 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64  econnect to card
155e0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
155f0 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
15600 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  Reconnect() = %s
15610 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
15620 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
15630 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e  _STR(scard_recon
15640 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65  n_ret));......re
15650 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15660 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
15670 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
15680 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15690 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
156a0 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
156b0 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
156c0 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
156d0 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
156e0 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
156f0 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
15700 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
15710 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ));.....return(C
15720 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
15730 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
15740 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26  }...if ((state &
15750 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d   SCARD_ABSENT) =
15760 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20  = SCARD_ABSENT) 
15770 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15780 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73  _PRINTF("Card is
15790 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69   absent, returni
157a0 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
157b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
157c0 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
157d0 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
157e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
157f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b  F("Returning tok
15800 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a  en present.");..
15810 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15820 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
15830 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  NT);.}../*. * SY
15840 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
15850 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
15860 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
15870 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
15880 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
15890 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
158a0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
158b0 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
158c0 79 5f 73 65 74 5f 70 69 6e 28 73 74 72 75 63 74  y_set_pin(struct
158d0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
158e0 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
158f0 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20 75 6e 73 69  r *old_pin, unsi
15900 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c 64 5f 70 69  gned long old_pi
15910 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20  n_len, unsigned 
15920 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67  char *pin, unsig
15930 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e  ned long pin_len
15940 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
15950 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
15960 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
15970 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
15980 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b  r cac_pin[8] = {
15990 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
159a0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
159b0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b  FF, 0xFF, 0xFF};
159c0 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
159d0 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  old_cac_pin[8] =
159e0 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
159f0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
15a00 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
15a10 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
15a20 72 20 70 69 6e 5f 75 70 64 61 74 65 5b 73 69 7a  r pin_update[siz
15a30 65 6f 66 28 63 61 63 5f 70 69 6e 29 20 2b 20 73  eof(cac_pin) + s
15a40 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69  izeof(old_cac_pi
15a50 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n)];..unsigned l
15a60 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
15a70 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73  uint16_t respons
15a80 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69  e_code;..int tri
15a90 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
15aa0 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e  nt send_ret;..in
15ab0 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20  t key_reference 
15ac0 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 41 70 70  = 0x00;.../* App
15ad0 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e  arently, CAC PIN
15ae0 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20  s are *EXACTLY* 
15af0 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20  8 bytes long -- 
15b00 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66  pad with 0xFF if
15b10 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
15b20 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29  f (pin_len >= 8)
15b30 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f   {...memcpy(cac_
15b40 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d  pin, pin, 8);..}
15b50 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
15b60 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70  (cac_pin, pin, p
15b70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66  in_len);..}...if
15b80 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3e 3d   (old_pin_len >=
15b90 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f   8) {...memcpy(o
15ba0 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f  ld_cac_pin, old_
15bb0 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65  pin, 8);..} else
15bc0 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f   {...memcpy(old_
15bd0 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e  cac_pin, old_pin
15be0 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b 0a  , old_pin_len);.
15bf0 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 61 74 65 6e  .}.../* Concaten
15c00 61 74 65 20 62 6f 74 68 20 50 49 4e 73 20 74 6f  ate both PINs to
15c10 67 65 74 68 65 72 20 74 6f 20 73 65 6e 64 20 61  gether to send a
15c20 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 72  s a single instr
15c30 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d 65 6d 63 70  uction */..memcp
15c40 79 28 70 69 6e 5f 75 70 64 61 74 65 2c 20 6f 6c  y(pin_update, ol
15c50 64 5f 63 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f  d_cac_pin, sizeo
15c60 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 29 3b  f(old_cac_pin));
15c70 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75 70 64  ..memcpy(pin_upd
15c80 61 74 65 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64  ate + sizeof(old
15c90 5f 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  _cac_pin), cac_p
15ca0 69 6e 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70  in, sizeof(cac_p
15cb0 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52 65 6a 65 63  in));.../* Rejec
15cc0 74 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65  t PINs which are
15cd0 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
15ce0 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20  f (pin_len < 5) 
15cf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15d00 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69  _PRINTF("Rejecti
15d10 6e 67 20 4e 65 77 20 50 49 4e 20 77 68 69 63 68  ng New PIN which
15d20 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c   is too short (l
15d30 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73  ength = %lu, mus
15d40 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29 22  t be atleast 5)"
15d50 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72  , pin_len);....r
15d60 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
15d70 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a  C_E_BADPIN);..}.
15d80 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65  ..if (old_pin_le
15d90 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45  n < 5) {...CACKE
15da0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15db0 52 65 6a 65 63 74 69 6e 67 20 4f 6c 64 20 50 49  Rejecting Old PI
15dc0 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  N which is too s
15dd0 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25  hort (length = %
15de0 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65  lu, must be atle
15df0 61 73 74 20 35 29 22 2c 20 6f 6c 64 5f 70 69 6e  ast 5)", old_pin
15e00 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
15e10 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
15e20 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ADPIN);..}.../* 
15e30 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69  PIV authenticati
15e40 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72  on uses a "key_r
15e50 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38  eference" of 0x8
15e60 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74  0 */..pcsc_ident
15e70 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
15e80 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
15e90 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
15ea0 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  );..if (num_cert
15eb0 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64  s > 0 && pcsc_id
15ec0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
15ed0 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63  ) {...switch (pc
15ee0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d  sc_identities[0]
15ef0 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
15f00 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
15f10 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
15f20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15f30 22 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72  "We have PIV car
15f40 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74  d, so we will at
15f50 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74  tempt to authent
15f60 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20  icate using the 
15f70 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20  PIV Application 
15f80 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b  key reference");
15f90 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66 65 72 65  ......key_refere
15fa0 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 09 09 09  nce = 0x80;.....
15fb0 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
15fc0 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  t:.....break;...
15fd0 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
15fe0 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
15ff0 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
16000 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49  s, 1);..}.../* I
16010 73 73 75 65 20 61 20 53 65 74 20 50 49 4e 20 28  ssue a Set PIN (
16020 43 48 41 4e 47 45 20 52 45 46 45 52 45 4e 43 45  CHANGE REFERENCE
16030 29 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d  ) */..send_ret =
16040 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
16050 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
16060 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
16070 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f  IS_INSTR_CHANGE_
16080 52 45 46 45 52 45 4e 43 45 2c 20 30 78 30 30 2c  REFERENCE, 0x00,
16090 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20   key_reference, 
160a0 73 69 7a 65 6f 66 28 70 69 6e 5f 75 70 64 61 74  sizeof(pin_updat
160b0 65 29 2c 20 70 69 6e 5f 75 70 64 61 74 65 2c 20  e), pin_update, 
160c0 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f  0x00, &response_
160d0 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  code, NULL, NULL
160e0 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
160f0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
16100 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28  _S_OK) {...if ((
16110 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
16120 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43  0x63C0) == 0x63C
16130 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65  0) {....tries_re
16140 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f  maining = (respo
16150 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b  nse_code & 0xF);
16160 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16170 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
16180 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
16190 64 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d 61  d, %i tries rema
161a0 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65  ining", tries_re
161b0 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 72 65  maining);.....re
161c0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
161d0 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
161e0 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
161f0 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
16200 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
16210 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
16220 20 74 6f 20 73 65 74 20 50 49 4e 2c 20 64 65 76   to set PIN, dev
16230 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72  ice is locked or
16240 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49   changing the PI
16250 4e 20 69 73 20 64 69 73 61 62 6c 65 64 22 29 3b  N is disabled");
16260 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
16270 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
16280 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
16290 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
162a0 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
162b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
162c0 46 28 22 50 49 4e 20 43 68 61 6e 67 65 20 73 75  F("PIN Change su
162d0 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74  cceeded");...ret
162e0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
162f0 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 44 69 73 61  S_OK);.../* Disa
16300 62 6c 65 20 61 20 77 61 72 6e 69 6e 67 2c 20 73  ble a warning, s
16310 69 6e 63 65 20 74 68 69 73 20 69 73 20 6f 6e 6c  ince this is onl
16320 79 20 75 73 65 64 20 69 6e 20 64 65 62 75 67 20  y used in debug 
16330 6d 6f 64 65 20 2a 2f 0a 09 74 72 69 65 73 5f 72  mode */..tries_r
16340 65 6d 61 69 6e 69 6e 67 20 3d 20 74 72 69 65 73  emaining = tries
16350 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 7d 0a 0a 2f  _remaining;.}../
16360 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
16370 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
16380 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
16390 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
163a0 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
163b0 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
163c0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
163d0 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
163e0 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73  t cackey_login(s
163f0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
16400 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
16410 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
16420 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
16430 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72  en, int *tries_r
16440 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 69 6e 74 20  emaining_p, int 
16450 72 65 74 72 69 65 73 29 20 7b 0a 09 73 74 72 75  retries) {..stru
16460 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
16470 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
16480 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
16490 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e  ned char cac_pin
164a0 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46  [8] = {0xFF, 0xF
164b0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
164c0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
164d0 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65   0xFF};..unsigne
164e0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
164f0 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
16500 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20  onse_code;..int 
16510 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
16520 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
16530 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e  .int key_referen
16540 63 65 20 3d 20 30 78 30 30 2c 20 68 61 76 65 5f  ce = 0x00, have_
16550 70 69 76 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  piv = 0;..cackey
16560 5f 72 65 74 20 63 6f 6e 6e 65 63 74 5f 72 65 74  _ret connect_ret
16570 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b 0a 0a 09 2f  , token_ret;.../
16580 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
16590 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61  we do not know a
165a0 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72  bout how many tr
165b0 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e  ies are remainin
165c0 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f  g */..if (tries_
165d0 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
165e0 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
165f0 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f  g_p = -1;..}.../
16600 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41  * Apparently, CA
16610 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43  C PINs are *EXAC
16620 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e  TLY* 8 bytes lon
16630 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78  g -- pad with 0x
16640 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20  FF if too short 
16650 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
16660 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
16670 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38  (cac_pin, pin, 8
16680 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
16690 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
166a0 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d  in, pin_len);..}
166b0 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50 49 4e  .../* Reject PIN
166c0 73 20 77 68 69 63 68 20 61 72 65 20 74 6f 6f 20  s which are too 
166d0 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69  short */..if (pi
166e0 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43  n_len < 5) {...C
166f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16700 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 50 49  TF("Rejecting PI
16710 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  N which is too s
16720 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25  hort (length = %
16730 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65  lu, must be atle
16740 61 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e  ast 5)", pin_len
16750 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
16760 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
16770 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56 20  N);..}.../* PIV 
16780 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 75  authentication u
16790 73 65 73 20 61 20 22 6b 65 79 5f 72 65 66 65 72  ses a "key_refer
167a0 65 6e 63 65 22 20 6f 66 20 30 78 38 30 20 2a 2f  ence" of 0x80 */
167b0 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
167c0 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
167d0 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c  certs(slot, NULL
167e0 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
167f0 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
16800 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69  0 && pcsc_identi
16810 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
16820 09 09 73 77 69 74 63 68 20 28 70 63 73 63 5f 69  ..switch (pcsc_i
16830 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f  dentities[0].id_
16840 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
16850 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
16860 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  IV:.....CACKEY_D
16870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20  EBUG_PRINTF("We 
16880 68 61 76 65 20 50 49 56 20 63 61 72 64 2c 20 73  have PIV card, s
16890 6f 20 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70  o we will attemp
168a0 74 20 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74  t to authenticat
168b0 65 20 75 73 69 6e 67 20 74 68 65 20 50 49 56 20  e using the PIV 
168c0 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20  Application key 
168d0 72 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09  reference");....
168e0 09 09 68 61 76 65 5f 70 69 76 20 3d 20 31 3b 0a  ..have_piv = 1;.
168f0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
16900 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b  fault:.....break
16910 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
16920 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
16930 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
16940 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09  certs, 1);..}...
16950 69 66 20 28 68 61 76 65 5f 70 69 76 20 3d 3d 20  if (have_piv == 
16960 31 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66 65 72  1) {...key_refer
16970 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 7d 0a  ence = 0x80;..}.
16980 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56  ../* Issue PIN V
16990 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72  erify */..send_r
169a0 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
169b0 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
169c0 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
169d0 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
169e0 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72  IFY, 0x00, key_r
169f0 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66  eference, sizeof
16a00 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  (cac_pin), cac_p
16a10 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  in, 0x00, &respo
16a20 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
16a30 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e  NULL);...if (sen
16a40 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
16a50 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
16a60 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  f ((response_cod
16a70 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30  e & 0x63C0) == 0
16a80 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65  x63C0) {....trie
16a90 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72  s_remaining = (r
16aa0 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
16ab0 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  xF);.....CACKEY_
16ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
16ad0 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
16ae0 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20  ailed, %i tries 
16af0 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65  remaining", trie
16b00 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09  s_remaining);...
16b10 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
16b20 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a  ining_p) {.....*
16b30 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
16b40 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  p = tries_remain
16b50 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  ing;....}.....re
16b60 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
16b70 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
16b80 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
16b90 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
16ba0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
16bb0 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
16bc0 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
16bd0 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63  d, device is loc
16be0 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ked");.....retur
16bf0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
16c00 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09  LOCKED);...}....
16c10 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  if (response_cod
16c20 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b 0a 09  e == 0x6d00) {..
16c30 09 09 69 66 20 28 72 65 74 72 69 65 73 20 3e 20  ..if (retries > 
16c40 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
16c50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47 6f  DEBUG_PRINTF("Go
16c60 74 20 49 53 4f 20 37 38 31 36 20 52 65 73 70 6f  t ISO 7816 Respo
16c70 6e 73 65 20 5c 22 36 44 20 30 30 5c 22 20 69 6e  nse \"6D 00\" in
16c80 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 56   response to a V
16c90 45 52 49 46 59 20 72 65 71 75 65 73 74 2e 22 29  ERIFY request.")
16ca0 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
16cb0 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 64 69  UG_PRINTF("We di
16cc0 64 20 6e 6f 74 20 65 78 70 65 63 74 20 74 68 69  d not expect thi
16cd0 73 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  s because it is 
16ce0 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  not mentioned in
16cf0 20 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 2d   NIST SP 800-73-
16d00 33 20 50 61 72 74 20 32 20 53 65 63 74 69 6f 6e  3 Part 2 Section
16d10 20 33 2e 32 2e 31 20 6f 72 20 47 53 43 2d 49 53   3.2.1 or GSC-IS
16d20 20 76 32 2e 31 22 29 3b 0a 09 09 09 09 43 41 43   v2.1");.....CAC
16d30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16d40 28 22 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74  ("We are going t
16d50 6f 20 74 72 79 20 74 6f 20 72 65 73 65 74 20 74  o try to reset t
16d60 68 65 20 63 61 72 64 20 61 6e 64 20 73 65 6c 65  he card and sele
16d70 63 74 20 74 68 65 20 61 70 70 6c 65 74 20 61 67  ct the applet ag
16d80 61 69 6e 2e 22 29 3b 0a 0a 09 09 09 09 63 61 63  ain.");......cac
16d90 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
16da0 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  set(slot);......
16db0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
16dc0 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
16dd0 64 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20  d(slot);.....if 
16de0 28 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  (connect_ret != 
16df0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
16e00 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
16e10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
16e20 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63  able to reconnec
16e30 74 20 61 66 74 65 72 20 72 65 73 65 74 74 69 6e  t after resettin
16e40 67 20 74 68 65 20 63 61 72 64 2c 20 72 65 74 75  g the card, retu
16e50 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
16e60 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
16e70 63 6f 6e 6e 65 63 74 5f 72 65 74 29 3b 0a 09 09  connect_ret);...
16e80 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
16e90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 65  DEBUG_PRINTF("Ve
16ea0 72 69 66 79 69 6e 67 20 77 65 20 73 74 69 6c 6c  rifying we still
16eb0 20 68 61 76 65 20 61 20 74 6f 6b 65 6e 2e 22 29   have a token.")
16ec0 3b 0a 09 09 09 09 74 6f 6b 65 6e 5f 72 65 74 20  ;.....token_ret 
16ed0 3d 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  = cackey_token_p
16ee0 72 65 73 65 6e 74 28 73 6c 6f 74 29 3b 0a 09 09  resent(slot);...
16ef0 09 09 69 66 20 28 74 6f 6b 65 6e 5f 72 65 74 20  ..if (token_ret 
16f00 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
16f10 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
16f20 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
16f30 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e  UG_PRINTF("Token
16f40 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 72 65   not present, re
16f50 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
16f60 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  .");.......retur
16f70 6e 28 74 6f 6b 65 6e 5f 72 65 74 29 3b 0a 09 09  n(token_ret);...
16f80 09 09 7d 0a 0a 0a 09 09 09 09 43 41 43 4b 45 59  ..}.......CACKEY
16f90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
16fa0 72 79 69 6e 67 20 74 6f 20 6c 6f 67 69 6e 20 61  rying to login a
16fb0 67 61 69 6e 22 29 3b 0a 09 09 09 09 72 65 74 75  gain");.....retu
16fc0 72 6e 28 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  rn(cackey_login(
16fd0 73 6c 6f 74 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c  slot, pin, pin_l
16fe0 65 6e 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  en, tries_remain
16ff0 69 6e 67 5f 70 2c 20 72 65 74 72 69 65 73 20 2d  ing_p, retries -
17000 20 31 29 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a   1));....}...}..
17010 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
17020 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
17030 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
17040 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
17050 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63  erification succ
17060 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72  eeded");...retur
17070 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
17080 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
17090 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
170a0 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
170b0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
170c0 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
170d0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
170e0 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
170f0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
17100 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70  ssize_t cackey_p
17110 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
17120 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63  label(struct cac
17130 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
17140 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
17150 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65  igned char *labe
17160 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20  l_buf, unsigned 
17170 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  long label_buf_l
17180 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
17190 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  long certificate
171a0 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62  _len;..void *lab
171b0 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a  el_asn1;..void *
171c0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e  certificate;..in
171d0 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  t x509_read_ret;
171e0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
171f0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
17200 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
17210 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
17220 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
17230 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
17240 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29  ificate_len < 0)
17250 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
17260 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f  ..}...x509_read_
17270 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75  ret = x509_to_su
17280 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74  bject(certificat
17290 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
172a0 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c  en, (void **) &l
172b0 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20  abel_asn1);..if 
172c0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
172d0 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
172e0 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65  1);..}...x509_re
172f0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e  ad_ret = x509_dn
17300 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c  _to_string(label
17310 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64  _asn1, x509_read
17320 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c  _ret, (char *) l
17330 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f  abel_buf, label_
17340 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a  buf_len, "CN");.
17350 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
17360 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30  et <= 0) {...x50
17370 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
17380 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
17390 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
173a0 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
173b0 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
173c0 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c  bel_buf_len, NUL
173d0 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f  L);....if (x509_
173e0 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
173f0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
17400 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
17410 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
17420 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
17430 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35  SIZE_MAX..if (x5
17440 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50  09_read_ret > _P
17450 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
17460 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17470 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65  _PRINTF("x509_re
17480 61 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d  ad_ret exceeds m
17490 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
174a0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
174b0 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
174c0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
174d0 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
174e0 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
174f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17500 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a  x509_read_ret);.
17510 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
17520 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
17530 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f  f...return(x509_
17540 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a  read_ret);.}../*
17550 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
17560 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
17570 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
17580 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d  _create(void **m
17590 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
175a0 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
175b0 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
175c0 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
175d0 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
175e0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
175f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
17600 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
17610 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
17620 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
17630 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
17640 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
17650 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61  hread_mutex = ma
17660 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68  lloc(sizeof(*pth
17670 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09  read_mutex));...
17680 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74  if (!pthread_mut
17690 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ex) {....CACKEY_
176a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
176b0 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
176c0 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09   memory.");.....
176d0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
176e0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
176f0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
17700 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d  x_init(pthread_m
17710 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69  utex, NULL);...i
17720 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
17730 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
17740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17750 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
17760 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20  init() returned 
17770 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
17780 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
17790 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
177a0 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70  .}....*mutex = p
177b0 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d  thread_mutex;..}
177c0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
177d0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
177e0 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
177f0 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
17800 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
17810 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
17820 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
17830 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
17840 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17850 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
17860 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28  rgs.CreateMutex(
17870 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
17880 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
17890 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
178a0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
178b0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
178c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
178d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
178e0 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
178f0 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
17900 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
17910 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
17920 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
17930 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a  utex_lock(void *
17940 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
17950 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
17960 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
17970 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
17980 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
17990 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
179a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
179b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
179c0 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
179d0 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
179e0 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
179f0 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
17a00 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
17a10 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
17a20 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
17a30 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68  d_mutex_lock(pth
17a40 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
17a50 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
17a60 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
17a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17a80 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
17a90 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
17aa0 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
17ab0 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
17ac0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
17ad0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
17ae0 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  f (cackey_args.L
17af0 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
17b00 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
17b10 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
17b20 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
17b30 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
17b40 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
17b50 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17b60 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
17b70 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29  args.LockMutex()
17b80 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
17b90 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
17ba0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
17bb0 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
17bc0 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
17bd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17be0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
17bf0 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
17c00 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
17c10 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
17c20 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
17c30 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
17c40 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20  tex_unlock(void 
17c50 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
17c60 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
17c70 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
17c80 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
17c90 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
17ca0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
17cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
17cc0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
17cd0 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
17ce0 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
17cf0 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
17d00 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
17d10 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
17d20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61  mutex;....pthrea
17d30 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
17d40 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
17d50 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a  pthread_mutex);.
17d60 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
17d70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
17d80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17d90 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
17da0 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75  ex_unlock() retu
17db0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
17dc0 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
17dd0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
17de0 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
17df0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
17e00 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29  rgs.UnlockMutex)
17e10 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
17e20 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
17e30 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75  s.UnlockMutex(mu
17e40 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
17e50 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
17e60 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
17e70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17e80 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  ("cackey_args.Un
17e90 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  lockMutex() retu
17ea0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
17eb0 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
17ec0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
17ed0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
17ee0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
17ef0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17f00 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
17f10 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
17f20 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
17f30 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ic CK_ATTRIBUTE_
17f40 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  PTR cackey_get_a
17f50 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a  ttributes(CK_OBJ
17f60 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74  ECT_CLASS object
17f70 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61  class, struct ca
17f80 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
17f90 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e  ty *identity, un
17fa0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
17fb0 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f  tity_num, CK_ULO
17fc0 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
17fd0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42   {..static CK_BB
17fe0 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b  OOL ck_true = 1;
17ff0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f  ..static CK_BBOO
18000 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a  L ck_false = 0;.
18010 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55 53 54  .static CK_TRUST
18020 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20 43 4b   ck_trusted = CK
18030 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47 41 54  _TRUSTED_DELEGAT
18040 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75  OR;..CK_ULONG nu
18050 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76  mattrs = 0, retv
18060 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54  al_count;..CK_AT
18070 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 72  TRIBUTE_TYPE cur
18080 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b  r_attr_type;..CK
18090 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72 5f  _ATTRIBUTE curr_
180a0 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09  attr, *retval;..
180b0 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c  CK_VOID_PTR pVal
180c0 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ue;..CK_ULONG ul
180d0 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42  ValueLen;..CK_OB
180e0 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62  JECT_CLASS ck_ob
180f0 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f  ject_class;..CK_
18100 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
18110 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f   ck_certificate_
18120 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59  type;..CK_KEY_TY
18130 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a  PE ck_key_type;.
18140 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54  .CK_UTF8CHAR ucT
18150 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48  mpBuf[1024];..SH
18160 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31 5f 63  A1Context sha1_c
18170 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35  tx;..MD5_CTX md5
18180 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73  _ctx;..uint8_t s
18190 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48 61 73  ha1_hash[SHA1Has
181a0 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74  hSize];..uint8_t
181b0 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48 61 73   md5_hash[MD5Has
181c0 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65  hSize];..unsigne
181d0 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  d char *certific
181e0 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65  ate;..ssize_t ce
181f0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
18200 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  -1, x509_read_re
18210 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66  t;..int pValue_f
18220 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ree;...CACKEY_DE
18230 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
18240 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20  ed (objectClass 
18250 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f  = %lu, identity_
18260 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  num = %lu).", (u
18270 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62  nsigned long) ob
18280 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74  jectclass, ident
18290 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c  ity_num);...*pul
182a0 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20  Count = 0;...if 
182b0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
182c0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
182d0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
182e0 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
182f0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
18300 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
18310 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
18320 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
18330 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43 41 43  E_TRUST) {...CAC
18340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18350 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
18360 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e  jects (NULL), in
18370 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61  valid object cla
18380 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ss");....return(
18390 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47  NULL);..}.../* G
183a0 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28  et Cert */..if (
183b0 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
183c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
183d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
183e0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
183f0 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69  NULL), invalid i
18400 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22  dentiy provided"
18410 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
18420 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69  L);..}...certifi
18430 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  cate = identity-
18440 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63  >certificate;..c
18450 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
18460 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
18470 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66  ficate_len;...if
18480 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
18490 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69  n == -1 || certi
184a0 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  ficate == NULL) 
184b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
184c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
184d0 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
184e0 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69  LL), this identi
184f0 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ty does not have
18500 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66   an X.509 certif
18510 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64  icate associated
18520 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c   with it and wil
18530 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09  l not work");...
18540 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
18550 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
18560 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69  at certificate i
18570 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20  s ASN.1 encoded 
18580 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
18590 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74  e */..if (x509_t
185a0 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
185b0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
185c0 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30  e_len, NULL) < 0
185d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
185e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
185f0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
18600 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39  NULL), the X.509
18610 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73   certificate ass
18620 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
18630 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f  s identity is no
18640 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65  t valid");....re
18650 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
18660 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20  .retval_count = 
18670 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  64;..retval = ma
18680 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e  lloc(retval_coun
18690 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
186a0 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72  al));...for (cur
186b0 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b  r_attr_type = 0;
186c0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20   curr_attr_type 
186d0 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20 63 75  < 0xce5363bf; cu
186e0 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20  rr_attr_type++) 
186f0 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  {...if (curr_att
18700 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29  r_type == 0x800)
18710 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f   {....curr_attr_
18720 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30  type = 0xce53630
18730 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65  0;...}....pValue
18740 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61  _free = 0;...pVa
18750 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c  lue = NULL;...ul
18760 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
18770 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74  ONG) -1;....swit
18780 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  ch (curr_attr_ty
18790 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b  pe) {....case CK
187a0 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43  A_CLASS:.....CAC
187b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
187c0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
187d0 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53  ribute CKA_CLASS
187e0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
187f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18800 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
18810 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74  ;......ck_object
18820 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63  _class = objectc
18830 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75  lass;......pValu
18840 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63  e = &ck_object_c
18850 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75  lass;.....ulValu
18860 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18870 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a  _object_class);.
18880 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18890 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
188a0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
188b0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
188c0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42  d long) *((CK_OB
188d0 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56  JECT_CLASS *) pV
188e0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
188f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
18900 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
18910 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
18920 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43  CKA_TOKEN:.....C
18930 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18940 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
18950 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b  ttribute CKA_TOK
18960 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  EN (0x%08lx) ...
18970 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18980 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
18990 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
189a0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
189b0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
189c0 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
189d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
189e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
189f0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
18a00 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18a10 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
18a20 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
18a30 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18a40 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18a50 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18a60 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41  ..case CKA_PRIVA
18a70 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  TE:.....CACKEY_D
18a80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18a90 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18aa0 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20 28 30  e CKA_PRIVATE (0
18ab0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18ac0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18ad0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18ae0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
18af0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
18b00 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
18b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18b20 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
18b30 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18b40 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
18b50 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  t a Netscape tru
18b60 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
18b70 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
18b80 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18b90 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56  k_false;.....ulV
18ba0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
18bb0 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09  (ck_false);.....
18bc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18bd0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
18be0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
18bf0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
18c00 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
18c10 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
18c20 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18c30 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18c40 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18c50 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44  case CKA_TRUSTED
18c60 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18c70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
18c80 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
18c90 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78 25  CKA_TRUSTED (0x%
18ca0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
18cb0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
18cc0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
18cd0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
18ce0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
18cf0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
18d00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18d10 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
18d20 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
18d30 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
18d40 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
18d50 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
18d60 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70  ak;.....}......p
18d70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
18d80 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
18d90 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
18da0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
18db0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18dc0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
18dd0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
18de0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
18df0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
18e00 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
18e10 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
18e20 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
18e30 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
18e40 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09  _MODIFIABLE:....
18e50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18e60 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18e70 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
18e80 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38  ODIFIABLE (0x%08
18e90 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
18ea0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
18eb0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
18ec0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
18ed0 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
18ee0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
18ef0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
18f00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18f10 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18f20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
18f30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
18f40 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
18f50 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
18f60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
18f70 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
18f80 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
18f90 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43  CKA_LABEL:.....C
18fa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18fb0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
18fc0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42  ttribute CKA_LAB
18fd0 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  EL (0x%08lx) ...
18fe0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18ff0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19000 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 69 64 65  e);......if (ide
19010 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 20 3d  ntity->id_type =
19020 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
19030 5f 50 49 56 29 20 7b 0a 09 09 09 09 09 70 56 61  _PIV) {......pVa
19040 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  lue = identity->
19050 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 3b 0a  card.piv.label;.
19060 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
19070 3d 20 73 74 72 6c 65 6e 28 70 56 61 6c 75 65 29  = strlen(pValue)
19080 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
19090 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
190a0 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20   snprintf((char 
190b0 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a  *) ucTmpBuf, siz
190c0 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22  eof(ucTmpBuf), "
190d0 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20  Identity #%lu", 
190e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
190f0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09  identity_num);..
19100 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54  ....pValue = ucT
19110 6d 70 42 75 66 3b 0a 0a 09 09 09 09 09 69 66 20  mpBuf;.......if 
19120 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73  (ulValueLen >= s
19130 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29  izeof(ucTmpBuf))
19140 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
19150 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 09 70  Len = 0;.......p
19160 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
19170 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
19180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19190 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
191a0 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
191b0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
191c0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
191d0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
191e0 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55  ...case CKA_VALU
191f0 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
19200 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
19210 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
19220 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 25 30   CKA_VALUE (0x%0
19230 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
19240 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
19250 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
19260 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63 74 63  .switch (objectc
19270 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63 61 73  lass) {......cas
19280 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  e CKO_PRIVATE_KE
19290 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f  Y:.......CACKEY_
192a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
192b0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
192c0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
192d0 20 61 72 65 20 61 20 70 72 69 76 61 74 65 20 6b   are a private k
192e0 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72  ey.");........br
192f0 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
19300 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
19310 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f  T:.......CACKEY_
19320 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19330 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
19340 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
19350 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
19360 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
19370 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
19380 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c  ...case CKO_PUBL
19390 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 69 66  IC_KEY:.......if
193a0 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
193b0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  n >= 0) {.......
193c0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
193d0 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28   x509_to_pubkey(
193e0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
193f0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
19400 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09 09 69  Value);........i
19410 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
19420 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09 09 09   < 0) { ........
19430 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
19440 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  .......} else {.
19450 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  ........ulValueL
19460 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
19470 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09  et;........}....
19480 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72 65 61  ...}........brea
19490 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f  k;......case CKO
194a0 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09  _CERTIFICATE:...
194b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63 65 72  ....pValue = cer
194c0 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09  tificate;.......
194d0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72  ulValueLen = cer
194e0 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
194f0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
19500 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
19510 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19520 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
19530 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
19540 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
19550 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
19560 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
19570 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43 41 43  _ISSUER:.....CAC
19580 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19590 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
195a0 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53 55 45  ribute CKA_ISSUE
195b0 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
195c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
195d0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
195e0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
195f0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
19600 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
19610 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
19620 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
19630 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
19640 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19650 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
19660 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
19670 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
19680 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70  icate or Netscap
19690 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
196a0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
196b0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
196c0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
196d0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
196e0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
196f0 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69 66  to_issuer(certif
19700 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
19710 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
19720 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
19730 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
19740 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
19750 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
19760 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
19770 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
19780 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
19790 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
197a0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
197b0 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
197c0 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
197d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
197e0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
197f0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
19800 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a  _SERIAL_NUMBER:.
19810 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19820 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19830 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19840 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20  A_SERIAL_NUMBER 
19850 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
19860 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19870 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
19880 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19890 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
198a0 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65  TIFICATE && obje
198b0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
198c0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
198d0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
198e0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
198f0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
19900 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
19910 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
19920 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20  ate or Netscape 
19930 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
19940 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19950 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
19960 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
19970 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
19980 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
19990 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63  _serial(certific
199a0 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
199b0 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
199c0 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
199d0 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
199e0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
199f0 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
19a00 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
19a10 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
19a20 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
19a30 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19a40 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
19a50 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
19a60 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
19a70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
19a80 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
19a90 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
19aa0 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41  _SUBJECT:.....CA
19ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19ac0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
19ad0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a  tribute CKA_SUBJ
19ae0 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ECT (0x%08lx) ..
19af0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19b00 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19b10 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19b20 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
19b30 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
19b40 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19b50 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
19b60 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
19b70 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
19b80 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
19b90 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  te");.......brea
19ba0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
19bb0 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
19bc0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
19bd0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
19be0 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63  509_to_subject(c
19bf0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
19c00 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
19c10 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
19c20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
19c30 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
19c40 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
19c50 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
19c60 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
19c70 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
19c80 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
19c90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19ca0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
19cb0 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
19cc0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19cd0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
19ce0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
19cf0 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41  e CKA_ID:.....CA
19d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19d10 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
19d20 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28  tribute CKA_ID (
19d30 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19d40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
19d50 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
19d60 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
19d70 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
19d80 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
19d90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19da0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
19db0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
19dc0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
19dd0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
19de0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
19df0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19e00 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20  ..ucTmpBuf[0] = 
19e10 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b  ((identity_num +
19e20 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66   1) >> 8) & 0xff
19e30 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31  ;.....ucTmpBuf[1
19e40 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e  ] =  (identity_n
19e50 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a  um + 1) & 0xff;.
19e60 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75  .....pValue = &u
19e70 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56  cTmpBuf;.....ulV
19e80 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09  alueLen = 2;....
19e90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19ea0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
19eb0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
19ec0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19ed0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19ee0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19ef0 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
19f00 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09  IFICATE_TYPE:...
19f10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19f20 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
19f30 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
19f40 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
19f50 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
19f60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19f70 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
19f80 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
19f90 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
19fa0 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
19fb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19fc0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
19fd0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
19fe0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
19ff0 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e  t a certificate.
1a000 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1a010 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
1a020 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
1a030 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  ne certificate t
1a040 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65  ype */.....ck_ce
1a050 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d  rtificate_type =
1a060 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09   CKC_X_509;.....
1a070 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65  .pValue = &ck_ce
1a080 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
1a090 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a0a0 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69   sizeof(ck_certi
1a0b0 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09  ficate_type);...
1a0c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a0d0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1a0e0 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39  urning CKC_X_509
1a0f0 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
1a100 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a110 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
1a120 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
1a130 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1a140 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1a150 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1a160 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1a170 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09  A_KEY_TYPE:.....
1a180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a190 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1a1a0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45  attribute CKA_KE
1a1b0 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29  Y_TYPE (0x%08lx)
1a1c0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1a1d0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1a1e0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1a1f0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
1a200 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
1a210 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
1a220 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
1a230 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1a240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1a250 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1a260 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1a270 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22   are not a key."
1a280 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1a290 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
1a2a0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
1a2b0 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09  e key type */...
1a2c0 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20  ..ck_key_type = 
1a2d0 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56  CKK_RSA;......pV
1a2e0 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74  alue = &ck_key_t
1a2f0 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
1a300 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1a310 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  key_type);......
1a320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a330 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1a340 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75  ing CKK_RSA (%lu
1a350 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  ) (%p/%lu)", (un
1a360 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1a370 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
1a380 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  YPE *) pValue), 
1a390 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a3a0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a3b0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a3c0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ....case CKA_SIG
1a3d0 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
1a3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1a3f0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1a400 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38   CKA_SIGN (0x%08
1a410 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1a420 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1a430 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1a440 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1a450 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
1a460 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1a470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a480 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1a490 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1a4a0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
1a4b0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1a4c0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1a4d0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1a4e0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1a4f0 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
1a500 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
1a510 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
1a520 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1a530 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
1a540 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1a550 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
1a560 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
1a570 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1a580 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
1a590 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a5a0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1a5b0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
1a5c0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1a5d0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
1a5e0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
1a5f0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1a600 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1a610 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1a620 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f  ..case CKA_SIGN_
1a630 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41 43  RECOVER:.....CAC
1a640 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a650 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1a660 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f  ribute CKA_SIGN_
1a670 52 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c 78  RECOVER (0x%08lx
1a680 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1a690 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1a6a0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1a6b0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1a6c0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1a6d0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1a6e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a6f0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1a700 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1a710 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1a720 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1a730 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1a740 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
1a750 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20   currently only 
1a760 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20 77 69  support "Sign wi
1a770 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a  th Appendix" */.
1a780 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1a790 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
1a7a0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1a7b0 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
1a7c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a7d0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1a7e0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1a7f0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1a800 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
1a810 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1a820 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1a830 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1a840 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1a850 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a  ase CKA_DECRYPT:
1a860 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a870 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1a880 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1a890 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78 25 30  KA_DECRYPT (0x%0
1a8a0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1a8b0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1a8c0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1a8d0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1a8e0 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
1a8f0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1a900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a910 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1a920 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1a930 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
1a940 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1a950 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1a960 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
1a970 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1a980 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
1a990 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   || objectclass 
1a9a0 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  == CKO_PUBLIC_KE
1a9b0 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
1a9c0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
1a9d0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1a9e0 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
1a9f0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1aa00 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
1aa10 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
1aa20 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1aa30 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
1aa40 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1aa50 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1aa60 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
1aa70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
1aa80 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
1aa90 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
1aaa0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1aab0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1aac0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1aad0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e  ....case CKA_SEN
1aae0 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b  SITIVE:.....CACK
1aaf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ab00 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1ab10 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54  ibute CKA_SENSIT
1ab20 49 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  IVE (0x%08lx) ..
1ab30 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1ab40 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1ab50 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1ab60 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1ab70 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1ab80 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1ab90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1aba0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1abb0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1abc0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1abd0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1abe0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1abf0 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
1ac00 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
1ac10 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
1ac20 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
1ac30 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
1ac40 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1ac50 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
1ac60 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
1ac70 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
1ac80 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1ac90 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
1aca0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
1acb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1acc0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1acd0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1ace0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1acf0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1ad00 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1ad10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ad20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1ad30 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1ad40 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
1ad50 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1ad60 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1ad70 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1ad80 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 20  CKA_EXTRACTABLE 
1ad90 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1ada0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1adb0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1adc0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1add0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
1ade0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1adf0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1ae00 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1ae10 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1ae20 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1ae30 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1ae40 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1ae50 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1ae60 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1ae70 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
1ae80 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  E_KEY) {......pV
1ae90 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
1aea0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
1aeb0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1aec0 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
1aed0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1aee0 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
1aef0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1af00 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
1af10 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1af20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1af30 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1af40 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1af50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1af60 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
1af70 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1af80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1af90 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1afa0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1afb0 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43 41  _MODULUS:.....CA
1afc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1afd0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1afe0 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55  tribute CKA_MODU
1aff0 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  LUS (0x%08lx) ..
1b000 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1b010 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1b020 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1b030 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1b040 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1b050 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1b060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b070 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1b080 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1b090 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1b0a0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1b0b0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1b0c0 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
1b0d0 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
1b0e0 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
1b0f0 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
1b100 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66 69 63  modulus(certific
1b110 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
1b120 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
1b130 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
1b140 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
1b150 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
1b160 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
1b170 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
1b180 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
1b190 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
1b1a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b1b0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1b1c0 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
1b1d0 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
1b1e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1b1f0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1b200 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1b210 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
1b220 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1b230 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1b240 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1b250 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
1b260 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ENT (0x%08lx) ..
1b270 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1b280 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1b290 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1b2a0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1b2b0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1b2c0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1b2d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b2e0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1b2f0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1b300 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1b310 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1b320 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1b330 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
1b340 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
1b350 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
1b360 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
1b370 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69 66 69  exponent(certifi
1b380 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
1b390 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
1b3a0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
1b3b0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
1b3c0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
1b3d0 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
1b3e0 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
1b3f0 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
1b400 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
1b410 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b420 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b430 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
1b440 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
1b450 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1b460 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1b470 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1b480 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41 4c 5f  A_TRUST_DIGITAL_
1b490 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09 63 61  SIGNATURE:....ca
1b4a0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e  se CKA_TRUST_NON
1b4b0 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09  _REPUDIATION:...
1b4c0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
1b4d0 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54  KEY_ENCIPHERMENT
1b4e0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1b4f0 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50 48 45  UST_DATA_ENCIPHE
1b500 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43  RMENT:....case C
1b510 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41 47 52  KA_TRUST_KEY_AGR
1b520 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20  EEMENT:....case 
1b530 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45  CKA_TRUST_KEY_CE
1b540 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65  RT_SIGN:....case
1b550 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53   CKA_TRUST_CRL_S
1b560 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  IGN:....case CKA
1b570 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
1b580 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  TH:....case CKA_
1b590 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54  TRUST_CLIENT_AUT
1b5a0 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  H:....case CKA_T
1b5b0 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e  RUST_CODE_SIGNIN
1b5c0 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  G:....case CKA_T
1b5d0 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45  RUST_EMAIL_PROTE
1b5e0 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45  CTION:.....CACKE
1b5f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b600 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1b610 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e  bute CKA_TRUST_.
1b620 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  .. (0x%08lx) ...
1b630 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1b640 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1b650 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
1b660 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09  = &ck_trusted;..
1b670 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1b680 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73 74 65  sizeof(ck_truste
1b690 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  d);......CACKEY_
1b6a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1b6b0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1b6c0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1b6d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1b6e0 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61 6c 75  K_TRUST *) pValu
1b6f0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1b700 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1b710 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1b720 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1b730 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 3a  _CERT_SHA1_HASH:
1b740 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b750 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1b760 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1b770 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53  KA_CERT_SHA1_HAS
1b780 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
1b790 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1b7a0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1b7b0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1b7c0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
1b7d0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1b7e0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b7f0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b800 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1b810 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1b820 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
1b830 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1b840 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1b850 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52 65 73  ..}......SHA1Res
1b860 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b 0a 09  et(&sha1_ctx);..
1b870 09 09 09 53 48 41 31 49 6e 70 75 74 28 26 73 68  ...SHA1Input(&sh
1b880 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63  a1_ctx, certific
1b890 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
1b8a0 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41 31 52  _len);.....SHA1R
1b8b0 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74 78 2c  esult(&sha1_ctx,
1b8c0 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09   sha1_hash);....
1b8d0 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61 31 5f  ..pValue = sha1_
1b8e0 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75  hash;.....ulValu
1b8f0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68  eLen = sizeof(sh
1b900 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43  a1_hash);......C
1b910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b920 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1b930 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
1b940 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1b950 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1b960 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1b970 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44  case CKA_CERT_MD
1b980 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b  5_HASH:.....CACK
1b990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b9a0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1b9b0 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d  ibute CKA_CERT_M
1b9c0 44 35 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78  D5_HASH (0x%08lx
1b9d0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1b9e0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1b9f0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1ba00 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
1ba10 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1ba20 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1ba30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ba40 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1ba50 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1ba60 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65   we are not a Ne
1ba70 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1ba80 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1ba90 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d  ak;.....}......M
1baa0 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74 78 29  D5Init(&md5_ctx)
1bab0 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74 65 28  ;.....MD5Update(
1bac0 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74 69 66  &md5_ctx, certif
1bad0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
1bae0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35  te_len);.....MD5
1baf0 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20  Final(md5_hash, 
1bb00 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09  &md5_ctx);......
1bb10 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73  pValue = md5_has
1bb20 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  h;.....ulValueLe
1bb30 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68  n = sizeof(md5_h
1bb40 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ash);......CACKE
1bb50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bb60 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1bb70 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
1bb80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1bb90 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1bba0 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61  ..break;....defa
1bbb0 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20  ult:.....pValue 
1bbc0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61  = NULL;.....ulVa
1bbd0 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
1bbe0 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b  G) -1;.....break
1bbf0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43  ;...}....if (((C
1bc00 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c  K_LONG) ulValueL
1bc10 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47  en) != ((CK_LONG
1bc20 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50  ) -1)) {..../* P
1bc30 75 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e  ush curr_attr on
1bc40 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a  to the stack */.
1bc50 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70  ...curr_attr.typ
1bc60 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79  e = curr_attr_ty
1bc70 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  pe;....curr_attr
1bc80 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c  .ulValueLen = ul
1bc90 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75  ValueLen;.....cu
1bca0 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d  rr_attr.pValue =
1bcb0 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74   malloc(curr_att
1bcc0 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  r.ulValueLen);..
1bcd0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
1bce0 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  tr.pValue, pValu
1bcf0 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  e, curr_attr.ulV
1bd00 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66  alueLen);.....if
1bd10 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26   (pValue_free &&
1bd20 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66   pValue) {.....f
1bd30 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09  ree(pValue);....
1bd40 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74  }.....if (numatt
1bd50 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75  rs >= retval_cou
1bd60 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c  nt) {.....retval
1bd70 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61   = realloc(retva
1bd80 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  l, retval_count 
1bd90 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c  * sizeof(*retval
1bda0 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  ));....}.....mem
1bdb0 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61  cpy(&retval[numa
1bdc0 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74  ttrs], &curr_att
1bdd0 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  r, sizeof(curr_a
1bde0 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74  ttr));....numatt
1bdf0 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  rs++;...}..}...i
1be00 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30  f (numattrs != 0
1be10 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75  ) {...retval_cou
1be20 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09  nt = numattrs;..
1be30 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
1be40 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c  c(retval, retval
1be50 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
1be60 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c  *retval));..} el
1be70 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76  se {...free(retv
1be80 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d  al);....retval =
1be90 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c   NULL;..}...*pul
1bea0 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  Count = numattrs
1beb0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1bec0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1bed0 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28  ng %lu objects (
1bee0 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c  %p).", numattrs,
1bef0 20 28 76 6f 69 64 20 2a 29 20 72 65 74 76 61 6c   (void *) retval
1bf00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
1bf10 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
1bf20 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
1bf30 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
1bf40 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1bf50 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75  y *identities, u
1bf60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
1bf70 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
1bf80 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
1bf90 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69  curr_attr;..unsi
1bfa0 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78  gned long id_idx
1bfb0 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66  , attr_idx;...if
1bfc0 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20   (identities == 
1bfd0 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69  NULL || identiti
1bfe0 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  es_count == 0) {
1bff0 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
1c000 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20 30 3b  for (id_idx = 0;
1c010 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e 74 69   id_idx < identi
1c020 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69  ties_count; id_i
1c030 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69 64  dx++) {...if (id
1c040 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1c050 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09  .attributes) {..
1c060 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20  ..for (attr_idx 
1c070 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20  = 0; attr_idx < 
1c080 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c090 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
1c0a0 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29  unt; attr_idx++)
1c0b0 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 74 72   {.....curr_attr
1c0c0 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69   = &identities[i
1c0d0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1c0e0 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09  s[attr_idx];....
1c0f0 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
1c100 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  >pValue) {......
1c110 66 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e  free(curr_attr->
1c120 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09  pValue);.....}..
1c130 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64 65 6e  ..}.....if (iden
1c140 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1c150 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09  ttributes) {....
1c160 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73  .free(identities
1c170 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1c180 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  tes);....}.....c
1c190 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1c1a0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
1c1b0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1c1c0 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d  y, 1, 1);...}..}
1c1d0 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69 74 69  ...free(identiti
1c1e0 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  es);.}..static u
1c1f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63  nsigned long cac
1c200 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1c210 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
1c220 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
1c230 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69  identities, unsi
1c240 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f  gned long num_do
1c250 64 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e 73 69  d_certs) {..unsi
1c260 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69  gned long cert_i
1c270 64 78 2c 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a  dx, id_idx = 0;.
1c280 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1c290 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
1c2a0 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72  turn(num_dod_cer
1c2b0 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f  ts * 3);..}...fo
1c2c0 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b  r (cert_idx = 0;
1c2d0 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f   cert_idx < num_
1c2e0 64 6f 64 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  dod_certs; cert_
1c2f0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74  idx++) {...ident
1c300 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1c310 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55  sc_identity = NU
1c320 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  LL;...identities
1c330 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1c340 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
1c350 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f  _attributes(CKO_
1c360 43 45 52 54 49 46 49 43 41 54 45 2c 20 26 65 78  CERTIFICATE, &ex
1c370 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69  tra_certs[cert_i
1c380 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65  dx], 0xf000 | ce
1c390 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
1c3a0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1c3b0 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  ibutes_count);..
1c3c0 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64  .id_idx++;....id
1c3d0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1c3e0 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
1c3f0 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74   NULL;...identit
1c400 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1c410 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
1c420 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43  get_attributes(C
1c430 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26  KO_PUBLIC_KEY, &
1c440 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
1c450 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
1c460 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1c470 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1c480 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1c490 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09  ...id_idx++;....
1c4a0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c4b0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1c4c0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74   = NULL;...ident
1c4d0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1c4e0 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1c4f0 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1c500 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52  (CKO_NETSCAPE_TR
1c510 55 53 54 2c 20 26 65 78 74 72 61 5f 63 65 72 74  UST, &extra_cert
1c520 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66  s[cert_idx], 0xf
1c530 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20  000 | cert_idx, 
1c540 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
1c550 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
1c560 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b  ount);...id_idx+
1c570 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69  +;..}...return(i
1c580 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69  d_idx);.}..stati
1c590 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
1c5a0 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  identity *cackey
1c5b0 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
1c5c0 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
1c5d0 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
1c5e0 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f  ned long *ids_fo
1c5f0 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63  und) {..struct c
1c600 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
1c610 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
1c620 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61  ties;..struct ca
1c630 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
1c640 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
1c650 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64  gned long num_id
1c660 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  s, id_idx, curr_
1c670 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e  id_type;..unsign
1c680 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74  ed long num_cert
1c690 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  s, num_dod_certs
1c6a0 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74  , cert_idx;..int
1c6b0 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63   include_extra_c
1c6c0 65 72 74 73 20 3d 20 30 2c 20 69 6e 63 6c 75 64  erts = 0, includ
1c6d0 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43  e_dod_certs;...C
1c6e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c6f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c700 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d  .if (ids_found =
1c710 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1c720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c730 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75  "Error.  ids_fou
1c740 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  nd is NULL");...
1c750 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
1c760 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
1c770 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55  _CARD_SLOT_INCLU
1c780 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09  DE_EXTRA_CERTS..
1c790 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1c7a0 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  rts = 1;.#endif.
1c7b0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1c7c0 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f  CKEY_DOD_CERTS_O
1c7d0 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20  N_HW_SLOTS") != 
1c7e0 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
1c7f0 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
1c800 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65  1;..}...if (gete
1c810 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f  nv("CACKEY_NO_DO
1c820 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c  D_CERTS_ON_HW_SL
1c830 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  OTS") != NULL) {
1c840 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  ...include_extra
1c850 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _certs = 0;..}..
1c860 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f  #ifdef CACKEY_NO
1c870 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66  _EXTRA_CERTS..if
1c880 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1c890 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
1c8a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1c8b0 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1c8c0 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  1;..} else {...i
1c8d0 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1c8e0 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09   = 0;..}.#else..
1c8f0 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1c900 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54  EY_NO_EXTRA_CERT
1c910 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
1c920 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1c930 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  ts = 0;..} else 
1c940 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1c950 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65  certs = 1;..}.#e
1c960 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75  ndif...if (inclu
1c970 64 65 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a  de_dod_certs) {.
1c980 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20  ..num_dod_certs 
1c990 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63  = sizeof(extra_c
1c9a0 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 65  erts) / sizeof(e
1c9b0 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a  xtra_certs[0]);.
1c9c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f  .} else {...num_
1c9d0 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  dod_certs = 0;..
1c9e0 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e  }...if (slot->in
1c9f0 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f  ternal) {...num_
1ca00 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ids = cackey_rea
1ca10 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1ca20 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63  (NULL, num_dod_c
1ca30 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75  erts);....if (nu
1ca40 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a 09 09  m_ids != 0) {...
1ca50 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
1ca60 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
1ca70 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
1ca80 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  s));.....cackey_
1ca90 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1caa0 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 2c 20  ies(identities, 
1cab0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
1cac0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 64  ..} else {....id
1cad0 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
1cae0 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75  ...}....*ids_fou
1caf0 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nd = num_ids;...
1cb00 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69  .return(identiti
1cb10 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69  es);..}...pcsc_i
1cb20 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
1cb30 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c  ey_read_certs(sl
1cb40 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  ot, NULL, &num_c
1cb50 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63  erts);..if (pcsc
1cb60 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  _identities != N
1cb70 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76  ULL) {.../* Conv
1cb80 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65  ert number of Ce
1cb90 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66  rts to number of
1cba0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75   objects */...nu
1cbb0 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49  m_ids = (CKO_PRI
1cbc0 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43  VATE_KEY - CKO_C
1cbd0 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20  ERTIFICATE + 1) 
1cbe0 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09  * num_certs;....
1cbf0 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72  if (include_extr
1cc00 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 6e 75  a_certs) {....nu
1cc10 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f  m_ids += cackey_
1cc20 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1cc30 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f  ies(NULL, num_do
1cc40 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09  d_certs);...}...
1cc50 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
1cc60 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
1cc70 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
1cc80 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63  s));..../* Add c
1cc90 65 72 74 69 66 69 63 61 74 65 73 2c 20 70 75 62  ertificates, pub
1cca0 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20 70 72  lic keys, and pr
1ccb0 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f 6d 20  ivate keys from 
1ccc0 74 68 65 20 73 6d 61 72 74 63 61 72 64 20 2a 2f  the smartcard */
1ccd0 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09  ...id_idx = 0;..
1cce0 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d  .for (cert_idx =
1ccf0 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e   0; cert_idx < n
1cd00 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69  um_certs; cert_i
1cd10 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28  dx++) {....for (
1cd20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43  curr_id_type = C
1cd30 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20  KO_CERTIFICATE; 
1cd40 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20  curr_id_type <= 
1cd50 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b  CKO_PRIVATE_KEY;
1cd60 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29   curr_id_type++)
1cd70 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65   {.....identitie
1cd80 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1cd90 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
1cda0 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75 72  t_attributes(cur
1cdb0 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73 63  r_id_type, &pcsc
1cdc0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1cdd0 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c  _idx], cert_idx,
1cde0 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
1cdf0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1ce00 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65  count);......ide
1ce10 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1ce20 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
1ce30 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69  malloc(sizeof(*i
1ce40 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1ce50 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29  ].pcsc_identity)
1ce60 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64  );.....memcpy(id
1ce70 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1ce80 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20  .pcsc_identity, 
1ce90 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  &pcsc_identities
1cea0 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65  [cert_idx], size
1ceb0 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69  of(*identities[i
1cec0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1ced0 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65  tity));......ide
1cee0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1cef0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
1cf00 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
1cf10 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74  loc(pcsc_identit
1cf20 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
1cf30 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
1cf40 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74  ....memcpy(ident
1cf50 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1cf60 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
1cf70 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69  tificate, pcsc_i
1cf80 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1cf90 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c  dx].certificate,
1cfa0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
1cfb0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
1cfc0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
1cfd0 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d  ..id_idx++;....}
1cfe0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c  ...}....if (incl
1cff0 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29  ude_extra_certs)
1d000 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1d010 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75  UG_PRINTF("Inclu
1d020 64 69 6e 67 20 55 53 20 47 6f 76 65 72 6e 6d 65  ding US Governme
1d030 6e 74 20 43 65 72 74 69 66 69 63 61 74 65 73 20  nt Certificates 
1d040 6f 6e 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74  on hardware slot
1d050 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72  ");.....cackey_r
1d060 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
1d070 65 73 28 69 64 65 6e 74 69 74 69 65 73 20 2b 20  es(identities + 
1d080 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f  id_idx, num_dod_
1d090 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63  certs);...}....c
1d0a0 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1d0b0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
1d0c0 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
1d0d0 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  ....*ids_found =
1d0e0 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74   num_ids;....ret
1d0f0 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b  urn(identities);
1d100 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e  ..}....*ids_foun
1d110 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e  d = 0;..return(N
1d120 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ULL);.}..static 
1d130 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
1d140 79 5f 67 65 74 5f 70 69 6e 28 63 68 61 72 20 2a  y_get_pin(char *
1d150 70 69 6e 62 75 66 29 20 7b 0a 09 46 49 4c 45 20  pinbuf) {..FILE 
1d160 2a 70 69 6e 66 64 3b 0a 09 63 68 61 72 20 2a 66  *pinfd;..char *f
1d170 67 65 74 73 5f 72 65 74 3b 0a 09 69 6e 74 20 70  gets_ret;..int p
1d180 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09 69 66 20  close_ret;...if 
1d190 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
1d1a0 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and == NULL) {..
1d1b0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
1d1c0 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
1d1d0 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75 66 20  .}...if (pinbuf 
1d1e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
1d1f0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
1d200 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
1d210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d220 49 4e 54 46 28 22 43 41 43 4b 45 59 5f 50 49 4e  INTF("CACKEY_PIN
1d230 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25 73 22 2c 20  _COMMAND = %s", 
1d240 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1d250 6e 64 29 3b 0a 0a 09 70 69 6e 66 64 20 3d 20 70  nd);...pinfd = p
1d260 6f 70 65 6e 28 63 61 63 6b 65 79 5f 70 69 6e 5f  open(cackey_pin_
1d270 63 6f 6d 6d 61 6e 64 2c 20 22 72 22 29 3b 0a 09  command, "r");..
1d280 69 66 20 28 70 69 6e 66 64 20 3d 3d 20 4e 55 4c  if (pinfd == NUL
1d290 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1d2a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d2b0 72 2e 20 20 25 73 3a 20 55 6e 61 62 6c 65 20 74  r.  %s: Unable t
1d2c0 6f 20 72 75 6e 22 2c 20 63 61 63 6b 65 79 5f 70  o run", cackey_p
1d2d0 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09  in_command);....
1d2e0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
1d2f0 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d  SC_E_BADPIN);..}
1d300 0a 0a 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66  ...fgets_ret = f
1d310 67 65 74 73 28 70 69 6e 62 75 66 2c 20 33 32 2c  gets(pinbuf, 32,
1d320 20 70 69 6e 66 64 29 3b 0a 09 69 66 20 28 66 67   pinfd);..if (fg
1d330 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29  ets_ret == NULL)
1d340 20 7b 0a 09 09 70 69 6e 62 75 66 5b 30 5d 20 3d   {...pinbuf[0] =
1d350 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 70 63 6c 6f   '\0';..}...pclo
1d360 73 65 5f 72 65 74 20 3d 20 70 63 6c 6f 73 65 28  se_ret = pclose(
1d370 70 69 6e 66 64 29 3b 0a 09 69 66 20 28 70 63 6c  pinfd);..if (pcl
1d380 6f 73 65 5f 72 65 74 20 3d 3d 20 2d 31 20 26 26  ose_ret == -1 &&
1d390 20 65 72 72 6e 6f 20 3d 3d 20 45 43 48 49 4c 44   errno == ECHILD
1d3a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d3b0 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 74 69 63  UG_PRINTF("Notic
1d3c0 65 2e 20 20 70 63 6c 6f 73 65 28 29 20 69 6e 64  e.  pclose() ind
1d3d0 69 63 61 74 65 64 20 69 74 20 63 6f 75 6c 64 20  icated it could 
1d3e0 6e 6f 74 20 67 65 74 20 74 68 65 20 73 74 61 74  not get the stat
1d3f0 75 73 20 6f 66 20 74 68 65 20 63 68 69 6c 64 2c  us of the child,
1d400 20 61 73 73 75 6d 69 6e 67 20 69 74 20 73 75 63   assuming it suc
1d410 63 65 65 65 64 65 64 20 21 22 29 3b 0a 0a 09 09  ceeeded !");....
1d420 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 30 3b 0a  pclose_ret = 0;.
1d430 09 7d 0a 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f  .}...if (pclose_
1d440 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  ret != 0) {...CA
1d450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d460 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 65  F("Error.  %s: e
1d470 78 69 74 65 64 20 77 69 74 68 20 6e 6f 6e 2d 7a  xited with non-z
1d480 65 72 6f 20 73 74 61 74 75 73 20 6f 66 20 25 69  ero status of %i
1d490 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ", cackey_pin_co
1d4a0 6d 6d 61 6e 64 2c 20 70 63 6c 6f 73 65 5f 72 65  mmand, pclose_re
1d4b0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  t);....return(CA
1d4c0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
1d4d0 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74  IN);..}...if (st
1d4e0 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 3c 20 31  rlen(pinbuf) < 1
1d4f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d500 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d510 2e 20 20 25 73 3a 20 72 65 74 75 72 6e 65 64 20  .  %s: returned 
1d520 6e 6f 20 64 61 74 61 22 2c 20 63 61 63 6b 65 79  no data", cackey
1d530 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a  _pin_command);..
1d540 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
1d550 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
1d560 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75 66 5b  .}...if (pinbuf[
1d570 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d  strlen(pinbuf) -
1d580 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a 09   1] == '\n') {..
1d590 09 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70  .pinbuf[strlen(p
1d5a0 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 20 27 5c  inbuf) - 1] = '\
1d5b0 30 27 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  0';..}...return(
1d5c0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
1d5d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d5e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d5f0 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b  C_Initialize)(CK
1d600 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41  _VOID_PTR pInitA
1d610 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49  rgs) {..CK_C_INI
1d620 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f  TIALIZE_ARGS CK_
1d630 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33  PTR args;..uint3
1d640 32 5f 74 20 69 64 78 2c 20 68 69 67 68 65 73 74  2_t idx, highest
1d650 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75 74 65  _slot;..int mute
1d660 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 09 69 6e 74  x_init_ret;..int
1d670 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72   include_dod_cer
1d680 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ts;...CACKEY_DEB
1d690 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1d6a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
1d6b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1d6c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d6d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d6e0 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c   Already initial
1d6f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1d700 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1d710 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49  ALREADY_INITIALI
1d720 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
1d730 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c  InitArgs != NULL
1d740 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e  ) {...args = pIn
1d750 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79  itArgs;...memcpy
1d760 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61  (&cackey_args, a
1d770 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b  rgs, sizeof(cack
1d780 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66  ey_args));....if
1d790 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
1d7a0 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
1d7b0 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
1d7c0 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
1d7d0 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  s->LockMutex == 
1d7e0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
1d7f0 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  lockMutex == NUL
1d800 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73  L) {....if (args
1d810 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d  ->CreateMutex !=
1d820 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44   NULL || args->D
1d830 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e  estroyMutex != N
1d840 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63  ULL || args->Loc
1d850 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  kMutex != NULL |
1d860 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75  | args->UnlockMu
1d870 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tex != NULL) {..
1d880 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d890 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
1d8a0 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c  ome, but not All
1d8b0 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69   threading primi
1d8c0 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22  tives provided."
1d8d0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
1d8e0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1d8f0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65  );....}...}..} e
1d900 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61  lse {...cackey_a
1d910 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20  rgs.CreateMutex 
1d920 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1d930 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74  _args.DestroyMut
1d940 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1d950 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
1d960 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1d970 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
1d980 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1d990 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
1d9a0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28   = 0;..}...for (
1d9b0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1d9c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1d9d0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1d9e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d9f0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1da00 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1da10 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
1da20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  0;..}...for (idx
1da30 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1da40 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1da50 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1da60 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
1da70 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  x++) {...cackey_
1da80 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76  slots[idx].activ
1da90 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  e = 0;...cackey_
1daa0 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
1dab0 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
1dac0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1dad0 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
1dae0 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b  epth = 0;...cack
1daf0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
1db00 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
1db10 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61  w_lock = 0;...ca
1db20 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1db30 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
1db40 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1db50 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  dx].token_flags 
1db60 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1db70 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d  ots[idx].label =
1db80 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1db90 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72  slots[idx].inter
1dba0 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66  nal = 0;..}..#if
1dbb0 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  def CACKEY_NO_EX
1dbc0 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20 28 67  TRA_CERTS..if (g
1dbd0 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 45 58  etenv("CACKEY_EX
1dbe0 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1dbf0 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1dc00 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a  _dod_certs = 1;.
1dc10 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c  .} else {...incl
1dc20 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1dc30 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20  0;..}.#else..if 
1dc40 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1dc50 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29  NO_EXTRA_CERTS")
1dc60 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1dc70 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1dc80 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 0;..} else {..
1dc90 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1dca0 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69  ts = 1;..}.#endi
1dcb0 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  f...if (include_
1dcc0 64 6f 64 5f 63 65 72 74 73 20 3d 3d 20 30 29 20  dod_certs == 0) 
1dcd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dce0 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e  _PRINTF("Asked n
1dcf0 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f  ot to include Do
1dd00 44 20 63 65 72 74 69 66 69 63 61 74 65 73 22 29  D certificates")
1dd10 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69  ;..} else {...hi
1dd20 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69  ghest_slot = (si
1dd30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1dd40 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1dd50 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20  ey_slots[0])) - 
1dd60 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
1dd70 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75  UG_PRINTF("Inclu
1dd80 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69  ding DoD certs i
1dd90 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e  n slot %lu", (un
1dda0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67  signed long) hig
1ddb0 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63  hest_slot);....c
1ddc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1ddd0 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65  est_slot].active
1dde0 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
1ddf0 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1de00 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b  t].internal = 1;
1de10 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1de20 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61  highest_slot].la
1de30 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  bel = (unsigned 
1de40 63 68 61 72 20 2a 29 20 22 55 53 20 47 6f 76 65  char *) "US Gove
1de50 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61  rnment Certifica
1de60 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73  tes";...cackey_s
1de70 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1de80 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
1de90 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63   "CACKey";...cac
1dea0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1deb0 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  t_slot].token_fl
1dec0 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61  ags = 0;..}...ca
1ded0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1dee0 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63   = 1;...if (!cac
1def0 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
1df00 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74  ) {...mutex_init
1df10 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75  _ret = cackey_mu
1df20 74 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b  tex_create(&cack
1df30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1df40 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72  if (mutex_init_r
1df50 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  et != 0) {....CA
1df60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1df70 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78  F("Error.  Mutex
1df80 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1df90 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72  failed.");.....r
1dfa0 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c  eturn(CKR_CANT_L
1dfb0 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  OCK);...}....cac
1dfc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
1dfd0 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65   = 1;..}.../* De
1dfe0 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64 20 74  fine a command t
1dff0 6f 20 70 72 6f 6d 70 74 20 75 73 65 72 20 66 6f  o prompt user fo
1e000 72 20 61 20 50 49 4e 20 2a 2f 0a 23 69 66 64 65  r a PIN */.#ifde
1e010 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  f CACKEY_PIN_COM
1e020 4d 41 4e 44 5f 44 45 46 41 55 4c 54 0a 09 63 61  MAND_DEFAULT..ca
1e030 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1e040 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 59   = strdup(CACKEY
1e050 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58  _MACRO_DEFAULT_X
1e060 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43  STR(CACKEY_PIN_C
1e070 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 29 29  OMMAND_DEFAULT))
1e080 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1e090 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
1e0a0 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c  AND_XONLY_DEFAUL
1e0b0 54 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 44  T..if (getenv("D
1e0c0 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c  ISPLAY") != NULL
1e0d0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e  ) {...cackey_pin
1e0e0 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75  _command = strdu
1e0f0 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44  p(CACKEY_MACRO_D
1e100 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b  EFAULT_XSTR(CACK
1e110 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58  EY_PIN_COMMAND_X
1e120 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29 3b 0a  ONLY_DEFAULT));.
1e130 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28  .}.#endif...if (
1e140 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1e150 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21 3d 20  IN_COMMAND") != 
1e160 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1e170 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73  _pin_command = s
1e180 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41  trdup(getenv("CA
1e190 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1e1a0 22 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65  "));..}...if (ge
1e1b0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e  tenv("CACKEY_PIN
1e1c0 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29  _COMMAND_XONLY")
1e1d0 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65 74 65   != NULL && gete
1e1e0 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d  nv("DISPLAY") !=
1e1f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
1e200 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20  y_pin_command = 
1e210 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43  strdup(getenv("C
1e220 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1e230 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a 09 7d 0a 0a  D_XONLY"));..}..
1e240 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 52 45  #ifdef CACKEY_RE
1e250 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e  ADERS_INCLUDE_ON
1e260 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b  LY_DEFAULT..cack
1e270 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1e280 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64 75 70  de_only = strdup
1e290 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45  (CACKEY_MACRO_DE
1e2a0 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45  FAULT_XSTR(CACKE
1e2b0 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44  Y_READERS_INCLUD
1e2c0 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29  E_ONLY_DEFAULT))
1e2d0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1e2e0 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f   CACKEY_READERS_
1e2f0 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c 54 0a  EXCLUDE_DEFAULT.
1e300 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1e310 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64 75 70  exclude = strdup
1e320 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45  (CACKEY_MACRO_DE
1e330 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45  FAULT_XSTR(CACKE
1e340 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44  Y_READERS_EXCLUD
1e350 45 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e  E_DEFAULT));.#en
1e360 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
1e370 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53  ("CACKEY_READERS
1e380 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 29 20  _INCLUDE_ONLY") 
1e390 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1e3a0 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
1e3b0 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64 75  ude_only = strdu
1e3c0 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59  p(getenv("CACKEY
1e3d0 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45  _READERS_INCLUDE
1e3e0 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09 09 69 66 20  _ONLY"));....if 
1e3f0 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  (cackey_readers_
1e400 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 5b 30 5d 20  include_only[0] 
1e410 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 66 72  == '\0') {....fr
1e420 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ee(cackey_reader
1e430 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b  s_include_only);
1e440 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64  .....cackey_read
1e450 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1e460 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a   = NULL;...}..}.
1e470 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1e480 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43  CKEY_READERS_EXC
1e490 4c 55 44 45 22 29 20 21 3d 20 4e 55 4c 4c 29 20  LUDE") != NULL) 
1e4a0 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65  {...cackey_reade
1e4b0 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 72  rs_exclude = str
1e4c0 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b  dup(getenv("CACK
1e4d0 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55  EY_READERS_EXCLU
1e4e0 44 45 22 29 29 3b 0a 0a 09 09 69 66 20 28 63 61  DE"));....if (ca
1e4f0 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
1e500 6c 75 64 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29  lude[0] == '\0')
1e510 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
1e520 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64  y_readers_exclud
1e530 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72  e);.....cackey_r
1e540 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d  eaders_exclude =
1e550 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   NULL;...}..}...
1e560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e570 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1e580 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1e590 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1e5a0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1e5b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e5c0 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29  _RV, C_Finalize)
1e5d0 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65  (CK_VOID_PTR pRe
1e5e0 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33  served) {..uint3
1e5f0 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
1e600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e610 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1e620 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
1e630 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1e640 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e650 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
1e660 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
1e670 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1e680 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1e690 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1e6a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1e6b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e6c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1e6d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1e6e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1e6f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1e700 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  LIZED);..}...for
1e710 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1e720 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1e730 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1e740 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1e750 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
1e760 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
1e770 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1e780 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73  ive) {....C_Clos
1e790 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
1e7a0 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  .}..}...cackey_s
1e7b0 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
1e7c0 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64  all();...for (id
1e7d0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
1e7e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e7f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e800 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
1e810 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
1e820 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1e830 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63  internal) {....c
1e840 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
1e850 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1e860 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
1e870 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  r) {....free(cac
1e880 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1e890 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d  csc_reader);...}
1e8a0 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1e8b0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1e8c0 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63  _certs) {....cac
1e8d0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63  key_free_certs(c
1e8e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1e8f0 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63  .cached_certs, c
1e900 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1e910 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  .cached_certs_co
1e920 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63  unt, 1);.....cac
1e930 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63  key_slots[idx].c
1e940 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55  ached_certs = NU
1e950 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  LL;...}..}...cac
1e960 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
1e970 65 63 74 28 29 3b 0a 0a 09 69 66 20 28 63 61 63  ect();...if (cac
1e980 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1e990 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65  != NULL) {...fre
1e9a0 65 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  e(cackey_pin_com
1e9b0 6d 61 6e 64 29 3b 0a 0a 09 09 63 61 63 6b 65 79  mand);....cackey
1e9c0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e  _pin_command = N
1e9d0 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ULL;..}...if (ca
1e9e0 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1e9f0 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c  lude_only != NUL
1ea00 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  L) {...free(cack
1ea10 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1ea20 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 63 61 63  de_only);....cac
1ea30 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
1ea40 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b  ude_only = NULL;
1ea50 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1ea60 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
1ea70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72   != NULL) {...fr
1ea80 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ee(cackey_reader
1ea90 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 63  s_exclude);....c
1eaa0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
1eab0 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  clude = NULL;..}
1eac0 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  ...cackey_initia
1ead0 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43  lized = 0;...CAC
1eae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1eaf0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1eb00 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1eb10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1eb20 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1eb30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1eb40 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f  , C_GetInfo)(CK_
1eb50 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
1eb60 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
1eb70 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72  8CHAR manufactur
1eb80 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47  erID[] = "U.S. G
1eb90 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61  overnment";..sta
1eba0 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
1ebb0 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
1ebc0 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b  on[] = "CACKey";
1ebd0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ebe0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1ebf0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1ec00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1ec10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ec20 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1ec30 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1ec40 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1ec50 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1ec60 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1ec70 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ec80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ec90 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1eca0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1ecb0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1ecc0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1ecd0 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
1ece0 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e  cryptokiVersion.
1ecf0 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  major = ((CACKEY
1ed00 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
1ed10 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26  N_CODE) >> 16) &
1ed20 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63   0xff;..pInfo->c
1ed30 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d  ryptokiVersion.m
1ed40 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  inor = ((CACKEY_
1ed50 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
1ed60 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30  _CODE) >> 8) & 0
1ed70 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  xff;...memset(pI
1ed80 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1ed90 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
1eda0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1edb0 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
1edc0 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
1edd0 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
1ede0 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
1edf0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
1ee00 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  - 1);...pInfo->f
1ee10 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d  lags = 0x00;...m
1ee20 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62  emset(pInfo->lib
1ee30 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c  raryDescription,
1ee40 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1ee50 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72  fo->libraryDescr
1ee60 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70  iption));..memcp
1ee70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  y(pInfo->library
1ee80 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62  Description, lib
1ee90 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c  raryDescription,
1eea0 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44   sizeof(libraryD
1eeb0 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29  escription) - 1)
1eec0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  ;...pInfo->libra
1eed0 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  ryVersion.major 
1eee0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
1eef0 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
1ef00 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69  0xff;..pInfo->li
1ef10 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e  braryVersion.min
1ef20 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1ef30 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
1ef40 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59  & 0xff;...CACKEY
1ef50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1ef60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1ef70 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1ef80 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1ef90 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65  ;.}../*. * Proce
1efa0 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65  ss list of reade
1efb0 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d  rs, and create m
1efc0 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72  apping between r
1efd0 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73  eader name and s
1efe0 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45  lot ID. */.CK_DE
1eff0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1f000 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69  _RV, C_GetSlotLi
1f010 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b  st)(CK_BBOOL tok
1f020 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c  enPresent, CK_SL
1f030 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c  OT_ID_PTR pSlotL
1f040 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ist, CK_ULONG_PT
1f050 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73  R pulCount) {..s
1f060 74 61 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f  tatic int first_
1f070 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d  call = 1;..int m
1f080 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
1f090 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
1f0a0 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f  et;..CK_ULONG co
1f0b0 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20  unt, slot_count 
1f0c0 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73  = 0, currslot, s
1f0d0 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a  lot_idx;..char *
1f0e0 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70  pcsc_readers, *p
1f0f0 63 73 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a  csc_readers_s, *
1f100 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a  pcsc_readers_e;.
1f110 09 63 68 61 72 20 2a 72 65 61 64 65 72 5f 63 68  .char *reader_ch
1f120 65 63 6b 5f 70 61 74 74 65 72 6e 3b 0a 09 44 57  eck_pattern;..DW
1f130 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73  ORD pcsc_readers
1f140 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _len;..LONG scar
1f150 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1f160 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f  t;..size_t curr_
1f170 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74  reader_len;..int
1f180 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 09 69 6e   slot_reset;..in
1f190 74 20 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72  t include_reader
1f1a0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1f1b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f1c0 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75  ");...if (pulCou
1f1d0 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
1f1e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f1f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43  NTF("Error. pulC
1f200 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ount is NULL.");
1f210 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1f220 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1f230 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1f240 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1f250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f260 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1f270 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1f280 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f290 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1f2a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1f2b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1f2c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1f2d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f2e0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1f2f0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1f300 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f310 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1f320 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1f330 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1f340 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1f350 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f  ./* Clear list o
1f360 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74  f slots */..slot
1f370 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 69 66 20  _reset = 0;..if 
1f380 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09  (pSlotList) {...
1f390 69 66 20 28 66 69 72 73 74 5f 63 61 6c 6c 29 20  if (first_call) 
1f3a0 7b 0a 09 09 09 66 69 72 73 74 5f 63 61 6c 6c 20  {....first_call 
1f3b0 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65  = 0;.....slot_re
1f3c0 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09  set = 1;...}....
1f3d0 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
1f3e0 20 73 6c 6f 74 73 20 68 61 76 65 20 62 65 65 6e   slots have been
1f3f0 20 72 65 73 65 74 20 74 68 65 6e 20 70 75 72 67   reset then purg
1f400 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
1f410 6e 20 61 6e 64 20 63 68 65 63 6b 20 61 67 61 69  n and check agai
1f420 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75 72 72  n */...for (curr
1f430 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c  slot = 0; currsl
1f440 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
1f450 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1f460 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1f470 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  [0])); currslot+
1f480 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b  +) {....if (cack
1f490 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1f4a0 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  t].internal) {..
1f4b0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
1f4c0 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
1f4d0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1f4e0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
1f4f0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
1f500 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1f510 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c  ots[currslot].sl
1f520 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09  ot_reset) {.....
1f530 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
1f540 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
1f550 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74  ...}....if (slot
1f560 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 43 41 43  _reset) {....CAC
1f570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f580 28 22 50 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c  ("Purging all sl
1f590 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22  ot information."
1f5a0 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75  );...../* Only u
1f5b0 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f  pdate the list o
1f5c0 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72  f slots if we ar
1f5d0 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  e actually being
1f5e0 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
1f5f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1f600 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
1f610 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
1f620 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75 72 72 73  ;.....for (currs
1f630 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
1f640 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
1f650 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1f660 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1f670 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
1f680 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
1f690 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1f6a0 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  t].internal) {..
1f6b0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1f6c0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63  ..}......if (cac
1f6d0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1f6e0 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
1f6f0 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63   {......free(cac
1f700 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1f710 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
1f720 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
1f730 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
1f740 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
1f750 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  L;.....}......if
1f760 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1f770 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20  urrslot].label) 
1f780 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b  {......free(cack
1f790 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1f7a0 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09  t].label);......
1f7b0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1f7c0 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20  rrslot].label = 
1f7d0 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  NULL;.....}.....
1f7e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1f7f0 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d  rrslot].active =
1f800 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73   0;....}...} els
1f810 65 20 7b 0a 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a  e {.......}..}..
1f820 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c 69  ./* Determine li
1f830 73 74 20 6f 66 20 72 65 61 64 65 72 73 20 2a 2f  st of readers */
1f840 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
1f850 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63  et = cackey_pcsc
1f860 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 2f 2a 20 58  _connect();./* X
1f870 58 58 3a 20 43 41 4e 20 48 41 4e 47 20 48 45 52  XX: CAN HANG HER
1f880 45 20 21 20 2a 2f 0a 09 69 66 20 28 70 63 73 63  E ! */..if (pcsc
1f890 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
1f8a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
1f8b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f8c0 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
1f8d0 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66  ction to PC/SC f
1f8e0 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20  ailed, assuming 
1f8f0 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73  no slots");....s
1f900 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  lot_count = 0;..
1f910 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f  } else {...pcsc_
1f920 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b  readers_len = 0;
1f930 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
1f940 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
1f950 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
1f960 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
1f970 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70  , NULL, NULL, &p
1f980 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
1f990 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  ;....if (scard_l
1f9a0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1f9b0 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45  = SCARD_F_COMM_E
1f9c0 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45  RROR) {....CACKE
1f9d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f9e0 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74  Error. SCardList
1f9f0 52 65 61 64 65 72 73 28 29 20 72 65 74 75 72 6e  Readers() return
1fa00 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f  ed SCARD_F_COMM_
1fa10 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20  ERROR, assuming 
1fa20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43  Connection to PC
1fa30 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52  /SC went away. R
1fa40 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a  econnecting.");.
1fa50 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
1fa60 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09  disconnect();...
1fa70 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e  .cackey_pcsc_con
1fa80 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b  nect();.....CACK
1fa90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1faa0 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73  "Trying SCardLis
1fab0 74 52 65 61 64 65 72 73 28 29 20 61 67 61 69 6e  tReaders() again
1fac0 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  ");....scard_lis
1fad0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
1fae0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
1faf0 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
1fb00 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  dle, NULL, NULL,
1fb10 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c   &pcsc_readers_l
1fb20 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  en);...}....if (
1fb30 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1fb40 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
1fb50 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63  _SUCCESS && pcsc
1fb60 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20  _readers_len != 
1fb70 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61  0) {....pcsc_rea
1fb80 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  ders = malloc(pc
1fb90 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1fba0 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
1fbb0 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _s = pcsc_reader
1fbc0 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  s;.....scard_lis
1fbd0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
1fbe0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
1fbf0 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
1fc00 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f  dle, NULL, pcsc_
1fc10 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72  readers, &pcsc_r
1fc20 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
1fc30 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
1fc40 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
1fc50 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
1fc60 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
1fc70 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _e = pcsc_reader
1fc80 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73  s + pcsc_readers
1fc90 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74  _len;....../* St
1fca0 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44  art with Slot ID
1fcb0 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62   1, to avoid a b
1fcc0 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45  ug in GDM on RHE
1fcd0 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20  L */...../* Bug 
1fce0 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f  594911: https://
1fcf0 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e  bugzilla.redhat.
1fd00 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  com/show_bug.cgi
1fd10 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09  ?id=594911 */...
1fd20 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a  ..currslot = 1;.
1fd30 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d  ....slot_count =
1fd40 20 30 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 70   0;.....while (p
1fd50 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70 63  csc_readers < pc
1fd60 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a  sc_readers_e) {.
1fd70 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78  ...../* Find nex
1fd80 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  t available slot
1fd90 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b 20   */......for (; 
1fda0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
1fdb0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1fdc0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1fdd0 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
1fde0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09  rslot++) {......
1fdf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f  .if (!cackey_slo
1fe00 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
1fe10 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 62 72  ive) {........br
1fe20 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  eak;.......}....
1fe30 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f 72  ..}.......curr_r
1fe40 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c  eader_len = strl
1fe50 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  en(pcsc_readers)
1fe60 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73  ;.......if ((pcs
1fe70 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72  c_readers + curr
1fe80 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70  _reader_len) > p
1fe90 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
1fea0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1feb0 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
1fec0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
1fed0 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  = 0) {.......bre
1fee0 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
1fef0 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d  .if (currslot >=
1ff00 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1ff10 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1ff20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1ff30 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  )) {.......CACKE
1ff40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ff50 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65  Found more reade
1ff60 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72  rs than slots ar
1ff70 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a  e available!");.
1ff80 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1ff90 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45  ...}.......CACKE
1ffa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ffb0 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73  Found reader: %s
1ffc0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 25 6c 75   (currslot = %lu
1ffd0 29 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  )", pcsc_readers
1ffe0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1fff0 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09  ) currslot);....
20000 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65  ...if (cackey_re
20010 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
20020 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ly != NULL) {...
20030 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20040 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74  _PRINTF("Asked t
20050 6f 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20 72  o include only r
20060 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e 67 3a  eaders matching:
20070 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72 65 61   %s", cackey_rea
20080 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
20090 79 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c 75  y);........inclu
200a0 64 65 5f 72 65 61 64 65 72 20 3d 20 30 3b 0a 09  de_reader = 0;..
200b0 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65 63  .....reader_chec
200c0 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61 63 6b  k_pattern = cack
200d0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
200e0 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09 7d 20  de_only;......} 
200f0 65 6c 73 65 20 69 66 20 28 63 61 63 6b 65 79 5f  else if (cackey_
20100 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20  readers_exclude 
20110 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  != NULL) {......
20120 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20130 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f 20 65  INTF("Asked to e
20140 78 63 6c 75 64 65 20 72 65 61 64 65 72 73 20 6d  xclude readers m
20150 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20 63 61  atching: %s", ca
20160 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
20170 6c 75 64 65 29 3b 0a 0a 09 09 09 09 09 09 69 6e  lude);........in
20180 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31  clude_reader = 1
20190 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63  ;.......reader_c
201a0 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63  heck_pattern = c
201b0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
201c0 63 6c 75 64 65 3b 0a 09 09 09 09 09 7d 20 65 6c  clude;......} el
201d0 73 65 20 7b 0a 09 09 09 09 09 09 69 6e 63 6c 75  se {.......inclu
201e0 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a 09  de_reader = 1;..
201f0 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65 63  .....reader_chec
20200 6b 5f 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c  k_pattern = NULL
20210 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
20220 66 20 28 72 65 61 64 65 72 5f 63 68 65 63 6b 5f  f (reader_check_
20230 70 61 74 74 65 72 6e 20 21 3d 20 4e 55 4c 4c 29  pattern != NULL)
20240 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 74 72   {.......if (str
20250 73 74 72 28 70 63 73 63 5f 72 65 61 64 65 72 73  str(pcsc_readers
20260 2c 20 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70  , reader_check_p
20270 61 74 74 65 72 6e 29 20 21 3d 20 4e 55 4c 4c 29  attern) != NULL)
20280 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59   {........CACKEY
20290 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
202a0 68 69 73 20 72 65 61 64 65 72 20 6d 61 74 63 68  his reader match
202b0 65 64 20 74 68 65 20 70 61 74 74 65 72 6e 2e 22  ed the pattern."
202c0 29 3b 0a 09 09 09 09 09 09 0a 09 09 09 09 09 09  );..............
202d0 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20  .include_reader 
202e0 3d 20 21 69 6e 63 6c 75 64 65 5f 72 65 61 64 65  = !include_reade
202f0 72 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  r;.......}......
20300 7d 0a 0a 09 09 09 09 09 69 66 20 28 69 6e 63 6c  }.......if (incl
20310 75 64 65 5f 72 65 61 64 65 72 20 21 3d 20 31 29  ude_reader != 1)
20320 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
20330 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6b  DEBUG_PRINTF("Sk
20340 69 70 70 69 6e 67 20 74 68 69 73 20 72 65 61 64  ipping this read
20350 65 72 2e 22 29 3b 0a 0a 09 09 09 09 09 09 70 63  er.");........pc
20360 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 75  sc_readers += cu
20370 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20  rr_reader_len + 
20380 31 3b 0a 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e  1;........contin
20390 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ue;......}......
203a0 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
203b0 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
203c0 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
203d0 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64  ally being asked
203e0 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
203f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
20400 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
20410 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  st) {.......if (
20420 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
20430 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
20440 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
20450 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63  ve = 1;........c
20460 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
20470 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  slot].internal =
20480 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
20490 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
204a0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
204b0 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61 64  strdup(pcsc_read
204c0 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63  ers);........cac
204d0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
204e0 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot].pcsc_card_co
204f0 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09  nnected = 0;....
20500 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
20510 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73  [currslot].trans
20520 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
20530 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
20540 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
20550 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
20560 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
20570 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
20580 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
20590 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 09 63  ULL) {.........c
205a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
205b0 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  slot].token_flag
205c0 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
205d0 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 09 7d  QUIRED;........}
205e0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09   else {.........
205f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
20600 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  rslot].token_fla
20610 67 73 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 7d  gs = 0;........}
20620 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
20630 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
20640 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  abel = NULL;....
20650 09 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
20660 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63  _slot_reset(&cac
20670 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
20680 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09  ot]);.......}...
20690 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
206a0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
206b0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
206c0 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 2f  tive) {......../
206d0 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69  * Artificially i
206e0 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62  ncrease the numb
206f0 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f  er of active slo
20700 74 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20  ts by what will 
20710 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f  become active */
20720 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  ........CACKEY_D
20730 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
20740 6e 64 20 69 6e 2d 61 63 74 69 76 65 20 73 6c 6f  nd in-active slo
20750 74 20 25 6c 75 2c 20 62 75 74 20 69 74 20 77 69  t %lu, but it wi
20760 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
20770 65 72 20 61 20 72 65 73 65 74 20 2d 2d 20 6d 61  er a reset -- ma
20780 72 6b 69 6e 67 20 61 73 20 61 63 74 69 76 65 20  rking as active 
20790 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e 67 20 70  for accounting p
207a0 75 72 70 6f 73 65 73 22 2c 20 28 75 6e 73 69 67  urposes", (unsig
207b0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c  ned long) currsl
207c0 6f 74 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c 6f  ot);.........slo
207d0 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09  t_count++;......
207e0 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63  .}......}......c
207f0 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09  urrslot++;......
20800 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d  .pcsc_readers +=
20810 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
20820 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   + 1;.....}.....
20830 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d  .for (currslot =
20840 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   0; currslot < (
20850 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
20860 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
20870 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
20880 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
20890 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
208a0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
208b0 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 43  ctive) {.......C
208c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
208d0 54 46 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65  TF("Found active
208e0 20 73 6c 6f 74 20 25 6c 75 2c 20 72 65 61 64 65   slot %lu, reade
208f0 72 20 3d 20 25 73 22 2c 20 28 75 6e 73 69 67 6e  r = %s", (unsign
20900 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f  ed long) currslo
20910 74 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t, cackey_slots[
20920 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
20930 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 09 73  eader);........s
20940 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
20950 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  ..}.....}....} e
20960 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
20970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
20980 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43  econd call to SC
20990 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
209a0 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
209b0 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
209c0 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
209d0 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
209e0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
209f0 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
20a00 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
20a10 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63  ...}.....free(pc
20a20 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09  sc_readers_s);..
20a30 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
20a40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20a50 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  ("First call to 
20a60 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
20a70 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
20a80 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
20a90 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
20aa0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
20ab0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
20ac0 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
20ad0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
20ae0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
20af0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
20b00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20b10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20b20 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
20b30 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
20b40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20b50 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
20b60 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20b70 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20b80 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20b90 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  if (pSlotList ==
20ba0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
20bb0 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e  ount = slot_coun
20bc0 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  t;....CACKEY_DEB
20bd0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20be0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
20bf0 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
20c00 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74  ders, but not st
20c10 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74  oring IDs (pSlot
20c20 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20  List == NULL)", 
20c30 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65  CKR_OK, (unsigne
20c40 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75  d long) slot_cou
20c50 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
20c60 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75  KR_OK);..}...cou
20c70 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a  nt = *pulCount;.
20c80 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f  .if (count < slo
20c90 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43  t_count) {...CAC
20ca0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20cb0 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c  ("Error. User al
20cc0 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72  located %lu entr
20cd0 69 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65  ies, but we have
20ce0 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20   %lu entries.", 
20cf0 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
20d00 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
20d10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20d20 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
20d30 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09  _TOO_SMALL");...
20d40 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46  .return(CKR_BUFF
20d50 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a  ER_TOO_SMALL);..
20d60 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
20d70 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
20d80 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
20d90 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
20da0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
20db0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20dc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20dd0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
20de0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20df0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
20e00 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d  ..}...slot_idx =
20e10 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c   0;..for (currsl
20e20 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f  ot = 0; (currslo
20e30 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
20e40 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
20e50 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
20e60 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  0]))); currslot+
20e70 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b  +) {...if (!cack
20e80 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
20e90 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
20ea0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
20eb0 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d  .if (slot_idx >=
20ec0 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43   count) {....CAC
20ed0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20ee0 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c  ("Error. User al
20ef0 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72  located %lu entr
20f00 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74  ies, but we just
20f10 20 74 72 69 65 64 20 74 6f 20 77 72 69 74 65 20   tried to write 
20f20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78  to the %lu index
20f30 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63   -- ignoring", c
20f40 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b  ount, slot_idx);
20f50 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
20f60 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b  .}....pSlotList[
20f70 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72  slot_idx] = curr
20f80 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78  slot;...slot_idx
20f90 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ++;..}...mutex_r
20fa0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20fb0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
20fc0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
20fd0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
20fe0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20ff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21000 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
21010 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21020 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21030 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70  _ERROR);..}...*p
21040 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
21050 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ount;...CACKEY_D
21060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21070 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
21080 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72  i).  Found %lu r
21090 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b  eaders.", CKR_OK
210a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
210b0 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a  ) slot_count);..
210c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
210d0 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20  ...tokenPresent 
210e0 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20  = tokenPresent; 
210f0 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
21100 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
21110 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ng */.}..CK_DEFI
21120 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
21130 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f  V, C_GetSlotInfo
21140 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
21150 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46  tID, CK_SLOT_INF
21160 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
21170 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
21180 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  AR slotDescripti
21190 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53  on[] = "CACKey S
211a0 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78  lot";..int mutex
211b0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79  _retval;..int by
211c0 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43  tes_to_copy;...C
211d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
211e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
211f0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
21200 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
21210 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21220 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
21230 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
21240 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
21250 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
21260 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21270 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21280 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21290 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
212a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
212b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
212c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
212d0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
212e0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
212f0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
21300 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
21310 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
21320 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
21330 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21340 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
21350 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
21360 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
21370 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
21380 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21390 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
213a0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
213b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
213c0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
213d0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
213e0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
213f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21400 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21410 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
21420 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21430 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
21440 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
21450 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
21460 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
21470 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21480 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
21490 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
214a0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
214b0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
214c0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
214d0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
214e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
214f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
21500 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
21510 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70  INVALID);..}...p
21520 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
21530 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20  F_HW_SLOT;...if 
21540 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (!cackey_slots[s
21550 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29  lotID].internal)
21560 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
21570 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42  s |= CKF_REMOVAB
21580 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09  LE_DEVICE;..}...
21590 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
215a0 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
215b0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
215c0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  == CACKEY_PCSC_S
215d0 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
215e0 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
215f0 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45  |= CKF_TOKEN_PRE
21600 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73  SENT;..}...bytes
21610 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65  _to_copy = strle
21620 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  n(cackey_slots[s
21630 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
21640 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66  er);..if (sizeof
21650 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
21660 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f  urerID) < bytes_
21670 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74  to_copy) {...byt
21680 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a  es_to_copy = siz
21690 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
216a0 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09  acturerID);..}..
216b0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
216c0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61  nufacturerID, ca
216d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
216e0 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  D].pcsc_reader, 
216f0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a  bytes_to_copy);.
21700 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
21710 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
21720 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21730 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
21740 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
21750 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21760 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
21770 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
21780 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21790 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
217a0 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
217b0 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
217c0 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f  tion, ' ', sizeo
217d0 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  f(pInfo->slotDes
217e0 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
217f0 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  cpy(pInfo->slotD
21800 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74  escription, slot
21810 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
21820 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74  eof(slotDescript
21830 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  ion) - 1);...mem
21840 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
21850 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
21860 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
21870 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
21880 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
21890 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
218a0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
218b0 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
218c0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
218d0 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
218e0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
218f0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
21900 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
21910 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
21920 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
21930 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
21940 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
21950 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  x00;...CACKEY_DE
21960 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21970 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
21980 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
21990 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
219a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
219b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
219c0 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53  tTokenInfo)(CK_S
219d0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
219e0 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52  K_TOKEN_INFO_PTR
219f0 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
21a00 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
21a10 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
21a20 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
21a30 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
21a40 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c  TF8CHAR defaultL
21a50 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77  abel[] = "Unknow
21a60 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69  n Token";..stati
21a70 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f  c CK_UTF8CHAR mo
21a80 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b  del[] = "CAC Tok
21a90 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63  en";..struct cac
21aa0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
21ab0 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
21ac0 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  es;..unsigned lo
21ad0 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73  ng num_certs;..s
21ae0 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74  size_t label_ret
21af0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
21b00 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65  val;..int use_de
21b10 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43  fault_label;...C
21b20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21b30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
21b40 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
21b50 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
21b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21b70 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
21b80 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
21b90 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
21ba0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
21bb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21bc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21bd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21be0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21bf0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21c00 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21c10 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21c20 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
21c30 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
21c40 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
21c50 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
21c60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
21c70 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
21c80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21c90 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
21ca0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
21cb0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
21cc0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
21cd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21ce0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
21cf0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
21d00 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
21d10 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
21d20 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
21d30 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
21d40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21d50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21d60 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
21d70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21d80 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
21d90 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
21da0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
21db0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
21dc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21dd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
21de0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
21df0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
21e00 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
21e10 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
21e20 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
21e30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21e40 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
21e50 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
21e60 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
21e70 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
21e80 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
21e90 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
21ea0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
21eb0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
21ec0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21ed0 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20  RINTF("No token 
21ee0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c  is present in sl
21ef0 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f  otID = %lu", slo
21f00 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
21f10 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21f20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21f30 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
21f40 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a  N_NOT_PRESENT);.
21f50 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
21f60 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
21f70 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21f80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21f90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21fa0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21fb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21fc0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
21fd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21fe0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21ff0 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  OR);..}.../* Det
22000 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62  ermine token lab
22010 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63  el from certific
22020 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28  ates */..memset(
22030 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20  pInfo->label, ' 
22040 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
22050 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64  >label));..use_d
22060 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31  efault_label = 1
22070 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ;...if (cackey_s
22080 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
22090 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el == NULL) {...
220a0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
220b0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
220c0 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  rts(&cackey_slot
220d0 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c  s[slotID], NULL,
220e0 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09   &num_certs);...
220f0 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
22100 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
22110 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
22120 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c  > 0) {.....label
22130 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
22140 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
22150 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69  abel(pcsc_identi
22160 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62  ties, pInfo->lab
22170 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
22180 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69  ->label));.....i
22190 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30  f (label_ret > 0
221a0 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66  ) {......use_def
221b0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
221c0 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
221d0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
221e0 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
221f0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
22200 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61  .......memcpy(ca
22210 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
22220 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d  D].label, pInfo-
22230 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
22240 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
22250 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
22260 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
22270 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
22280 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a   num_certs, 1);.
22290 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
222a0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
222b0 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  bel, cackey_slot
222c0 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
222d0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
222e0 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64  abel));....use_d
222f0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
22300 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64  ;..}...if (use_d
22310 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a  efault_label) {.
22320 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
22330 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61  label, defaultLa
22340 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61  bel, sizeof(defa
22350 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a  ultLabel) - 1);.
22360 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
22370 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
22380 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
22390 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
223a0 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
223b0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
223c0 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
223d0 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
223e0 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
223f0 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
22400 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20  fo->model, ' ', 
22410 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f  sizeof(pInfo->mo
22420 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  del));..memcpy(p
22430 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64  Info->model, mod
22440 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c  el, sizeof(model
22450 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
22460 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
22470 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f  mber, ' ', sizeo
22480 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  f(pInfo->serialN
22490 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65  umber));...memse
224a0 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  t(pInfo->utcTime
224b0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
224c0 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a  nfo->utcTime));.
224d0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
224e0 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
224f0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
22500 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
22510 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
22520 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
22530 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
22540 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
22550 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
22560 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
22570 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
22580 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
22590 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
225a0 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c  x00;...pInfo->fl
225b0 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f  ags = CKF_WRITE_
225c0 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f  PROTECTED | CKF_
225d0 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c  USER_PIN_INITIAL
225e0 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e  IZED | CKF_TOKEN
225f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63  _INITIALIZED | c
22600 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
22610 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  ID].token_flags;
22620 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
22630 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c  n_command != NUL
22640 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  L) {...pInfo->fl
22650 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45  ags |= CKF_PROTE
22660 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54  CTED_AUTHENTICAT
22670 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70  ION_PATH;..}...p
22680 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69  Info->ulMaxSessi
22690 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f  onCount = (sizeo
226a0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
226b0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
226c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
226d0 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   - 1;..pInfo->ul
226e0 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43  SessionCount = C
226f0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
22700 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
22710 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f  o->ulMaxRwSessio
22720 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e  nCount = 0;..pIn
22730 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43  fo->ulRwSessionC
22740 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49  ount = CK_UNAVAI
22750 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
22760 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  N;..pInfo->ulMax
22770 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70  PinLen = 128;..p
22780 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65  Info->ulMinPinLe
22790 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75  n = 0;..pInfo->u
227a0 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f  lTotalPublicMemo
227b0 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
227c0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
227d0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50  ..pInfo->ulFreeP
227e0 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b  ublicMemory = CK
227f0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
22800 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
22810 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65  ->ulTotalPrivate
22820 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
22830 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
22840 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
22850 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79  reePrivateMemory
22860 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
22870 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a  E_INFORMATION;..
22880 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22890 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
228a0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
228b0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
228c0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
228d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
228e0 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53  K_RV, C_WaitForS
228f0 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41  lotEvent)(CK_FLA
22900 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f  GS flags, CK_SLO
22910 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44  T_ID_PTR pSlotID
22920 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52  , CK_VOID_PTR pR
22930 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b  eserved) {..CACK
22940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22950 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22960 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e   (pReserved != N
22970 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
22980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22990 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
229a0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
229b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
229c0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
229d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
229e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
229f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22a00 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22a10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22a20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22a30 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22a40 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a  ALIZED);..}.../*
22a50 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c   XXX: TODO: Impl
22a60 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f  ement this... */
22a70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22a80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22a90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22aa0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
22ab0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
22ac0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22ad0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
22ae0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22af0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
22b00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22b10 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
22b20 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49  mList)(CK_SLOT_I
22b30 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
22b40 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20  HANISM_TYPE_PTR 
22b50 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20  pMechanismList, 
22b60 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
22b70 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59  Count) {..CACKEY
22b80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
22b90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
22ba0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22bb0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22bc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22bd0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22be0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22bf0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22c00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22c10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43  );..}...if (pulC
22c20 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
22c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22c40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
22c50 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ulCount is NULL.
22c60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22c70 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
22c80 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
22c90 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c  anismList == NUL
22ca0 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74  L) {...*pulCount
22cb0 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   = 1;....CACKEY_
22cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22cd0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22ce0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
22cf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
22d00 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43  ;..}...if (*pulC
22d10 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41  ount < 1) {...CA
22d20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22d30 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65  F("Error.  Buffe
22d40 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a  r too small.");.
22d50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55  ...return(CKR_BU
22d60 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b  FFER_TOO_SMALL);
22d70 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d  ..}...pMechanism
22d80 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53  List[0] = CKM_RS
22d90 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75  A_PKCS;..*pulCou
22da0 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59  nt = 1;...CACKEY
22db0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22dc0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
22dd0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
22de0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
22df0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22e00 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22e10 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
22e20 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
22e30 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  otID, CK_MECHANI
22e40 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b  SM_TYPE type, CK
22e50 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f  _MECHANISM_INFO_
22e60 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e  PTR pInfo) {..in
22e70 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
22e80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22e90 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22ea0 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
22eb0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
22ec0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22ed0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
22ee0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
22ef0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
22f00 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
22f10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22f20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22f30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22f40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22f50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22f60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22f70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22f80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
22f90 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
22fa0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
22fb0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
22fc0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
22fd0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
22fe0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22ff0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
23000 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23010 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
23020 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
23030 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
23040 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
23050 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
23060 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23070 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
23080 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
23090 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
230a0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
230b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
230c0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
230d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
230e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
230f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
23100 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23110 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
23120 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23130 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23140 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
23150 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
23160 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
23170 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
23180 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
23190 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
231a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
231b0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
231c0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
231d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
231e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
231f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23200 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
23210 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
23220 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23230 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
23240 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
23250 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23260 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
23270 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74  ;..}...switch (t
23280 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ype) {...case CK
23290 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70  M_RSA_PKCS:....p
232a0 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69  Info->ulMinKeySi
232b0 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e  ze = 512;....pIn
232c0 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65  fo->ulMaxKeySize
232d0 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66   = 8192;....pInf
232e0 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48  o->flags = CKF_H
232f0 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20  W | CKF_ENCRYPT 
23300 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20  | CKF_DECRYPT | 
23310 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56  CKF_SIGN | CKF_V
23320 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b  ERIFY;....break;
23330 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
23340 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23350 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
23360 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
23370 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
23380 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70  ./* We don't sup
23390 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64  port this method
233a0 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
233b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
233c0 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53  _InitToken)(CK_S
233d0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
233e0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
233f0 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
23400 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43  PinLen, CK_UTF8C
23410 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20  HAR_PTR pLabel) 
23420 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
23430 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
23440 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
23450 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
23460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
23480 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
23490 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
234a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
234b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
234c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
234d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
234e0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
234f0 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c  PROTECTED (%i)",
23500 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
23510 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72  _PROTECTED);...r
23520 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
23530 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
23540 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
23550 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
23560 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
23570 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23580 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b  V, C_InitPIN)(CK
23590 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
235a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
235b0 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
235c0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
235d0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
235e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
235f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23600 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23610 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23620 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23630 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23640 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23650 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23660 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23670 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
23680 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23690 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ng CKR_TOKEN_WRI
236a0 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69  TE_PROTECTED (%i
236b0 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  )", CKR_TOKEN_WR
236c0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
236d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
236e0 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
236f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
23700 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23710 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53  , C_SetPIN)(CK_S
23720 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23730 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
23740 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c  HAR_PTR pOldPin,
23750 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50   CK_ULONG ulOldP
23760 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48  inLen, CK_UTF8CH
23770 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20  AR_PTR pNewPin, 
23780 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69  CK_ULONG ulNewPi
23790 6e 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20 6f 6c  nLen) {..char ol
237a0 64 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e 65 77  dpinbuf[64], new
237b0 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63 61 63  pinbuf[64];..cac
237c0 6b 65 79 5f 72 65 74 20 73 65 74 5f 70 69 6e 5f  key_ret set_pin_
237d0 72 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72 65 74  ret, get_pin_ret
237e0 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ;..CK_SLOT_ID sl
237f0 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78  otID;..int mutex
23800 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
23810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23820 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23830 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
23840 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23860 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
23870 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
23880 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
23890 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
238a0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
238b0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
238c0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
238d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
238e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
238f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23900 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23910 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
23920 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23930 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23940 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
23950 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23960 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
23970 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
23980 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23990 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
239a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
239b0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
239c0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
239d0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
239e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
239f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
23a00 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
23a10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23a20 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
23a30 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
23a40 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
23a50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
23a60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23a70 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
23a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23a90 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
23aa0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23ab0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
23ac0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
23ad0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
23ae0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
23af0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23b00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23b10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23b20 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
23b30 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
23b40 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
23b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23b60 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
23b70 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
23b80 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
23b90 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
23ba0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
23bb0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23bc0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23bd0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
23be0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23bf0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
23c00 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
23c10 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20  != NULL) {.../* 
23c20 47 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f 0a 09  Get old PIN */..
23c30 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63  .get_pin_ret = c
23c40 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6f 6c  ackey_get_pin(ol
23c50 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20  dpinbuf);....if 
23c60 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20  (get_pin_ret != 
23c70 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
23c80 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
23c90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23ca0 72 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20  r while getting 
23cb0 4f 6c 64 20 50 49 4e 2c 20 72 65 74 75 72 6e 69  Old PIN, returni
23cc0 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  ng CKR_PIN_INCOR
23cd0 52 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63 61 63  RECT.");.....cac
23ce0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
23cf0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23d00 3b 0a 09 09 09 0a 09 09 09 72 65 74 75 72 6e 28  ;........return(
23d10 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
23d20 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c 64 50  T);...}....pOldP
23d30 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41  in = (CK_UTF8CHA
23d40 52 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62 75 66  R_PTR) oldpinbuf
23d50 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20  ;...ulOldPinLen 
23d60 3d 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69 6e 62  = strlen(oldpinb
23d70 75 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74 20 6e  uf);..../* Get n
23d80 65 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74 5f  ew PIN */...get_
23d90 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  pin_ret = cackey
23da0 5f 67 65 74 5f 70 69 6e 28 6e 65 77 70 69 6e 62  _get_pin(newpinb
23db0 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f  uf);....if (get_
23dc0 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  pin_ret != CACKE
23dd0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
23de0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23df0 52 49 4e 54 46 28 22 45 72 72 6f 72 20 77 68 69  RINTF("Error whi
23e00 6c 65 20 67 65 74 74 69 6e 67 20 4e 65 77 20 50  le getting New P
23e10 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20 43 4b  IN, returning CK
23e20 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e 22 29  R_PIN_INVALID.")
23e30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  ;.....cackey_mut
23e40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23e50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09  _biglock);......
23e60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e  ..return(CKR_PIN
23e70 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d 0a 0a  _INVALID);...}..
23e80 09 09 70 4e 65 77 50 69 6e 20 3d 20 28 43 4b 5f  ..pNewPin = (CK_
23e90 55 54 46 38 43 48 41 52 5f 50 54 52 29 20 6e 65  UTF8CHAR_PTR) ne
23ea0 77 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e 65 77  wpinbuf;...ulNew
23eb0 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  PinLen = strlen(
23ec0 6e 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a  newpinbuf);..}..
23ed0 09 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d 3d 20  .if (pOldPin == 
23ee0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
23ef0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
23f00 6c 64 20 50 49 4e 20 76 61 6c 75 65 20 69 73 20  ld PIN value is 
23f10 77 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22 29 3b  wrong (null).");
23f20 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
23f30 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23f40 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
23f50 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
23f60 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RECT);..}...if (
23f70 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d 20 30  ulOldPinLen == 0
23f80 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20   || ulOldPinLen 
23f90 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  > 8) {...CACKEY_
23fa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c  DEBUG_PRINTF("Ol
23fb0 64 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20  d PIN length is 
23fc0 77 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20 28 75  wrong: %lu.", (u
23fd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
23fe0 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63  OldPinLen);....c
23ff0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24000 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24010 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
24020 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
24030 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65 77 50  ;..}...if (pNewP
24040 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  in == NULL) {...
24050 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24060 4e 54 46 28 22 4e 65 77 20 50 49 4e 20 76 61 6c  NTF("New PIN val
24070 75 65 20 69 73 20 77 72 6f 6e 67 20 28 65 69 74  ue is wrong (eit
24080 68 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74 6f 6f  her NULL, or too
24090 20 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22 29 3b   long/short).");
240a0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
240b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
240c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
240d0 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c  rn(CKR_PIN_INVAL
240e0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  ID);..}...if (ul
240f0 4e 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20 7c 7c  NewPinLen < 5 ||
24100 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e 20 38   ulNewPinLen > 8
24110 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24120 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50  UG_PRINTF("New P
24130 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77 72 6f  IN length is wro
24140 6e 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20 62 65  ng: %lu, must be
24150 20 61 74 6c 65 61 73 74 20 35 20 61 6e 64 20 6e   atleast 5 and n
24160 6f 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e 22 2c  o more than 8.",
24170 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
24180 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a   ulNewPinLen);..
24190 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
241a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
241b0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
241c0 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52 41 4e  (CKR_PIN_LEN_RAN
241d0 47 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f 70 69  GE);..}...set_pi
241e0 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  n_ret = cackey_s
241f0 65 74 5f 70 69 6e 28 26 63 61 63 6b 65 79 5f 73  et_pin(&cackey_s
24200 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 4f  lots[slotID], pO
24210 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69 6e 4c  ldPin, ulOldPinL
24220 65 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75 6c 4e  en, pNewPin, ulN
24230 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69 66 20  ewPinLen);...if 
24240 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20  (set_pin_ret != 
24250 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
24260 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
24270 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
24280 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65  NULL) {....cacke
24290 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
242a0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
242b0 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
242c0 44 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65  D;...}....if (se
242d0 74 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  t_pin_ret == CAC
242e0 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
242f0 44 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  D) {....cackey_s
24300 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
24310 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
24320 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b  USER_PIN_LOCKED;
24330 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
24340 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
24350 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
24360 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
24370 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
24380 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
24390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
243a0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
243b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
243c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
243d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
243e0 77 69 74 63 68 20 28 73 65 74 5f 70 69 6e 5f 72  witch (set_pin_r
243f0 65 74 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43  et) {...case CAC
24400 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a 0a 09  KEY_PCSC_S_OK:..
24410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24420 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75  RINTF("Successfu
24430 6c 6c 79 20 73 65 74 20 50 49 4e 2e 22 29 3b 0a  lly set PIN.");.
24440 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
24450 4b 29 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  K);...case CACKE
24460 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 3a  Y_PCSC_E_BADPIN:
24470 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
24480 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 77 61 73  _PRINTF("PIN was
24490 20 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a 09 09   invalid.");....
244a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
244b0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61 73 65  INVALID);...case
244c0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c   CACKEY_PCSC_E_L
244d0 4f 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b 45 59  OCKED:....CACKEY
244e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
244f0 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 20 6f  oken is locked o
24500 72 20 74 68 69 73 20 63 68 61 6e 67 65 20 69 73  r this change is
24510 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 22   not permitted."
24520 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
24530 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09  R_PIN_LOCKED);..
24540 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43  .default:....CAC
24550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24560 28 22 53 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65  ("Something else
24570 20 77 65 6e 74 20 77 72 6f 6e 67 20 63 68 61 6e   went wrong chan
24580 67 69 6e 67 20 74 68 65 20 50 49 4e 3a 20 25 69  ging the PIN: %i
24590 22 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74 29 3b  ", set_pin_ret);
245a0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
245b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
245c0 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  .}...return(CKR_
245d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
245e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
245f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f  CTION(CK_RV, C_O
24600 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  penSession)(CK_S
24610 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
24620 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
24630 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
24640 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49  ication, CK_NOTI
24650 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45  FY notify, CK_SE
24660 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52  SSION_HANDLE_PTR
24670 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75   phSession) {..u
24680 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78  nsigned long idx
24690 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
246a0 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f  val;..int found_
246b0 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43  session = 0;...C
246c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
246d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
246e0 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b  .if ((flags & CK
246f0 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
24700 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f  ) != CKF_SERIAL_
24710 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74  SESSION) {...ret
24720 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
24730 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50  PARALLEL_NOT_SUP
24740 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  PORTED);..}...if
24750 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24760 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24770 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24780 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24790 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
247a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
247b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
247c0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
247d0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
247e0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
247f0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
24800 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
24810 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
24820 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24830 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
24840 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
24850 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
24860 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
24870 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
24880 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
24890 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
248a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
248b0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
248c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
248d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
248e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
248f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24900 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
24910 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
24920 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24930 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
24940 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
24950 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
24960 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
24970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24980 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
24990 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
249a0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
249b0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
249c0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
249d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
249e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
249f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
24a00 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
24a10 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
24a20 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61  at the card is a
24a30 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73  ctually in the s
24a40 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a  lot. */../* XXX:
24a50 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
24a60 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74  ure this is in t
24a70 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69  he PKCS#11 speci
24a80 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  fication */..if 
24a90 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
24aa0 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
24ab0 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
24ac0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
24ad0 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
24ae0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24af0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72  NTF("Error.  Car
24b00 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20  d not present.  
24b10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45  Returning CKR_DE
24b20 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a  VICE_REMOVED");.
24b30 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24b40 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24b50 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
24b60 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  n(CKR_DEVICE_REM
24b70 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  OVED);..}...for 
24b80 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20  (idx = 1; idx < 
24b90 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
24ba0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
24bb0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
24bc0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
24bd0 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
24be0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
24bf0 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f  ive) {....found_
24c00 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09  session = 1;....
24c10 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64  .*phSession = id
24c20 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  x;.....cackey_se
24c30 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
24c40 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65  ve = 1;....cacke
24c50 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24c60 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b  slotID = slotID;
24c70 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24c80 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d  ons[idx].state =
24c90 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
24ca0 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65  ESSION;....cacke
24cb0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24cc0 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09  flags = flags;..
24cd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
24ce0 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45  s[idx].ulDeviceE
24cf0 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63  rror = 0;....cac
24d00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
24d10 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d  ].pApplication =
24d20 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09   pApplication;..
24d30 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
24d40 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20  s[idx].Notify = 
24d50 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b  notify;.....cack
24d60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
24d70 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
24d80 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  LL;....cackey_se
24d90 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
24da0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
24db0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
24dc0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63  sions[idx].searc
24dd0 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
24de0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
24df0 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69  s[idx].sign_acti
24e00 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
24e10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
24e20 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
24e30 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
24e40 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
24e50 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
24e60 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
24e70 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
24e80 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
24e90 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
24ea0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
24eb0 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
24ec0 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
24ed0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24ee0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24ef0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
24f00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
24f10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
24f20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24f30 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
24f40 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
24f50 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24f60 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
24f70 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20  !found_session) 
24f80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24f90 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24fa0 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ng CKR_SESSION_C
24fb0 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f  OUNT (%i)", CKR_
24fc0 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
24fd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
24fe0 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d  SSION_COUNT);..}
24ff0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25000 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25010 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
25020 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
25030 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
25040 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25050 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53  (CK_RV, C_CloseS
25060 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  ession)(CK_SESSI
25070 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
25080 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  on) {..int mutex
25090 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
250a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
250b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
250c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
250d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
250e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
250f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
25100 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
25110 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
25120 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
25130 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
25140 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
25150 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
25160 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25170 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
25180 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
25190 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
251a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
251b0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
251c0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
251d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
251e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
251f0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
25200 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25210 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
25220 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
25230 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
25240 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
25250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25260 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
25270 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
25280 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25290 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
252a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
252b0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
252c0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
252d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
252e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
252f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25300 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
25310 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
25320 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
25330 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
25340 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
25350 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25360 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
25370 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72   = 0;..cackey_fr
25380 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
25390 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
253a0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
253b0 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
253c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
253d0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
253e0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
253f0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
25400 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25410 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
25420 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
25430 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25440 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25450 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
25460 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25470 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25480 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
25490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
254a0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
254b0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
254c0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
254d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
254e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
254f0 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29  loseAllSessions)
25500 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
25510 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  ID) {..uint32_t 
25520 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
25530 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
25540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
25550 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
25560 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
25570 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
25580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25590 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
255a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
255b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
255c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
255d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
255e0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
255f0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
25600 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
25610 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
25620 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
25630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25640 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
25650 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
25660 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
25670 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
25680 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
25690 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
256a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
256b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
256c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
256d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
256e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
256f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
25700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25710 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
25720 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
25730 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25740 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
25750 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
25760 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
25770 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25780 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25790 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
257a0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
257b0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
257c0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
257d0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
257e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
257f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25800 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
25810 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
25820 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
25830 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
25840 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
25850 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
25860 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
25870 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
25880 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
25890 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69  ].active) {....i
258a0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
258b0 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21  ns[idx].slotID !
258c0 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09  = slotID) {.....
258d0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
258e0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
258f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25900 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f  glock);....C_Clo
25910 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
25920 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
25930 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25940 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ock);...}..}...m
25950 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
25960 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25970 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25980 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25990 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
259a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
259b0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
259c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
259d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
259e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
259f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25a00 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25a10 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
25a20 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
25a30 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
25a40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25a50 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65  N(CK_RV, C_GetSe
25a60 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45  ssionInfo)(CK_SE
25a70 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25a80 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f  ssion, CK_SESSIO
25a90 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
25aa0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
25ab0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
25ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25ad0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
25ae0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
25af0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25b00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
25b10 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
25b20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
25b30 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
25b40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
25b50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
25b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
25b80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
25b90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
25ba0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
25bb0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
25bc0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
25bd0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
25be0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
25bf0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
25c00 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25c10 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
25c20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25c30 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
25c40 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
25c50 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
25c60 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
25c70 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
25c80 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
25c90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
25ca0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25cb0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
25cc0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
25cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25ce0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
25cf0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
25d00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25d10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
25d20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
25d30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25d40 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
25d50 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25d60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25d70 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25d80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25d90 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
25da0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
25db0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
25dc0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
25dd0 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f  ..}...pInfo->slo
25de0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
25df0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25e00 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e  slotID;..pInfo->
25e10 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73  state = cackey_s
25e20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25e30 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d  ].state;..pInfo-
25e40 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f  >flags = cackey_
25e50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25e60 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f  n].flags;..pInfo
25e70 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20  ->ulDeviceError 
25e80 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
25e90 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65  s[hSession].ulDe
25ea0 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74  viceError;...mut
25eb0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
25ec0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25ed0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25ee0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
25ef0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25f00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25f10 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
25f20 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
25f30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
25f40 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
25f50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25f60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25f70 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
25f80 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
25f90 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
25fa0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25fb0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72  CK_RV, C_GetOper
25fc0 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
25fd0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25fe0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
25ff0 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
26000 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ate, CK_ULONG_PT
26010 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  R pulOperationSt
26020 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ateLen) {..CACKE
26030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26040 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26050 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26060 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26070 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26080 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26090 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
260a0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
260b0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
260c0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
260d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
260e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
260f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26100 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
26110 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26120 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
26130 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26140 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
26150 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26160 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f  ON(CK_RV, C_SetO
26170 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
26180 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
26190 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
261a0 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
261b0 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
261c0 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74   ulOperationStat
261d0 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  eLen, CK_OBJECT_
261e0 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69  HANDLE hEncrypti
261f0 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  onKey, CK_OBJECT
26200 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74  _HANDLE hAuthent
26210 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43  icationKey) {..C
26220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26230 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26240 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26250 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26270 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26280 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26290 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
262a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
262b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
262c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
262d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
262e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
262f0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26300 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26310 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26320 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
26330 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26340 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26350 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 5f 43  NCTION(CK_RV, _C
26360 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 29 28  _LoginMutexArg)(
26370 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26380 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
26390 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70  SER_TYPE userTyp
263a0 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  e, CK_UTF8CHAR_P
263b0 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
263c0 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20  G ulPinLen, int 
263d0 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43  lock_mutex) {..C
263e0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
263f0 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 67 65  ;..cackey_ret ge
26400 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 63 68 61 72  t_pin_ret;..char
26410 20 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 69 6e   pinbuf[64];..in
26420 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
26430 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
26440 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e  ning;..int login
26450 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
26460 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26470 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
26480 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
26490 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
264a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
264b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
264c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
264d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
264e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
264f0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
26500 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
26510 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
26520 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
26530 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
26540 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
26550 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26560 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26570 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
26580 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
26590 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
265a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
265b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
265c0 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
265d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
265e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
265f0 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
26600 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
26610 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
26620 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
26630 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
26640 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
26650 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
26660 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  }...if (lock_mut
26670 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65  ex) {...mutex_re
26680 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
26690 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
266a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28  biglock);...if (
266b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
266c0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....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 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
266f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  led.");.....retu
26700 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
26710 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  RROR);...}..}...
26720 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
26730 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
26740 63 74 69 76 65 29 20 7b 0a 09 09 69 66 20 28 6c  ctive) {...if (l
26750 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
26760 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26770 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26780 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  ck);...}....CACK
26790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
267a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
267b0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
267c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
267d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
267e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
267f0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
26800 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26810 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
26820 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
26830 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
26840 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
26850 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
26860 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
26870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26880 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
26890 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
268a0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
268b0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
268c0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28  slotID);....if (
268d0 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
268e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
268f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26900 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74  ock);...}....ret
26910 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26920 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
26930 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
26940 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
26950 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26960 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26970 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
26980 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
26990 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
269a0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
269b0 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63  tID);....if (loc
269c0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
269d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
269e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
269f0 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
26a00 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26a10 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
26a20 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
26a30 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
26a40 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c 29 20   (pPin != NULL) 
26a50 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
26a60 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 65 63  G_PRINTF("Protec
26a70 74 65 64 20 61 75 74 68 65 6e 74 69 63 61 74 69  ted authenticati
26a80 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66 65 63  on path in effec
26a90 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76 69 64  t and PIN provid
26aa0 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09 09  ed !?");...}....
26ab0 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61  get_pin_ret = ca
26ac0 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 70 69 6e  ckey_get_pin(pin
26ad0 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74  buf);....if (get
26ae0 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  _pin_ret != CACK
26af0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
26b00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26b10 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 67  PRINTF("cackey_g
26b20 65 74 5f 70 69 6e 28 29 20 72 65 74 75 72 6e 65  et_pin() returne
26b30 64 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 61 73  d in failure, as
26b40 73 75 6d 69 6e 67 20 74 68 65 20 50 49 4e 20 77  suming the PIN w
26b50 61 73 20 69 6e 63 6f 72 72 65 63 74 2e 22 29 3b  as incorrect.");
26b60 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75  .....if (lock_mu
26b70 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  tex) {.....cacke
26b80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26b90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26ba0 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
26bb0 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
26bc0 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 50 69 6e 20  T);...}....pPin 
26bd0 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  = (CK_UTF8CHAR_P
26be0 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09 75 6c  TR) pinbuf;...ul
26bf0 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  PinLen = strlen(
26c00 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f  pinbuf);..}...lo
26c10 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  gin_ret = cackey
26c20 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73  _login(&cackey_s
26c30 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50  lots[slotID], pP
26c40 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74  in, ulPinLen, &t
26c50 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 2c 20  ries_remaining, 
26c60 33 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72  3);..if (login_r
26c70 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
26c80 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28  C_S_OK) {...if (
26c90 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
26ca0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
26cb0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26cc0 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  ock);...}....if 
26cd0 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
26ce0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
26cf0 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ED) {....CACKEY_
26d00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26d10 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c  ror.  Token is l
26d20 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61  ocked.");.....ca
26d30 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
26d40 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
26d50 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c  = CKF_USER_PIN_L
26d60 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45  OCKED;.....CACKE
26d70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26d80 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49  Returning CKR_PI
26d90 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c 20  N_LOCKED (%i)", 
26da0 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f  (int) CKR_PIN_LO
26db0 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72  CKED);.....retur
26dc0 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  n(CKR_PIN_LOCKED
26dd0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28  );...} else if (
26de0 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  login_ret == CAC
26df0 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
26e00 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  N) {....CACKEY_D
26e10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26e20 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e  or.  Invalid PIN
26e30 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
26e40 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
26e50 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
26e60 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f  _USER_PIN_COUNT_
26e70 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69  LOW;.....if (tri
26e80 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  es_remaining == 
26e90 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  1) {.....cackey_
26ea0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
26eb0 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
26ec0 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
26ed0 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  TRY;....}.....CA
26ee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26ef0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
26f00 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28  _PIN_INCORRECT (
26f10 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f  %i)", (int) CKR_
26f20 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
26f30 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
26f40 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09  IN_INCORRECT);..
26f50 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
26f60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26f70 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  .  Unknown error
26f80 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63   returned from c
26f90 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25  ackey_login() (%
26fa0 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b  i)", login_ret);
26fb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
26fc0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
26fd0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  }...cackey_slots
26fe0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
26ff0 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53  lags &= ~(CKF_US
27000 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20  ER_PIN_LOCKED | 
27010 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55  CKF_USER_PIN_COU
27020 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47  NT_LOW | CKF_LOG
27030 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b  IN_REQUIRED | CK
27040 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c  F_USER_PIN_FINAL
27050 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  _TRY);...cackey_
27060 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27070 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  n].state = CKS_R
27080 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53  O_USER_FUNCTIONS
27090 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ;...if (lock_mut
270a0 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65  ex) {...mutex_re
270b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
270c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
270d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66  y_biglock);...if
270e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
270f0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
27100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27110 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
27120 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
27130 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
27140 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09  AL_ERROR);...}..
27150 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27160 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27170 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
27180 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
27190 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
271a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
271b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e  N(CK_RV, C_Login
271c0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
271d0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
271e0 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54  _USER_TYPE userT
271f0 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ype, CK_UTF8CHAR
27200 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
27210 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
27220 09 72 65 74 75 72 6e 28 5f 43 5f 4c 6f 67 69 6e  .return(_C_Login
27230 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f  MutexArg(hSessio
27240 6e 2c 20 75 73 65 72 54 79 70 65 2c 20 70 50 69  n, userType, pPi
27250 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31 29 29  n, ulPinLen, 1))
27260 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
27270 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
27280 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53  _Logout)(CK_SESS
27290 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
272a0 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  ion) {..CK_SLOT_
272b0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20  ID slotID;..int 
272c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
272d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
272e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
272f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
27300 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
27310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27320 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
27330 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
27340 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27350 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27360 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
27370 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
27380 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
27390 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
273a0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
273b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
273c0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
273d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
273e0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
273f0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
27400 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
27410 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
27420 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
27430 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
27440 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
27450 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27460 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
27470 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
27480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27490 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
274a0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
274b0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
274c0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
274d0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
274e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
274f0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
27500 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27510 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27520 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27530 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27540 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
27550 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
27560 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
27570 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
27580 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
27590 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
275a0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
275b0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
275c0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
275d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
275e0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
275f0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
27600 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27610 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27620 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
27630 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
27640 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
27650 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
27660 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
27670 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
27680 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
27690 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
276a0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
276b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
276c0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
276d0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
276e0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
276f0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
27700 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
27710 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27720 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27730 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
27740 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27750 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
27760 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27770 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
27780 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a  PUBLIC_SESSION;.
27790 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
277a0 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c  _command == NULL
277b0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ) {...cackey_slo
277c0 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
277d0 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
277e0 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20  IN_REQUIRED;..} 
277f0 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f  else {...cackey_
27800 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
27810 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
27820 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
27830 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
27840 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
27850 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
27860 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27870 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27880 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27890 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
278a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
278b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
278c0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
278d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
278e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
278f0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
27900 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
27910 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27920 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27930 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b  CreateObject)(CK
27940 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
27950 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
27960 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
27970 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
27980 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
27990 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
279a0 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
279b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
279c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
279d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
279e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
279f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27a00 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
27a10 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
27a20 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27a30 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27a40 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
27a50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27a60 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
27a70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27a80 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
27a90 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27aa0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
27ab0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27ac0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
27ad0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27ae0 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f  N(CK_RV, C_CopyO
27af0 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
27b00 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
27b10 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
27b20 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
27b30 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
27b40 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
27b50 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
27b60 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
27b70 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09  phNewObject) {..
27b80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27b90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
27ba0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
27bb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
27bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27bd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
27be0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
27bf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27c00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27c10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
27c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27c30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
27c40 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27c50 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
27c60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27c70 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
27c80 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
27c90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
27ca0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
27cb0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
27cc0 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28  _DestroyObject)(
27cd0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27ce0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
27cf0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
27d00 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
27d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27d20 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27d30 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27d40 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27d60 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27d70 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27d80 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27d90 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27da0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
27db0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27dc0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
27dd0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
27de0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
27df0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27e00 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
27e10 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27e20 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
27e30 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27e40 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a  (CK_RV, C_GetObj
27e50 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53  ectSize)(CK_SESS
27e60 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27e70 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
27e80 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
27e90 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
27ea0 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ize) {..CACKEY_D
27eb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27ec0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27ed0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27ee0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27ef0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27f00 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
27f10 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27f20 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27f30 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27f40 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
27f50 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
27f60 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
27f70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
27f80 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
27f90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27fa0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
27fb0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27fc0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
27fd0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
27fe0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72  CK_RV, C_GetAttr
27ff0 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
28000 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
28010 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
28020 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
28030 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
28040 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
28050 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
28060 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  {..CK_ATTRIBUTE 
28070 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72  *curr_attr;..str
28080 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
28090 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09  ity *identity;..
280a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
280b0 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72  entity_idx, attr
280c0 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f  _idx, sess_attr_
280d0 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69  idx, num_ids;..i
280e0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
280f0 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
28100 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49   CKR_OK;..CK_VOI
28110 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
28120 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
28130 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  en;...CACKEY_DEB
28140 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
28150 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
28160 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28170 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28180 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28190 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
281a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
281b0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
281c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
281d0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
281e0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
281f0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
28200 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
28210 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
28220 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
28230 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28240 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
28250 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
28260 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
28270 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28280 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28290 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74  .}...if (hObject
282a0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
282b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
282c0 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
282d0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
282e0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
282f0 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
28300 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28310 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  }...if (ulCount 
28320 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
28330 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a  rt circuit, if z
28340 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65  ero objects were
28350 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72   specified retur
28360 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d  n zero items imm
28370 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41  ediately */...CA
28380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28390 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
283a0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
283b0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
283c0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
283d0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
283e0 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c  pTemplate == NUL
283f0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
28400 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28410 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  r.  pTemplate is
28420 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
28430 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
28440 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  S_BAD);..}...ide
28450 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a  ntity_idx = hObj
28460 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78  ect - 1;...mutex
28470 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28480 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
28490 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
284a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
284b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
284c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
284d0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
284e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
284f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28500 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
28510 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28520 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
28530 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28540 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28550 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28570 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
28580 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
28590 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
285a0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
285b0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
285c0 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65  .num_ids = cacke
285d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
285e0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
285f0 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65  count;...if (ide
28600 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d  ntity_idx >= num
28610 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79  _ids) {...cackey
28620 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
28630 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
28640 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28650 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
28660 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
28670 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e   of range.  iden
28680 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20  tity_idx = %lu, 
28690 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c  num_ids = %lu.",
286a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
286b0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28   identity_idx, (
286c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e  unsigned long) n
286d0 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75  um_ids);....retu
286e0 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
286f0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28700 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26  }...identity = &
28710 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28720 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
28730 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64  ties[identity_id
28740 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f  x];...for (attr_
28750 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
28760 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74  x < ulCount; att
28770 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  r_idx++) {...cur
28780 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c  r_attr = &pTempl
28790 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  ate[attr_idx];..
287a0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
287b0 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
287c0 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09  (CK_LONG) -1;...
287d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
287e0 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f  INTF("Looking fo
287f0 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30  r attribute 0x%0
28800 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c  8lx (identity:%l
28810 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  u) ...", (unsign
28820 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
28830 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67  tr->type, (unsig
28840 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
28850 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20  ty_idx);....for 
28860 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d  (sess_attr_idx =
28870 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64   0; sess_attr_id
28880 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  x < identity->at
28890 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
288a0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
288b0 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69   {....if (identi
288c0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
288d0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79  ess_attr_idx].ty
288e0 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d  pe == curr_attr-
288f0 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43  >type) {.....CAC
28900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28910 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c  (" ... found it,
28920 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c   pValue = %p, ul
28930 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c  ValueLen = %lu",
28940 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
28950 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
28960 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65  idx].pValue, ide
28970 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
28980 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
28990 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
289a0 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
289b0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
289c0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
289d0 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09  dx].pValue;.....
289e0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65  ulValueLen = ide
289f0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
28a00 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
28a10 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  .ulValueLen;....
28a20 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72  }...}....if (cur
28a30 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26  r_attr->pValue &
28a40 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69  & pValue) {....i
28a50 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  f (curr_attr->ul
28a60 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61  ValueLen >= ulVa
28a70 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65  lueLen) {.....me
28a80 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e  mcpy(curr_attr->
28a90 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
28aa0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
28ab0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56  } else {.....ulV
28ac0 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
28ad0 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74  NG) -1;......ret
28ae0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
28af0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
28b00 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74  ...}....curr_att
28b10 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  r->ulValueLen = 
28b20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a  ulValueLen;..}..
28b30 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
28b40 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28b50 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28b60 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
28b70 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
28b80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28b90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
28ba0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
28bb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28bc0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28bd0 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ..}...if (retval
28be0 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54   == CKR_ATTRIBUT
28bf0 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20  E_TYPE_INVALID) 
28c00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28c10 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28c20 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  ng CKR_ATTRIBUTE
28c30 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25  _TYPE_INVALID (%
28c40 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
28c50 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  l);..} else if (
28c60 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55  retval == CKR_BU
28c70 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
28c80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28c90 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28ca0 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  ng CKR_BUFFER_TO
28cb0 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28  O_SMALL (%i)", (
28cc0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
28cd0 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
28ce0 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
28cf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28d00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28d10 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e  KR_OK (%i)", (in
28d20 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
28d30 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  lse {...CACKEY_D
28d40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
28d50 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
28d60 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  ) retval);..}...
28d70 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
28d80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
28d90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
28da0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
28db0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28dc0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28dd0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
28de0 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
28df0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
28e00 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
28e10 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
28e20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
28e30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
28e40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
28e50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
28e60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28e70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
28e80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
28e90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
28ea0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
28eb0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
28ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
28ed0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
28ee0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28ef0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
28f00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28f10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
28f20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28f30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
28f40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
28f50 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
28f60 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45  jectsInit)(CK_SE
28f70 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
28f80 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
28f90 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
28fa0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
28fb0 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  unt) {..CK_SLOT_
28fc0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55  ID slotID;..CK_U
28fd0 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d  LONG idx;..int m
28fe0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
28ff0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29000 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29010 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29020 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
29030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29040 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
29050 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
29060 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
29070 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
29080 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
29090 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
290a0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
290b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
290c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
290d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
290e0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
290f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29100 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
29110 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
29120 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
29130 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
29140 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
29150 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
29160 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
29170 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29180 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
29190 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
291a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
291b0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
291c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
291d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
291e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
291f0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
29200 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
29210 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
29220 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29230 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29240 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29250 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
29260 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
29270 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29280 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
29290 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
292a0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
292b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
292c0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
292d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
292e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
292f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
29300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29310 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
29320 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
29330 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
29340 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
29350 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  TIVE);..}...slot
29360 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
29370 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29380 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
29390 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
293a0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
293b0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
293c0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
293d0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
293e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
293f0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
29400 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
29410 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
29420 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
29430 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
29440 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
29450 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
29460 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
29470 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
29480 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29490 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
294a0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
294b0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
294c0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
294d0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
294e0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
294f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
29500 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
29510 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29520 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
29530 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
29540 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
29550 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
29560 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20  BUG_PRINTF("The 
29570 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65  slot has been re
29580 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73  set since we las
29590 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65  t looked for ide
295a0 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61  ntities -- resca
295b0 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28  nning");....if (
295c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
295d0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
295e0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
295f0 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ...cackey_free_i
29600 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
29610 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29620 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
29630 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29640 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
29650 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
29660 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
29670 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
29680 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
29690 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
296a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
296b0 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
296c0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
296d0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
296e0 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  .label != NULL) 
296f0 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
29700 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
29710 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79  abel);....cackey
29720 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
29730 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
29740 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
29750 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b  slot_reset(&cack
29760 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
29770 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  );...cackey_slot
29780 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
29790 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  eset = 0;..}...i
297a0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
297b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
297c0 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29  ntities == NULL)
297d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
297e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
297f0 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
29800 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
29810 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
29820 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
29830 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29840 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
29850 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  count);..}...if 
29860 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55  (pTemplate != NU
29870 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  LL) {...if (ulCo
29880 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
29890 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
298a0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
298b0 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c  query_count = ul
298c0 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79  Count;....cackey
298d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
298e0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
298f0 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e   = malloc(ulCoun
29900 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
29910 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d  plate));.....mem
29920 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
29930 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
29940 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d  arch_query, pTem
29950 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a  plate, ulCount *
29960 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
29970 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64  te));....for (id
29980 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43  x = 0; idx < ulC
29990 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
299a0 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
299b0 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
299c0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61   == 0) {......ca
299d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
299e0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
299f0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
29a00 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63   = NULL;.......c
29a10 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a  ontinue;.....}..
29a20 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
29a30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
29a40 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
29a50 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
29a60 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
29a70 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
29a80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
29a90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29aa0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
29ab0 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  .pValue) {......
29ac0 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
29ad0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29ae0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
29af0 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
29b00 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65  late[idx].pValue
29b10 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  , pTemplate[idx]
29b20 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
29b30 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  ..}....}...} els
29b40 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  e {....cackey_se
29b50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29b60 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
29b70 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  unt = 0;....cack
29b80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29b90 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
29ba0 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ry = NULL;...}..
29bb0 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75  } else {...if (u
29bc0 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
29bd0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
29be0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
29bf0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45  lock);.....CACKE
29c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29c10 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71  Error.  Search q
29c20 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61  uery specified a
29c30 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62  s NULL, but numb
29c40 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d  er of query term
29c50 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
29c60 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74  as 0.");.....ret
29c70 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
29c80 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  S_BAD);...}....c
29c90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29ca0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
29cb0 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b  query_count = 0;
29cc0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29cd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
29ce0 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
29cf0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
29d00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29d10 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
29d20 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   1;..cackey_sess
29d30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29d40 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
29d50 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  0;...mutex_retva
29d60 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
29d70 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29d80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
29d90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
29da0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29db0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29dc0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
29dd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29de0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
29df0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
29e00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29e10 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
29e20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
29e30 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
29e40 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
29e50 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f  cackey_pkcs11_co
29e60 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73  mpare_attributes
29e70 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  (CK_ATTRIBUTE *a
29e80 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  , CK_ATTRIBUTE *
29e90 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  b) {..unsigned c
29ea0 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a  har *smallbuf, *
29eb0 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f  largebuf;..size_
29ec0 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20  t smallbuf_len, 
29ed0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09  largebuf_len;...
29ee0 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62  if (a->type != b
29ef0 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75  ->type) {...retu
29f00 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  rn(0);..}...CACK
29f10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29f20 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d  "    ... found m
29f30 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e  atching type ...
29f40 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
29f50 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
29f60 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22   ... our value:"
29f70 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e  , a->pValue, a->
29f80 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69  ulValueLen);...i
29f90 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20  f (b->pValue == 
29fa0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
29fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
29fc0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
29fd0 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29  wildcard match")
29fe0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
29ff0 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c  .}...if (a->pVal
2a000 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ue == NULL) {...
2a010 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20  return(0);..}.. 
2a020 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c  .if (b->ulValueL
2a030 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65  en == a->ulValue
2a040 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d  Len && memcmp(a-
2a050 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c  >pValue, b->pVal
2a060 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  ue, b->ulValueLe
2a070 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  n) == 0) {...CAC
2a080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a090 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
2a0a0 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29  nd exact match")
2a0b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
2a0c0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e  .}...switch (a->
2a0d0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
2a0e0 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69  KA_MODULUS:....i
2a0f0 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  f (a->ulValueLen
2a100 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65   == b->ulValueLe
2a110 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
2a120 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e  ...}.....if (a->
2a130 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e  ulValueLen > b->
2a140 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
2a150 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e  ..smallbuf = b->
2a160 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c  pValue;.....smal
2a170 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c  lbuf_len = b->ul
2a180 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c  ValueLen;......l
2a190 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61  argebuf = a->pVa
2a1a0 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75  lue;.....largebu
2a1b0 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c  f_len = a->ulVal
2a1c0 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65  ueLen;....} else
2a1d0 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20   {.....smallbuf 
2a1e0 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = a->pValue;....
2a1f0 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20  .smallbuf_len = 
2a200 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  a->ulValueLen;..
2a210 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62  ....largebuf = b
2a220 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61  ->pValue;.....la
2a230 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e  rgebuf_len = b->
2a240 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
2a250 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67  .....for (; larg
2a260 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c  ebuf_len != smal
2a270 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62  lbuf_len; largeb
2a280 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65  uf++,largebuf_le
2a290 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c  n--) {.....if (l
2a2a0 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29  argebuf[0] != 0)
2a2b0 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
2a2c0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
2a2d0 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21   (largebuf_len !
2a2e0 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  = smallbuf_len) 
2a2f0 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
2a300 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70  }.....if (memcmp
2a310 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c  (largebuf, small
2a320 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  buf, smallbuf_le
2a330 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43  n) == 0) {.....C
2a340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a350 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
2a360 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65  ound approximate
2a370 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72   match");......r
2a380 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a  eturn(1);....}..
2a390 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72  ...break;..}...r
2a3a0 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f  eturn(0);.}..CK_
2a3b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2a3c0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
2a3d0 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ects)(CK_SESSION
2a3e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2a3f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2a400 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c  LE_PTR phObject,
2a410 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f   CK_ULONG ulMaxO
2a420 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55  bjectCount, CK_U
2a430 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65  LONG_PTR pulObje
2a440 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75  ctCount) {..stru
2a450 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
2a460 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b  ty *curr_id;..CK
2a470 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
2a480 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _attr;..CK_ULONG
2a490 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75   curr_id_idx, cu
2a4a0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63  rr_out_id_idx, c
2a4b0 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65  urr_attr_idx, se
2a4c0 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b  ss_attr_idx;..CK
2a4d0 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63  _ULONG matched_c
2a4e0 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68  ount, prev_match
2a4f0 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d  ed_count;..int m
2a500 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66  utex_retval;.#if
2a510 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
2a520 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
2a530 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76 61  T..struct timeva
2a540 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75  l start, end;..u
2a550 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69 6e  int64_t start_in
2a560 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64  t, end_int;.#end
2a570 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
2a580 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2a590 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2a5a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2a5b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a5c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a5d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2a5e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2a5f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2a600 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2a610 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74  ...if (pulObject
2a620 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
2a630 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a640 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a650 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69  pulObjectCount i
2a660 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2a670 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2a680 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2a690 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
2a6a0 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  LL && ulMaxObjec
2a6b0 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  tCount == 0) {..
2a6c0 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
2a6d0 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
2a6e0 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
2a6f0 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
2a700 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
2a710 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43  */...*pulObjectC
2a720 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43  ount = 0;....CAC
2a730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a740 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2a750 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
2a760 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
2a770 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a780 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
2a790 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29  hObject == NULL)
2a7a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a7b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a7c0 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55    phObject is NU
2a7d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2a7e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2a7f0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
2a800 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  MaxObjectCount =
2a810 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a830 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75  ror.  Maximum nu
2a840 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
2a850 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72  specified as zer
2a860 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  o.");....return(
2a870 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2a880 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2a890 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2a8a0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2a8b0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2a8c0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2a8d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2a8e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a8f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a900 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2a910 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2a920 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2a930 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2a940 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
2a950 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2a960 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2a970 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2a980 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2a990 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2a9a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a9b0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2a9c0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2a9d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2a9e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2a9f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2aa00 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2aa10 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2aa20 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2aa30 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2aa40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2aa50 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2aa60 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2aa70 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2aa80 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2aa90 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2aaa0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2aab0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2aac0 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
2aad0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2aae0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2aaf0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2ab00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ab10 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
2ab20 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2ab30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2ab40 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2ab50 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66  ALIZED);..}..#if
2ab60 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
2ab70 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
2ab80 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28  T..gettimeofday(
2ab90 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23  &start, NULL);.#
2aba0 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74  endif...curr_out
2abb0 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  _id_idx = 0;..fo
2abc0 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d  r (curr_id_idx =
2abd0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2abe0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2abf0 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f  h_curr_id; curr_
2ac00 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  id_idx < cackey_
2ac10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ac20 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
2ac30 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  unt && ulMaxObje
2ac40 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64  ctCount; curr_id
2ac50 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
2ac60 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  _id = &cackey_se
2ac70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2ac80 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72  .identities[curr
2ac90 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43  _id_idx];....CAC
2aca0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2acb0 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65  ("Processing ide
2acc0 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73  ntity:%lu", (uns
2acd0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
2ace0 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74  _id_idx);....mat
2acf0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ched_count = 0;.
2ad00 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
2ad10 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f  r_idx = 0; curr_
2ad20 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65  attr_idx < cacke
2ad30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ad40 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2ad50 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74  y_count; curr_at
2ad60 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70  tr_idx++) {....p
2ad70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
2ad80 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  t = matched_coun
2ad90 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  t;.....curr_attr
2ada0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
2adb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2adc0 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f  arch_query[curr_
2add0 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43  attr_idx];.....C
2ade0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2adf0 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66  TF("  Checking f
2ae00 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73 20  or attribute %s 
2ae10 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65  (0x%08lx) in ide
2ae20 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41  ntity:%i...", CA
2ae30 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
2ae40 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
2ae50 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65  (curr_attr->type
2ae60 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
2ae70 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
2ae80 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  pe, (int) curr_i
2ae90 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45  d_idx);....CACKE
2aea0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
2aeb0 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b  ("    Value look
2aec0 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f  ing for:", curr_
2aed0 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75  attr->pValue, cu
2aee0 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
2aef0 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73  Len);.....for (s
2af00 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  ess_attr_idx = 0
2af10 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20  ; sess_attr_idx 
2af20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  < curr_id->attri
2af30 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
2af40 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
2af50 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ....if (cackey_p
2af60 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74  kcs11_compare_at
2af70 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f 69  tributes(&curr_i
2af80 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
2af90 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75  ss_attr_idx], cu
2afa0 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09  rr_attr)) {.....
2afb0 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b  .matched_count++
2afc0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
2afd0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
2afe0 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74   If the attribut
2aff0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d  e could not be m
2b000 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74  atched, do not t
2b010 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69  ry to match addi
2b020 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65  tional attribute
2b030 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76  s */....if (prev
2b040 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
2b050 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29  = matched_count)
2b060 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
2b070 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61  .}...}....if (ma
2b080 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63  tched_count == c
2b090 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b0a0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b0b0 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09  query_count) {..
2b0c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b0d0 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c  RINTF("  ... All
2b0e0 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63   %i attributes c
2b0f0 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
2b100 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  , adding identit
2b110 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64  y:%i to returned
2b120 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61   list", (int) ca
2b130 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b140 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2b150 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
2b160 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
2b170 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72  ....phObject[cur
2b180 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20  r_out_id_idx] = 
2b190 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b  curr_id_idx + 1;
2b1a0 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74  .....ulMaxObject
2b1b0 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72  Count--;.....cur
2b1c0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a  r_out_id_idx++;.
2b1d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
2b1e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b1f0 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c  F("  ... Not all
2b200 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20   %i (only found 
2b210 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63  %i) attributes c
2b220 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
2b230 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65  , not adding ide
2b240 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29  ntity:%i", (int)
2b250 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2b260 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2b270 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
2b280 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75  int) matched_cou
2b290 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  nt, (int) curr_i
2b2a0 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09  d_idx);...}..}..
2b2b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b2c0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b2d0 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f  _curr_id = curr_
2b2e0 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a  id_idx;..*pulObj
2b2f0 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f  ectCount = curr_
2b300 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66  out_id_idx;..#if
2b310 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
2b320 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
2b330 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28  T..gettimeofday(
2b340 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74  &end, NULL);..st
2b350 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72 74  art_int = (start
2b360 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30  .tv_sec * 100000
2b370 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75 73  0) + start.tv_us
2b380 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28  ec;..end_int = (
2b390 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30 30  end.tv_sec * 100
2b3a0 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75  0000) + end.tv_u
2b3b0 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  sec;..fprintf(st
2b3c0 64 65 72 72 2c 20 22 53 65 61 72 63 68 20 74 6f  derr, "Search to
2b3d0 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f  ok %lu microseco
2b3e0 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65  nds\n", (unsigne
2b3f0 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74  d long) (end_int
2b400 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a   - start_int));.
2b410 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72  #endif...mutex_r
2b420 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2b430 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2b440 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2b450 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2b460 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2b470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b480 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2b490 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2b4a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2b4b0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2b4c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b4d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2b4e0 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62  _OK (%i), num ob
2b4f0 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b  jects = %lu", CK
2b500 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74  R_OK, *pulObject
2b510 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  Count);...return
2b520 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2b530 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2b540 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
2b550 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ectsFinal)(CK_SE
2b560 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2b570 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f  ssion) {..CK_ULO
2b580 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  NG idx;..int mut
2b590 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2b5a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b5b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2b5c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2b5d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2b5e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b5f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2b600 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2b610 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2b620 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2b630 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2b640 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2b650 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2b660 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2b670 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2b680 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2b690 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2b6a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b6b0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2b6c0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2b6d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2b6e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2b6f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2b700 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2b710 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2b720 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2b730 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2b740 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2b750 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b760 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2b770 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2b780 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2b790 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2b7a0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2b7b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2b7c0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2b7d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2b7e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2b7f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b800 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2b810 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2b820 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2b830 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2b840 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2b850 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2b860 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b870 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
2b880 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2b890 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2b8a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2b8b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b8c0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
2b8d0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2b8e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2b8f0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2b900 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2b910 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b920 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b930 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66  _active = 0;...f
2b940 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
2b950 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
2b960 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b970 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
2b980 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
2b990 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b9a0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b9b0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
2b9c0 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  ue) {....free(ca
2b9d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b9e0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2b9f0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
2ba00 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
2ba10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ba20 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2ba30 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65  _query) {...free
2ba40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2ba50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2ba60 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d  h_query);..}...m
2ba70 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2ba80 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2ba90 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2baa0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2bab0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2bac0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bad0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2bae0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2baf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2bb00 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2bb10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2bb20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2bb30 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2bb40 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2bb50 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2bb60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2bb70 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2bb80 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
2bb90 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2bba0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2bbb0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2bbc0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2bbd0 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
2bbe0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bbf0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2bc00 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2bc10 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2bc20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2bc30 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2bc40 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2bc50 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2bc60 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2bc70 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2bc80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2bc90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2bca0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2bcb0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2bcc0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bcd0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2bce0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bcf0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2bd00 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2bd10 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
2bd20 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
2bd30 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2bd40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2bd50 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
2bd60 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
2bd70 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
2bd80 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
2bd90 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74   pulEncryptedDat
2bda0 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
2bdb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2bdc0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2bdd0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2bde0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2bdf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2be00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2be10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2be20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2be30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2be40 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2be50 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2be60 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2be70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2be80 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2be90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2bea0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2beb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bec0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2bed0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2bee0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
2bef0 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
2bf00 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2bf10 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2bf20 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2bf30 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
2bf40 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2bf50 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
2bf60 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
2bf70 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
2bf80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bf90 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2bfa0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2bfb0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2bfc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bfd0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2bfe0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2bff0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2c000 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2c010 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2c020 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c030 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2c040 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c050 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2c060 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c070 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2c080 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2c090 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2c0a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2c0b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
2c0c0 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53  cryptFinal)(CK_S
2c0d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2c0e0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2c0f0 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74  PTR pLastEncrypt
2c100 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
2c110 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72  _PTR pulLastEncr
2c120 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
2c130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c140 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2c150 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2c160 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2c170 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c180 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2c190 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2c1a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2c1b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2c1c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2c1d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c1e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2c1f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c200 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2c210 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c220 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2c230 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2c240 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2c250 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2c260 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2c270 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43  C_DecryptInit)(C
2c280 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2c290 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2c2a0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2c2b0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2c2c0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2c2d0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2c2e0 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
2c2f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c300 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c310 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c320 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c330 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c340 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c350 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c360 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c370 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c380 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2c390 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
2c3a0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2c3b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c3c0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
2c3d0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2c3e0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2c3f0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2c400 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
2c410 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
2c420 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
2c430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c440 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
2c450 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
2c460 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
2c470 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
2c480 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c490 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
2c4a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2c4b0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2c4c0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2c4d0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2c4e0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2c4f0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2c500 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2c510 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c520 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2c530 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2c540 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2c550 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2c560 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2c570 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2c580 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2c590 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c5a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2c5b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2c5c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c5d0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2c5e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2c5f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2c600 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2c610 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2c620 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c630 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2c640 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2c650 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c660 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c670 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c680 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2c690 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2c6a0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2c6b0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2c6c0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2c6d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c6e0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2c6f0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2c700 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2c710 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2c720 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c730 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
2c740 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20  rypt already in 
2c750 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a  progress.");....
2c760 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2c770 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
2c780 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d  .}...if (hKey >=
2c790 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2c7a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2c7b0 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
2c7c0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2c7d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2c7e0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2c7f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c800 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65  ror.  Key handle
2c810 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72   out of range (r
2c820 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75  equested key %lu
2c830 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74  , only %lu ident
2c840 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29  ities available)
2c850 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2c860 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67  ng) hKey, (unsig
2c870 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79  ned long) cackey
2c880 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c890 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2c8a0 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
2c8b0 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f  (CKR_KEY_HANDLE_
2c8c0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
2c8d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c8e0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2c8f0 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
2c900 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c910 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2c920 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
2c930 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
2c940 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  sm;..cackey_sess
2c950 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2c960 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
2c970 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70   = pMechanism->p
2c980 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b  Parameter;..cack
2c990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c9a0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
2c9b0 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65  ch_parmlen = pMe
2c9c0 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d  chanism->ulParam
2c9d0 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79  eterLen;..cackey
2c9e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c9f0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
2ca00 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
2ca10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2ca20 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
2ca30 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y];...mutex_retv
2ca40 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2ca50 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2ca60 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2ca70 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2ca80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ca90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2caa0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2cab0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2cac0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2cad0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2cae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2caf0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2cb00 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2cb10 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2cb20 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2cb30 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2cb40 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45  C_Decrypt)(CK_SE
2cb50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2cb60 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2cb70 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
2cb80 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  a, CK_ULONG ulEn
2cb90 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
2cba0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2cbb0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
2cbc0 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
2cbd0 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f  K_ULONG datalen_
2cbe0 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f  update, datalen_
2cbf0 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65  final;..CK_RV de
2cc00 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20  crypt_ret;..int 
2cc10 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2cc20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cc30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2cc40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2cc50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2cc60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cc70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2cc80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2cc90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2cca0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2ccb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2ccc0 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20   (pulDataLen == 
2ccd0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2cce0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ccf0 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e  rror. pulDataLen
2cd00 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2cd10 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2cd20 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2cd30 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d  datalen_update =
2cd40 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09   *pulDataLen;...
2cd50 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
2cd60 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53  DecryptUpdate(hS
2cd70 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74  ession, pEncrypt
2cd80 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70  edData, ulEncryp
2cd90 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74  tedDataLen, pDat
2cda0 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61  a, &datalen_upda
2cdb0 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  te);..if (decryp
2cdc0 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
2cdd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2cde0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2cdf0 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28    DecryptUpdate(
2ce00 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
2ce10 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
2ce20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2ce30 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
2ce40 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
2ce50 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t != CKR_BUFFER_
2ce60 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
2ce70 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63  /* Terminate dec
2ce80 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ryption operatio
2ce90 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72  n */.....mutex_r
2cea0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2ceb0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2cec0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
2ced0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2cee0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
2cef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2cf00 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2cf10 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
2cf20 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2cf30 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
2cf40 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2cf50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cf60 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
2cf70 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2cf80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2cf90 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
2cfa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2cfb0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2cfc0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2cfd0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2cfe0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2cff0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
2d000 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2d010 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d020 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
2d030 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
2d040 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2d050 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2d060 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d070 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2d080 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
2d090 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
2d0a0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2d0b0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2d0c0 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  D);....}.....cac
2d0d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d0e0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
2d0f0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d  ctive = 0;.....m
2d100 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2d110 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d120 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d130 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
2d140 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2d150 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d160 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d170 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2d180 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
2d190 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2d1a0 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  OR);....}...}...
2d1b0 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
2d1c0 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
2d1d0 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20  Data) {...pData 
2d1e0 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  += datalen_updat
2d1f0 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66  e;..}..datalen_f
2d200 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c  inal = *pulDataL
2d210 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en - datalen_upd
2d220 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  ate;...decrypt_r
2d230 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  et = C_DecryptFi
2d240 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  nal(hSession, pD
2d250 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69  ata, &datalen_fi
2d260 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79  nal);..if (decry
2d270 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
2d280 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d290 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d2a0 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28  .  DecryptFinal(
2d2b0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
2d2c0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
2d2d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2d2e0 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
2d2f0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
2d300 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  _ret);..}...*pul
2d310 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65  DataLen = datale
2d320 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c  n_update + datal
2d330 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b  en_final;...CACK
2d340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d350 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2d360 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2d370 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2d380 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2d390 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2d3a0 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
2d3b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d3c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d3d0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2d3e0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2d3f0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
2d400 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
2d410 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2d420 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
2d430 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
2d440 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b  BYTE buf[16384];
2d450 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  ..ssize_t buflen
2d460 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ;..CK_SLOT_ID sl
2d470 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74  otID;..CK_RV ret
2d480 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2d490 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75  L_ERROR;..int mu
2d4a0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
2d4b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d4c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2d4d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2d4e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2d4f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d500 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2d510 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2d520 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2d530 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2d540 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2d550 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2d560 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2d570 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2d580 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2d590 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2d5a0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2d5b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d5c0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2d5d0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2d5e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2d5f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2d600 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2d610 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
2d620 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63  == NULL && ulEnc
2d630 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d  ryptedPartLen ==
2d640 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
2d650 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61   circuit if we a
2d660 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72  re asked to decr
2d670 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a  ypt nothing... *
2d680 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
2d690 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d6a0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
2d6b0 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
2d6c0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
2d6d0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
2d6e0 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64  ..if (pEncrypted
2d6f0 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
2d700 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d710 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45  RINTF("Error. pE
2d720 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73 20  ncryptedPart is 
2d730 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72  NULL, but ulEncr
2d740 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20  yptedPartLen is 
2d750 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
2d760 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2d770 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2d780 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  (ulEncryptedPart
2d790 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  Len == 0) {...CA
2d7a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d7b0 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72  F("Error. ulEncr
2d7c0 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20  yptedPartLen is 
2d7d0 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20  0, but pPart is 
2d7e0 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
2d7f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2d800 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2d810 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d  if (pulPartLen =
2d820 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2d830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d840 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c  "Error. pulPartL
2d850 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
2d860 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2d870 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2d880 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2d890 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2d8a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2d8b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2d8c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2d8d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d8e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2d8f0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2d900 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2d910 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2d920 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2d930 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d940 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
2d950 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d960 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d970 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2d980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d990 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2d9a0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2d9b0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2d9c0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2d9d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2d9e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d9f0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
2da00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2da10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2da20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2da30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2da40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2da50 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
2da60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2da70 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2da80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2da90 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
2daa0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2dab0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
2dac0 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
2dad0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
2dae0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2daf0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
2db00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
2db10 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2db20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2db30 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
2db40 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
2db50 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
2db60 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
2db70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2db80 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2db90 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2dba0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
2dbb0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
2dbc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dbd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
2dbe0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
2dbf0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
2dc00 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
2dc10 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
2dc20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2dc30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2dc40 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
2dc50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2dc60 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
2dc70 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2dc80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2dc90 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ypt_mechanism) {
2dca0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
2dcb0 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20  PKCS:..../* Ask 
2dcc0 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20  card to decrypt 
2dcd0 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63  */....buflen = c
2dce0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
2dcf0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
2dd00 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
2dd10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2dd20 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
2dd30 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50  ity, pEncryptedP
2dd40 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  art, ulEncrypted
2dd50 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69  PartLen, buf, si
2dd60 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29  zeof(buf), 0, 1)
2dd70 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  ;.....if (buflen
2dd80 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
2dd90 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63  E_NEEDLOGIN && c
2dda0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
2ddb0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  d != NULL) {....
2ddc0 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74  .if (_C_LoginMut
2ddd0 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20  exArg(hSession, 
2dde0 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20  CKU_USER, NULL, 
2ddf0 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29  0, 0) == CKR_OK)
2de00 20 7b 0a 09 09 09 09 09 62 75 66 6c 65 6e 20 3d   {......buflen =
2de10 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
2de20 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
2de30 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
2de40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2de50 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
2de60 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
2de70 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
2de80 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
2de90 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
2dea0 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  1);.....}....}..
2deb0 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20  ...if (buflen < 
2dec0 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72  0) {...../* Decr
2ded0 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a  yption failed. *
2dee0 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e  /.....if (buflen
2def0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
2df00 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09  E_NEEDLOGIN) {..
2df10 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2df20 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44  _USER_NOT_LOGGED
2df30 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  _IN;.....} else 
2df40 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41  if (buflen == CA
2df50 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
2df60 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09  NABSENT) {......
2df70 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56  retval = CKR_DEV
2df80 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09  ICE_REMOVED;....
2df90 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43  .} else {......C
2dfa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dfb0 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
2dfc0 6e 64 20 41 50 44 55 2c 20 65 72 72 6f 72 20 3d  nd APDU, error =
2dfd0 20 25 6c 69 22 2c 20 28 6c 6f 6e 67 20 69 6e 74   %li", (long int
2dfe0 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  ) buflen);......
2dff0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45  .retval = CKR_GE
2e000 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09  NERAL_ERROR;....
2e010 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  .}....} else if 
2e020 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
2e030 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  ) buflen) > *pul
2e040 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74  PartLen && pPart
2e050 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
2e060 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  pted data too la
2e070 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  rge */.....retva
2e080 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
2e090 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65  OO_SMALL;....} e
2e0a0 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50  lse {.....if (pP
2e0b0 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63  art) {......memc
2e0c0 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62  py(pPart, buf, b
2e0d0 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09  uflen);.....}...
2e0e0 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d  ...*pulPartLen =
2e0f0 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65   buflen;......re
2e100 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09  tval = CKR_OK;..
2e110 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
2e120 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2e130 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2e140 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2e150 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2e160 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2e170 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e180 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e190 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2e1a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2e1b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2e1c0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
2e1d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2e1e0 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
2e1f0 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  t) retval);...re
2e200 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
2e210 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e220 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
2e230 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
2e240 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2e250 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2e260 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b  TR pLastPart, CK
2e270 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61  _ULONG_PTR pulLa
2e280 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e  stPartLen) {..in
2e290 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2e2a0 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64  .int terminate_d
2e2b0 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41  ecrypt = 1;...CA
2e2c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e2d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2e2e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2e2f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2e300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e310 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2e320 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2e330 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2e340 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2e350 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2e360 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2e370 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2e380 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2e390 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2e3a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2e3b0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2e3c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e3d0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2e3e0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2e3f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2e400 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2e410 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2e420 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  (pulLastPartLen 
2e430 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2e440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e450 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74  ("Error. pulLast
2e460 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  PartLen is NULL.
2e470 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2e480 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2e490 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2e4a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2e4b0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2e4c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2e4d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2e4e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e4f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e500 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2e510 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e520 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2e530 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2e540 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e550 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2e560 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2e570 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2e580 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2e590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e5a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2e5b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2e5c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2e5d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2e5e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2e5f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2e600 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2e610 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
2e620 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2e630 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e640 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2e650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e660 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
2e670 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2e680 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2e690 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2e6a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75  LIZED);..}...*pu
2e6b0 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30  lLastPartLen = 0
2e6c0 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72  ;...if (pLastPar
2e6d0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74  t == NULL) {...t
2e6e0 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
2e6f0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74   = 0;..}...if (t
2e700 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
2e710 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
2e720 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e730 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
2e740 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
2e750 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2e760 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2e770 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2e780 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2e790 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2e7a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e7b0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2e7c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2e7d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2e7e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2e7f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e800 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2e810 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2e820 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2e830 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2e840 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2e850 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29  V, C_DigestInit)
2e860 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2e870 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2e880 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2e890 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43  echanism) {..CAC
2e8a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e8b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2e8c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2e8d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2e8e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e8f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2e900 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2e910 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2e920 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2e930 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2e940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e950 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2e960 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e970 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2e980 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e990 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2e9a0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2e9b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2e9c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2e9d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2e9e0 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gest)(CK_SESSION
2e9f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2ea00 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2ea10 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2ea20 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
2ea30 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
2ea40 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
2ea50 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
2ea60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ea70 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2ea80 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2ea90 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2eaa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2eab0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2eac0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2ead0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2eae0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2eaf0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2eb00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2eb10 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2eb20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2eb30 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2eb40 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2eb50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2eb60 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2eb70 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2eb80 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2eb90 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
2eba0 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
2ebb0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2ebc0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2ebd0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2ebe0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
2ebf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ec00 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2ec10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2ec20 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2ec30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ec40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2ec50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ec60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ec70 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ec80 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2ec90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2eca0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2ecb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ecc0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2ecd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ece0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2ecf0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2ed00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ed10 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2ed20 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2ed30 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f  C_DigestKey)(CK_
2ed40 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ed50 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
2ed60 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2ed70 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2ed80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2ed90 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2eda0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2edb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2edc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2edd0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2ede0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2edf0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2ee00 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2ee10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ee20 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2ee30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ee40 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2ee50 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2ee60 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2ee70 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2ee80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ee90 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2eea0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2eeb0 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29  , C_DigestFinal)
2eec0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2eed0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2eee0 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
2eef0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2ef00 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
2ef10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ef20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2ef30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ef40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2ef50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ef60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ef70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2ef80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2ef90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2efa0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2efb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2efc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2efd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2efe0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2eff0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f000 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2f010 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2f020 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f030 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2f040 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2f050 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45  _SignInit)(CK_SE
2f060 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2f070 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2f080 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2f090 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
2f0a0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
2f0b0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2f0c0 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
2f0d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f0e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2f0f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2f100 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2f110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f120 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2f130 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2f140 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2f150 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2f160 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
2f170 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
2f180 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f190 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f1a0 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
2f1b0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2f1c0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2f1d0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2f1e0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
2f1f0 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
2f200 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
2f210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f220 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
2f230 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
2f240 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
2f250 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09  M_RSA_PKCS");...
2f260 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48  .return(CKR_MECH
2f270 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41  ANISM_PARAM_INVA
2f280 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
2f290 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2f2a0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2f2b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2f2c0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2f2d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2f2e0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2f2f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f300 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2f310 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2f320 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2f330 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2f340 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2f350 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2f360 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2f370 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2f380 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2f390 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2f3a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f3b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2f3c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2f3d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2f3e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2f3f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2f400 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2f410 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2f420 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2f430 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2f440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f450 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2f460 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2f470 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2f480 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2f490 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2f4a0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
2f4b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f4c0 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
2f4d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2f4e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2f4f0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2f500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2f510 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61  ror.  Sign alrea
2f520 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22  dy in progress."
2f530 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2f540 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54  KR_OPERATION_ACT
2f550 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  IVE);..}...if (h
2f560 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65  Key >= cackey_se
2f570 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f580 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
2f590 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  t) {...cackey_mu
2f5a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2f5b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2f5c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f5d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20  TF("Error.  Key 
2f5e0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
2f5f0 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b  nge (requested k
2f600 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75  ey %lu, only %lu
2f610 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69   identities avai
2f620 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67  lable).", (unsig
2f630 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20  ned long) hKey, 
2f640 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2f650 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2f660 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2f670 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
2f680 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48  return(CKR_KEY_H
2f690 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2f6a0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
2f6b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2f6c0 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ign_active = 1;.
2f6d0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2f6e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2f6f0 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
2f700 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
2f710 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  sm;...cackey_ses
2f720 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f730 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32  sign_buflen = 12
2f740 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  8;..cackey_sessi
2f750 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2f760 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a  gn_bufused = 0;.
2f770 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2f780 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2f790 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  buf = malloc(siz
2f7a0 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
2f7b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2f7c0 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
2f7d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2f7e0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
2f7f0 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
2f800 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f  G_PRINTF("Sessio
2f810 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74  n %lu sign_ident
2f820 69 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74  ity is %p (ident
2f830 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73  ity #%lu)", (uns
2f840 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
2f850 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26  sion, (void *) &
2f860 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2f870 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2f880 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73  ties[hKey], (uns
2f890 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
2f8a0 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  );..cackey_sessi
2f8b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2f8c0 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63  gn_identity = &c
2f8d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2f8e0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2f8f0 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74  ies[hKey];...mut
2f900 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2f910 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f920 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f930 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2f940 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2f950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f960 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2f970 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2f980 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2f990 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2f9a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f9b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2f9c0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2f9d0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2f9e0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2f9f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2fa00 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43  CK_RV, C_Sign)(C
2fa10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2fa20 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2fa30 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
2fa40 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
2fa50 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2fa60 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
2fa70 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
2fa80 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  ureLen) {..unsig
2fa90 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73  ned long start_s
2faa0 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b  ign_bufused;..CK
2fab0 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69  _RV sign_ret;..i
2fac0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2fad0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2fae0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2faf0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2fb00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2fb10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fb20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2fb30 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2fb40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2fb50 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2fb60 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2fb70 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
2fb80 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
2fb90 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2fba0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
2fbb0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2fbc0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
2fbd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fbe0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2fbf0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
2fc00 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2fc10 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2fc20 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2fc30 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  ..start_sign_buf
2fc40 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65  used = cackey_se
2fc50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2fc60 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  .sign_bufused;..
2fc70 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69  .sign_ret = C_Si
2fc80 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f  gnUpdate(hSessio
2fc90 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61  n, pData, ulData
2fca0 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
2fcb0 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
2fcc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2fcd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2fce0 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74  SignUpdate() ret
2fcf0 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
2fd00 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
2fd10 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e  igned long) sign
2fd20 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69  _ret);....if (si
2fd30 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55  gn_ret != CKR_BU
2fd40 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
2fd50 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  {....mutex_retva
2fd60 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2fd70 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2fd80 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
2fd90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2fda0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
2fdb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fdc0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2fdd0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
2fde0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2fdf0 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  RROR);....}.....
2fe00 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2fe10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2fe20 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
2fe30 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2fe40 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2fe50 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
2fe60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fe70 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2fe80 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2fe90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2fea0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2feb0 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  LID);....}.....i
2fec0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2fed0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2fee0 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09  gn_active) {....
2fef0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2ff00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2ff10 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
2ff20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ff30 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
2ff40 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2ff50 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2ff60 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2ff70 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a  IALIZED);....}..
2ff80 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2ff90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2ffa0 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  n_active = 0;...
2ffb0 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2ffc0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2ffd0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2ffe0 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
2fff0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
30000 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
30010 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30020 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
30030 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
30040 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
30050 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d  ERROR);....}...}
30060 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
30070 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f  ret);..}...sign_
30080 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  ret = C_SignFina
30090 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67  l(hSession, pSig
300a0 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61  nature, pulSigna
300b0 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73  tureLen);..if (s
300c0 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
300d0 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f  K) {...if (sign_
300e0 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  ret == CKR_BUFFE
300f0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
30100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30110 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c  RINTF("SignFinal
30120 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f  () returned CKR_
30130 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
30140 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64   (rv = %lu), und
30150 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
30160 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e()", (unsigned 
30170 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
30180 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
30190 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
301a0 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74  ign_bufused = st
301b0 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
301c0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67  ;.....return(sig
301d0 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43  n_ret);...}....C
301e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
301f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
30200 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
30210 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
30220 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
30230 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
30240 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
30250 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
30260 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55  pSignature == NU
30270 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
30280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69  EBUG_PRINTF("pSi
30290 67 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65  gnature specifie
302a0 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69  d as NULL, undoi
302b0 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28  ng C_SignUpdate(
302c0 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73  )");....cackey_s
302d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
302e0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
302f0 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
30300 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73  sed;....return(s
30310 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43  ign_ret);..}...C
30320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30330 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
30340 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
30350 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
30360 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
30370 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
30380 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65  RV, C_SignUpdate
30390 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
303a0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
303b0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
303c0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
303d0 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Len) {..int mute
303e0 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 72  x_retval;..int r
303f0 65 73 69 7a 65 52 65 74 72 79 3b 0a 09 69 6e 74  esizeRetry;..int
30400 20 6e 65 65 64 52 65 73 69 7a 65 3b 0a 0a 09 43   needResize;...C
30410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30420 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30430 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
30440 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
30450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30460 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
30470 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30480 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30490 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
304a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
304b0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
304c0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
304d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
304e0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
304f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30500 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
30510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30520 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
30530 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
30540 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
30550 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
30560 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
30570 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20   (pPart == NULL 
30580 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  && ulPartLen == 
30590 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
305a0 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
305b0 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20  e asked to sign 
305c0 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
305d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
305e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
305f0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
30600 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
30610 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
30620 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
30630 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (pPart == NULL)
30640 20 7b 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 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20   pPart is NULL, 
30670 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  but ulPartLen is
30680 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
30690 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
306a0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
306b0 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30   (ulPartLen == 0
306c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
306d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
306e0 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30  . ulPartLen is 0
306f0 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
30700 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
30710 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
30720 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
30730 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
30740 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
30750 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
30760 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
30770 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
30780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30790 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
307a0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
307b0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
307c0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
307d0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
307e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
307f0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
30800 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
30810 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
30820 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30830 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30840 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
30850 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
30860 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
30870 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
30880 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
30890 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
308a0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
308b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
308c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
308d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
308e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
308f0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
30900 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
30910 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
30920 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
30930 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
30940 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
30950 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30960 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
30970 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
30980 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63  A_PKCS:..../* Ac
30990 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c  cumulate directl
309a0 79 20 2a 2f 0a 09 09 09 66 6f 72 20 28 72 65 73  y */....for (res
309b0 69 7a 65 52 65 74 72 79 20 3d 20 30 3b 20 72 65  izeRetry = 0; re
309c0 73 69 7a 65 52 65 74 72 79 20 3c 20 31 31 3b 20  sizeRetry < 11; 
309d0 72 65 73 69 7a 65 52 65 74 72 79 2b 2b 29 20 7b  resizeRetry++) {
309e0 0a 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65 20  .....needResize 
309f0 3d 20 30 3b 0a 09 09 09 09 69 66 20 28 28 63 61  = 0;.....if ((ca
30a00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30a10 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
30a20 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e  used + ulPartLen
30a30 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) > cackey_sessi
30a40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30a50 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09  gn_buflen) {....
30a60 09 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 31  ..needResize = 1
30a70 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
30a80 28 21 6e 65 65 64 52 65 73 69 7a 65 29 20 7b 0a  (!needResize) {.
30a90 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
30aa0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
30ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 69  BUG_PRINTF("Resi
30ac0 7a 69 6e 67 20 73 69 67 6e 69 6e 67 20 62 75 66  zing signing buf
30ad0 66 65 72 20 28 74 72 79 20 23 25 69 20 6f 66 20  fer (try #%i of 
30ae0 31 30 20 2d 2d 20 31 31 74 68 20 69 73 20 66 61  10 -- 11th is fa
30af0 74 61 6c 29 22 2c 20 72 65 73 69 7a 65 52 65 74  tal)", resizeRet
30b00 72 79 29 3b 0a 0a 09 09 09 09 69 66 20 28 72 65  ry);......if (re
30b10 73 69 7a 65 52 65 74 72 79 20 3d 3d 20 31 30 29  sizeRetry == 10)
30b20 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63   {......free(cac
30b30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30b40 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
30b50 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
30b60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30b70 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
30b80 30 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  0;......cackey_s
30b90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30ba0 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 4e 55 4c  ].sign_buf = NUL
30bb0 4c 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  L;.......break;.
30bc0 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65  ....}......cacke
30bd0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30be0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
30bf0 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b   *= 2;......cack
30c00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30c10 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
30c20 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f   realloc(cackey_
30c30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30c40 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a  n].sign_buf, siz
30c50 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
30c60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
30c70 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
30c80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30c90 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
30ca0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
30cb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30cc0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
30cd0 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
30ce0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
30cf0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
30d00 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
30d10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30d20 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 69 6e 67  "Error.  Signing
30d30 20 62 75 66 66 65 72 20 69 73 20 4e 55 4c 4c 2e   buffer is NULL.
30d40 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
30d50 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
30d60 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  R);....}.....mem
30d70 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
30d80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30d90 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
30da0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30db0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
30dc0 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
30dd0 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
30de0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30df0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
30e00 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
30e10 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
30e20 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
30e30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
30e40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
30e50 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
30e60 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
30e70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30e80 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
30e90 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
30ea0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
30eb0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
30ec0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30ed0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30ee0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
30ef0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
30f00 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
30f10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
30f20 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e  CK_RV, C_SignFin
30f30 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
30f40 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
30f50 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
30f60 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
30f70 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
30f80 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  eLen) {..static 
30f90 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31  CK_BYTE sigbuf[1
30fa0 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73  024];..ssize_t s
30fb0 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c  igbuflen;..CK_SL
30fc0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
30fd0 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
30fe0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
30ff0 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
31000 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d  sign = 1;..int m
31010 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
31020 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31030 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
31040 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
31050 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
31060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31070 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
31080 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
31090 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
310a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
310b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
310c0 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  (pulSignatureLen
310d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
310e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
310f0 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67  F("Error. pulSig
31100 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c  natureLen is NUL
31110 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
31120 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
31130 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
31140 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
31150 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
31160 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
31170 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
31180 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
31190 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
311a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
311b0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
311c0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
311d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
311e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
311f0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
31200 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
31210 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
31220 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
31230 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
31240 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
31250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31260 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
31270 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
31280 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
31290 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
312a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
312b0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
312c0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
312d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
312e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
312f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31300 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
31310 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
31320 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
31330 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
31340 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
31350 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
31360 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31370 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
31380 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
31390 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
313a0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
313b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
313c0 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
313d0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
313e0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
313f0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
31400 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
31410 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
31420 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
31430 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
31440 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
31450 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
31460 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
31470 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
31480 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
31490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
314a0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
314b0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
314c0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
314d0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
314e0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
314f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
31500 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
31510 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
31520 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
31530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
31550 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
31560 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
31570 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
31580 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
31590 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
315a0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
315b0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
315c0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
315d0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
315e0 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
315f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31600 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
31610 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
31620 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
31630 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09  ard to sign */..
31640 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31650 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f  RINTF("Asking to
31660 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74   sign from ident
31670 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f  ity %p in sessio
31680 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29  n %lu", (void *)
31690 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
316a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
316b0 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67  identity, (unsig
316c0 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
316d0 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65  on);....sigbufle
316e0 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
316f0 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
31700 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
31710 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
31720 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
31730 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65  ntity, cackey_se
31740 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31750 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65  .sign_buf, cacke
31760 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
31770 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
31780 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  d, sigbuf, sizeo
31790 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
317a0 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  ;.....if (sigbuf
317b0 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
317c0 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26  SC_E_NEEDLOGIN &
317d0 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  & cackey_pin_com
317e0 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
317f0 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e  ....if (_C_Login
31800 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f  MutexArg(hSessio
31810 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c  n, CKU_USER, NUL
31820 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f  L, 0, 0) == CKR_
31830 4f 4b 29 20 7b 0a 09 09 09 09 09 73 69 67 62 75  OK) {......sigbu
31840 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69  flen = cackey_si
31850 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65  gndecrypt(&cacke
31860 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
31870 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
31880 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31890 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79  identity, cackey
318a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
318b0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61  on].sign_buf, ca
318c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
318d0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
318e0 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69  used, sigbuf, si
318f0 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c  zeof(sigbuf), 1,
31900 20 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a   0);.....}....}.
31910 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
31920 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
31930 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20  Signing failed. 
31940 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75  */.....if (sigbu
31950 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
31960 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
31970 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
31980 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
31990 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
319a0 6c 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65  lse if (sigbufle
319b0 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
319c0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
319d0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
319e0 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
319f0 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ED;.....} else {
31a00 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
31a10 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
31a20 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
31a30 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64  e if (((unsigned
31a40 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
31a50 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ) > *pulSignatur
31a60 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75  eLen && pSignatu
31a70 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67  re) {...../* Sig
31a80 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ned data too lar
31a90 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59  ge */.....CACKEY
31aa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72  _DEBUG_PRINTF("r
31ab0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
31ac0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73  ER_TOO_SMALL;  s
31ad0 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20  igbuflen = %lu, 
31ae0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
31af0 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  = %lu", (unsigne
31b00 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
31b10 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
31b20 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  g) *pulSignature
31b30 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61  Len);......retva
31b40 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
31b50 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74  OO_SMALL;......t
31b60 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
31b70 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  0;....} else {..
31b80 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
31b90 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28  n = 0;......if (
31ba0 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
31bb0 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61  ...memcpy(pSigna
31bc0 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69  ture, sigbuf, si
31bd0 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  gbuflen);.......
31be0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
31bf0 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a   1;.....}......*
31c00 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
31c10 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09  = sigbuflen;....
31c20 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
31c30 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
31c40 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  k;..}...if (term
31c50 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09  inate_sign) {...
31c60 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
31c70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31c80 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65  gn_buf) {....fre
31c90 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
31ca0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31cb0 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _buf);...}....ca
31cc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
31cd0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
31ce0 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
31cf0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
31d00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
31d10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
31d20 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
31d30 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
31d40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31d50 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
31d60 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
31d70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
31d80 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
31d90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31da0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
31db0 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
31dc0 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
31dd0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
31de0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
31df0 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
31e00 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
31e10 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
31e20 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
31e30 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
31e40 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
31e50 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
31e60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31e70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
31e80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
31e90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
31ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31eb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
31ec0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
31ed0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
31ee0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
31ef0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
31f00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
31f10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
31f20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
31f30 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
31f40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
31f50 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
31f60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
31f70 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
31f80 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
31f90 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
31fa0 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
31fb0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
31fc0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
31fd0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
31fe0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
31ff0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
32000 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
32010 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
32020 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
32030 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
32040 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
32050 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
32060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
32070 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
32080 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
32090 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
320a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
320b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
320c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
320d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
320e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
320f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
32100 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
32110 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
32120 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
32130 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
32140 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
32150 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
32160 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74  RV, C_VerifyInit
32170 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
32180 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
32190 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
321a0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
321b0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
321c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
321d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
321e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
321f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
32200 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
32210 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
32220 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
32230 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
32240 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
32250 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
32260 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32270 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
32280 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
32290 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
322a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
322b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
322c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
322d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
322e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
322f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
32300 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b  RV, C_Verify)(CK
32310 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
32320 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
32330 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
32340 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
32350 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
32360 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
32370 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
32380 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
32390 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
323a0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
323b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
323c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
323d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
323e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
323f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
32400 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
32410 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
32420 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32430 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
32440 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
32450 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
32460 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
32470 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
32480 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
32490 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
324a0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
324b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
324c0 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61  RV, C_VerifyUpda
324d0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
324e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
324f0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
32500 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
32510 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
32520 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
32530 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
32540 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
32550 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
32560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32570 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
32580 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
32590 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
325a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
325b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
325c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
325d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
325e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
325f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
32600 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32610 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
32620 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32630 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
32640 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
32650 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
32660 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  yFinal)(CK_SESSI
32670 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
32680 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
32690 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
326a0 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
326b0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
326c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
326d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
326e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
326f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
32700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32710 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
32720 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
32730 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
32740 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
32750 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
32760 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
32770 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
32780 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
32790 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
327a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
327b0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
327c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
327d0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
327e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
327f0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
32800 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
32810 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
32820 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
32830 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
32840 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
32850 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
32860 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32870 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
32880 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
32890 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
328a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
328b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
328c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
328d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
328e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
328f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
32900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32910 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
32920 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32930 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
32940 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32950 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
32960 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
32970 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
32980 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
32990 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
329a0 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43  VerifyRecover)(C
329b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
329c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
329d0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
329e0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
329f0 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42  gnatureLen, CK_B
32a00 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
32a10 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
32a20 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
32a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32a40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
32a50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
32a60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
32a70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
32a80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
32a90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
32aa0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
32ab0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
32ac0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
32ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
32ae0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
32af0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32b00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
32b10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
32b20 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
32b30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
32b40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
32b50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
32b60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
32b70 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  stEncryptUpdate)
32b80 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
32b90 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
32ba0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
32bb0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
32bc0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
32bd0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
32be0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
32bf0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
32c00 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
32c10 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
32c20 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
32c30 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
32c40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
32c50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
32c60 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
32c70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
32c80 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
32c90 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
32ca0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32cb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
32cc0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
32cd0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
32ce0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
32cf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
32d00 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
32d10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
32d20 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
32d30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
32d40 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67  RV, C_DecryptDig
32d50 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
32d60 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
32d70 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
32d80 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
32d90 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
32da0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
32db0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
32dc0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
32dd0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
32de0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32df0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
32e00 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
32e10 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
32e20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32e30 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
32e40 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
32e50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
32e60 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
32e70 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
32e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32e90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
32ea0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32eb0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
32ec0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32ed0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
32ee0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
32ef0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
32f00 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
32f10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
32f20 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
32f30 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
32f40 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
32f50 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
32f60 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
32f70 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
32f80 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
32f90 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
32fa0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
32fb0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
32fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
32fd0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
32fe0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
32ff0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
33000 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
33010 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
33020 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
33030 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
33040 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
33050 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
33060 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
33070 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
33080 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
33090 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
330a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
330b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
330c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
330d0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
330e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
330f0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56  K_RV, C_DecryptV
33100 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
33110 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
33120 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
33130 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
33140 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
33150 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
33160 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
33170 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
33180 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
33190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
331a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
331b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
331c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
331d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
331e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
331f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
33200 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
33210 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
33220 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
33230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33240 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
33250 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33260 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
33270 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33280 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
33290 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
332a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
332b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
332c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
332d0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43  C_GenerateKey)(C
332e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
332f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
33300 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
33310 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
33320 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
33330 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
33340 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
33350 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
33360 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
33370 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
33380 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
33390 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
333a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
333b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
333c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
333d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
333e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
333f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
33400 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33410 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
33420 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
33430 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
33440 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
33450 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33460 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
33470 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33480 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
33490 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
334a0 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
334b0 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f  yPair)(CK_SESSIO
334c0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
334d0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
334e0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
334f0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
33500 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c   pPublicKeyTempl
33510 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
33520 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75  PublicKeyAttribu
33530 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52  teCount, CK_ATTR
33540 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61  IBUTE_PTR pPriva
33550 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  teKeyTemplate, C
33560 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74  K_ULONG ulPrivat
33570 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  eKeyAttributeCou
33580 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
33590 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69  NDLE_PTR phPubli
335a0 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  cKey, CK_OBJECT_
335b0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69  HANDLE_PTR phPri
335c0 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b  vateKey) {..CACK
335d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
335e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
335f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
33600 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
33610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33620 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
33630 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
33640 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
33650 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
33660 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
33670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
33680 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
33690 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
336a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
336b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
336c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
336d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
336e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
336f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
33700 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61  ION(CK_RV, C_Wra
33710 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
33720 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
33730 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
33740 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
33750 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
33760 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  hWrappingKey, CK
33770 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
33780 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
33790 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
337a0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72  _ULONG_PTR pulWr
337b0 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09  appedKeyLen) {..
337c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
337d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
337e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
337f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33810 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33820 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33830 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33840 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33850 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33870 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33880 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33890 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
338a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
338b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
338c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
338d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
338e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
338f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33900 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53  _UnwrapKey)(CK_S
33910 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
33920 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
33930 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
33940 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
33950 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e  ANDLE hUnwrappin
33960 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  gKey, CK_BYTE_PT
33970 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
33980 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65  K_ULONG ulWrappe
33990 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52  dKeyLen, CK_ATTR
339a0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
339b0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
339c0 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
339d0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
339e0 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
339f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33a00 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
33a10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
33a20 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
33a30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33a40 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
33a50 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
33a60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
33a70 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
33a80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
33a90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33aa0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
33ab0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33ac0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
33ad0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33ae0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
33af0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
33b00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33b10 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
33b20 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
33b30 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45  DeriveKey)(CK_SE
33b40 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
33b50 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
33b60 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
33b70 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
33b80 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43  NDLE hBaseKey, C
33b90 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
33ba0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
33bb0 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43  ONG ulAttributeC
33bc0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
33bd0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
33be0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
33bf0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
33c00 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
33c10 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
33c20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
33c30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
33c40 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
33c50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
33c60 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
33c70 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
33c80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33c90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
33ca0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
33cb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
33cc0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
33cd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33ce0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
33cf0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33d00 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
33d10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
33d20 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  RV, C_SeedRandom
33d30 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
33d40 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
33d50 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c  _BYTE_PTR pSeed,
33d60 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64   CK_ULONG ulSeed
33d70 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
33d80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
33d90 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
33da0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
33db0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
33dc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
33dd0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
33de0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
33df0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
33e00 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
33e10 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
33e20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
33e30 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
33e40 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
33e50 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
33e60 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33e70 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
33e80 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33e90 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
33ea0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
33eb0 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
33ec0 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  eRandom)(CK_SESS
33ed0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
33ee0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
33ef0 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b   pRandomData, CK
33f00 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c  _ULONG ulRandomL
33f10 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
33f20 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
33f30 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
33f40 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
33f50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
33f60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
33f70 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
33f80 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
33f90 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
33fa0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
33fb0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
33fc0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
33fd0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
33fe0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
33ff0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
34000 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
34010 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
34020 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34030 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44  PORTED);.}../* D
34040 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
34050 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
34060 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
34070 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
34080 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  tus)(CK_SESSION_
34090 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
340a0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
340b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
340c0 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
340d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
340e0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
340f0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
34100 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
34110 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
34120 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
34130 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
34140 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
34150 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
34160 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
34170 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
34180 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63   */.}../* Deprec
34190 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
341a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
341b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e  ION(CK_RV, C_Can
341c0 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f  celFunction)(CK_
341d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
341e0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
341f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34200 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
34210 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34220 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
34230 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
34240 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
34250 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
34260 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
34270 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
34280 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
34290 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
342a0 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
342b0 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
342c0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
342d0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
342e0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
342f0 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46  nctionList)(CK_F
34300 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
34310 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c  _PTR ppFunctionL
34320 69 73 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43  ist) {..static C
34330 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
34340 50 54 52 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69  PTR spFunctionLi
34350 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 46  st = NULL;..CK_F
34360 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
34370 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
34380 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34390 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
343a0 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69  ;...if (ppFuncti
343b0 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  onList == NULL) 
343c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
343d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
343e0 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69  ppFunctionList i
343f0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
34400 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
34410 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
34420 20 28 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   (spFunctionList
34430 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   != NULL) {...*p
34440 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
34450 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a  spFunctionList;.
34460 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34470 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
34480 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
34490 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
344a0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
344b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  .pFunctionList =
344c0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
344d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b  pFunctionList));
344e0 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
344f0 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  ->version.major 
34500 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
34510 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
34520 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
34530 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34540 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  >version.minor =
34550 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
34560 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
34570 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
34580 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34590 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43  C_Initialize = C
345a0 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46  _Initialize;..pF
345b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
345c0 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61  inalize = C_Fina
345d0 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
345e0 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20  List->C_GetInfo 
345f0 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46  = C_GetInfo;..pF
34600 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
34610 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47  etSlotList = C_G
34620 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75  etSlotList;..pFu
34630 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
34640 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65  tSlotInfo = C_Ge
34650 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e  tSlotInfo;..pFun
34660 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
34670 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65  TokenInfo = C_Ge
34680 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75  tTokenInfo;..pFu
34690 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61  nctionList->C_Wa
346a0 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d  itForSlotEvent =
346b0 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76   C_WaitForSlotEv
346c0 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ent;..pFunctionL
346d0 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e  ist->C_GetMechan
346e0 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d  ismList = C_GetM
346f0 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70  echanismList;..p
34700 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34710 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
34720 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
34730 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  mInfo;..pFunctio
34740 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b  nList->C_InitTok
34750 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e  en = C_InitToken
34760 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34770 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f  ->C_InitPIN = C_
34780 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  InitPIN;..pFunct
34790 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49  ionList->C_SetPI
347a0 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70  N = C_SetPIN;..p
347b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
347c0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f  OpenSession = C_
347d0 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46  OpenSession;..pF
347e0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
347f0 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f  loseSession = C_
34800 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70  CloseSession;..p
34810 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34820 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
34830 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73   = C_CloseAllSes
34840 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f  sions;..pFunctio
34850 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73  nList->C_GetSess
34860 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53  ionInfo = C_GetS
34870 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75  essionInfo;..pFu
34880 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
34890 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20  tOperationState 
348a0 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  = C_GetOperation
348b0 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  State;..pFunctio
348c0 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72  nList->C_SetOper
348d0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53  ationState = C_S
348e0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
348f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34900 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f  ->C_Login = C_Lo
34910 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  gin;..pFunctionL
34920 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20  ist->C_Logout = 
34930 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63  C_Logout;..pFunc
34940 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61  tionList->C_Crea
34950 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65  teObject = C_Cre
34960 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  ateObject;..pFun
34970 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70  ctionList->C_Cop
34980 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79  yObject = C_Copy
34990 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
349a0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f  onList->C_Destro
349b0 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74  yObject = C_Dest
349c0 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  royObject;..pFun
349d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
349e0 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47  ObjectSize = C_G
349f0 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70  etObjectSize;..p
34a00 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34a10 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
34a20 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75  e = C_GetAttribu
34a30 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74  teValue;..pFunct
34a40 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74  ionList->C_SetAt
34a50 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
34a60 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
34a70 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
34a80 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
34a90 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62  sInit = C_FindOb
34aa0 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e  jectsInit;..pFun
34ab0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
34ac0 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e  dObjects = C_Fin
34ad0 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63  dObjects;..pFunc
34ae0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
34af0 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43  ObjectsFinal = C
34b00 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61  _FindObjectsFina
34b10 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
34b20 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  t->C_EncryptInit
34b30 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74   = C_EncryptInit
34b40 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34b50 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f  ->C_Encrypt = C_
34b60 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74  Encrypt;..pFunct
34b70 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
34b80 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63  ptUpdate = C_Enc
34b90 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
34ba0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
34bb0 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45  cryptFinal = C_E
34bc0 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46  ncryptFinal;..pF
34bd0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
34be0 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44  ecryptInit = C_D
34bf0 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75  ecryptInit;..pFu
34c00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
34c10 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70  crypt = C_Decryp
34c20 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
34c30 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61  t->C_DecryptUpda
34c40 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70  te = C_DecryptUp
34c50 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
34c60 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46  List->C_DecryptF
34c70 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74  inal = C_Decrypt
34c80 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
34c90 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49  nList->C_DigestI
34ca0 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e  nit = C_DigestIn
34cb0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
34cc0 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43  st->C_Digest = C
34cd0 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74  _Digest;..pFunct
34ce0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
34cf0 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65  tUpdate = C_Dige
34d00 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  stUpdate;..pFunc
34d10 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
34d20 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74  stKey = C_Digest
34d30 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
34d40 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e  ist->C_DigestFin
34d50 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e  al = C_DigestFin
34d60 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
34d70 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d  st->C_SignInit =
34d80 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46   C_SignInit;..pF
34d90 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
34da0 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70  ign = C_Sign;..p
34db0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34dc0 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53  SignUpdate = C_S
34dd0 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ignUpdate;..pFun
34de0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
34df0 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46  nFinal = C_SignF
34e00 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
34e10 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
34e20 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  verInit = C_Sign
34e30 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46  RecoverInit;..pF
34e40 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
34e50 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53  ignRecover = C_S
34e60 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75  ignRecover;..pFu
34e70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
34e80 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72  rifyInit = C_Ver
34e90 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ifyInit;..pFunct
34ea0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
34eb0 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70  y = C_Verify;..p
34ec0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34ed0 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43  VerifyUpdate = C
34ee0 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  _VerifyUpdate;..
34ef0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34f00 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43  _VerifyFinal = C
34f10 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70  _VerifyFinal;..p
34f20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34f30 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
34f40 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  t = C_VerifyReco
34f50 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  verInit;..pFunct
34f60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
34f70 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72  yRecover = C_Ver
34f80 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75  ifyRecover;..pFu
34f90 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
34fa0 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
34fb0 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72  e = C_DigestEncr
34fc0 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
34fd0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
34fe0 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65  ryptDigestUpdate
34ff0 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67 65   = C_DecryptDige
35000 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  stUpdate;..pFunc
35010 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
35020 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
35030 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
35040 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
35050 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65  ist->C_DecryptVe
35060 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44  rifyUpdate = C_D
35070 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61  ecryptVerifyUpda
35080 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
35090 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65  st->C_GenerateKe
350a0 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  y = C_GenerateKe
350b0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
350c0 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  t->C_GenerateKey
350d0 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74  Pair = C_Generat
350e0 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63  eKeyPair;..pFunc
350f0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70  tionList->C_Wrap
35100 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b  Key = C_WrapKey;
35110 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35120 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43  >C_UnwrapKey = C
35130 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75  _UnwrapKey;..pFu
35140 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
35150 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69  riveKey = C_Deri
35160 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  veKey;..pFunctio
35170 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e  nList->C_SeedRan
35180 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64  dom = C_SeedRand
35190 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
351a0 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61  st->C_GenerateRa
351b0 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74  ndom = C_Generat
351c0 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74  eRandom;..pFunct
351d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75  ionList->C_GetFu
351e0 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43  nctionStatus = C
351f0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
35200 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  us;..pFunctionLi
35210 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63  st->C_CancelFunc
35220 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46  tion = C_CancelF
35230 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  unction;..pFunct
35240 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75  ionList->C_GetFu
35250 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47  nctionList = C_G
35260 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a  etFunctionList;.
35270 0a 09 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ..spFunctionList
35280 20 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73    = pFunctionLis
35290 74 3b 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c  t;..*ppFunctionL
352a0 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c  ist = pFunctionL
352b0 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ist;...CACKEY_DE
352c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
352d0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
352e0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
352f0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
35300 0a                                               .